Разработка и Конфигурация · 11 мин
Сериализатор XDTO в 1С: что это и как работать с ним
Сериализатор XDTO в 1С: что это, как работает запись и чтение объектов в XML, типичные ошибки и практические примеры кода для разработчика.
Сериализатор XDTO — это встроенный глобальный объект платформы 1С:Предприятие, который преобразует данные между объектами XDTO (XML Data Transfer Objects) и XML-документами. Проще говоря, он умеет «упаковать» значение в XML-файл и «распаковать» его обратно, сохраняя типы данных, структуру и связи между объектами.
Механизм XDTO появился как универсальный способ обмена данными между конфигурациями 1С и внешними системами: веб-сервисами, другими информационными базами, сторонними приложениями. В отличие от ручного формирования XML через ЗаписьXML, сериализатор сам следит за соответствием типов схеме и умеет работать со ссылками на объекты базы данных.
Разработчик сталкивается с сериализатором XDTO в трёх типовых сценариях: создание универсальных обменов через планы обмена, выгрузка произвольных данных в XML без жёсткой схемы и работа с веб-сервисами, где пакеты XDTO описывают контракт обмена. Понимание того, как устроен сериализатор, помогает избежать потери данных и ошибок несовпадения типов.
Что такое XDTO и зачем нужен сериализатор
XDTO (XML Data Transfer Objects) — механизм платформы 1С для описания и передачи данных в формате XML. В основе лежит пакет XDTO — описание типов и структуры данных по правилам XML Schema. На базе пакета создаются объекты XDTO: фабрика XDTO позволяет создавать значения, проверять их по схеме и заполнять поля типизированным образом.
Сериализатор XDTO — это дополнительный уровень над фабрикой. Он умеет автоматически превращать в XML не только объекты XDTO, но и «родные» данные конфигурации: ссылки на справочники и документы, значения перечислений, примитивные типы, структуры и даже наборы записей. При обратном чтении сериализатор восстанавливает ссылки по уникальным идентификаторам, если объект существует в базе-приёмнике.
Ключевое отличие от ручной записи XML: сериализатор сам решает, как представить ссылку на документ, как записать дату или двоичные данные, и при чтении проверяет, существует ли объект в базе. Это снимает с разработчика значительную часть рутинной работы, но требует понимания ограничений механизма.
Как вызвать сериализатор: базовый синтаксис
Сериализатор доступен в любом модуле как глобальное свойство СериализаторXDTO. Два основных метода — ЗаписатьXML и ПрочитатьXML. Первый принимает объект записи XML, значение и, при необходимости, назначение типа. Второй читает из объекта чтения XML и возвращает восстановленное значение.
Типичный фрагмент выгрузки ссылки на элемент справочника в строку XML выглядит так: создаётся объект ЗаписьXML, устанавливается строка, записывается объявление XML, затем вызывается метод сериализатора. Для чтения выполняется зеркальная последовательность через ЧтениеXML.
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Запись.ЗаписатьОбъявлениеXML();
СериализаторXDTO.ЗаписатьXML(Запись, СсылкаНаОбъект);
СтрокаXML = Запись.Закрыть();
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
ВосстановленноеЗначение = СериализаторXDTO.ПрочитатьXML(Чтение);
Чтение.Закрыть();
Обратите внимание: для записи произвольного значения часто требуется указать назначение типа — параметр, подсказывающий сериализатору, какой тип XDTO использовать. Без него для некоторых типов платформа выдаст ошибку «Неизвестный тип».
Что умеет и чего не умеет сериализатор
Сериализатор XDTO корректно обрабатывает примитивные типы (строка, число, дата, булево), ссылки на объекты конфигурации, перечисления, структуры, соответствия, массивы и таблицы значений. Ссылки записываются с указанием типа объекта и его уникального идентификатора, что позволяет при чтении найти тот же объект в другой базе.
Ограничения существенны. Сериализатор не переносит сами объекты с их данными — только ссылки. Если в базе-приёмнике элемента с таким GUID нет, при чтении будет получена «битая» ссылка. Движения документов, сложные вложенные объекты метаданных и некоторые служебные типы также не сериализуются напрямую.
Ещё одна граница — производительность. Сериализация больших массивов данных через XDTO заметно медленнее и требует больше памяти, чем специализированные форматы. Для выгрузки миллионов записей механизм не предназначен: он ориентирован на передачу отдельных объектов и небольших пакетов.
Типовые сценарии применения
Универсальный обмен между идентичными конфигурациями
В планах обмена платформа использует сериализатор для передачи данных между узлами распределённой базы. Разработчик может использовать тот же подход вручную: записать ссылку или объект в XML на стороне источника и прочитать в приёмнике с идентичной конфигурацией. Это работает надёжно, потому что типы и идентификаторы совпадают.
Передача параметров в веб-сервисы
При публикации веб-сервиса 1С параметры операций описываются типами XDTO. Внутри кода операции сериализатор помогает упаковать сложные возвращаемые структуры — например, таблицу значений с результатами запроса — в формат, понятный вызывающей стороне.
Временное хранение и отладка
Сериализация в строку удобна для сохранения состояния объектов в хранилище значений, передачи данных между сеансами и фоновыми заданиями, а также для отладочной выгрузки: быстро посмотреть, что содержит структура или ссылка, можно, записав её в XML и открыв текст.
Сравнение вариантов обмена
Подходит для одинаковых конфигураций и небольших объектов. Ограничение: не переносит данные объектов, только ссылки.
Подходит для разных конфигураций со сложными правилами сопоставления. Требует настройки правил обмена.
Полный контроль формата, подходит для интеграции с внешними системами. Требует самостоятельной обработки типов.
Пошаговый пример: выгрузка и загрузка объекта
Рассмотрим практическую задачу: передать структуру с параметрами и ссылкой на контрагента из одной базы в другую с идентичной конфигурацией. Порядок действий одинаков для любых сериализуемых значений.
- 1Сформируйте значение: структуру, ссылку или объект XDTO
- 2Создайте объект ЗаписьXML и установите строку или файл
- 3Запишите объявление XML методом ЗаписатьОбъявлениеXML
- 4Вызовите СериализаторXDTO.ЗаписатьXML с указанием значения
- 5Передайте полученную строку или файл в базу-приёмник
- 6В приёмнике создайте ЧтениеXML и вызовите ПрочитатьXML
- 7Проверьте, что ссылки восстановились и не стали битыми
Проверка результата обязательна. После чтения убедитесь, что восстановленная ссылка указывает на существующий объект: запросите у неё реквизит или проверьте через Ссылка.ПолучитьОбъект() с обработкой исключения. Пустая или битая ссылка — признак того, что объект отсутствует в приёмнике.
Как проверить результат
Реквизиты объекта доступны, GUID совпадает с источником
Ошибка при обращении к реквизитам или пустое представление
Открывается в редакторе, содержит ожидаемые узлы и типы
Обрыв документа, неизвестные пространства имён
Даты, числа и строки совпадают с исходными
Сдвиг дат, потеря дробной части, обрезанные строки
Типичные ошибки и как их избежать
Самая частая проблема — попытка сериализовать объект базы данных целиком, ожидая, что в приёмнике появится полная копия со всеми реквизитами. Сериализатор передаёт ссылку, а не данные. Если нужно перенести содержимое элемента справочника, выгружайте его реквизиты явно через структуру или объект XDTO.
Вторая группа ошибок связана с типами. При записи значения неопределённого типа или составного типа без указания назначения сериализатор может выбросить исключение. Решение — явно задавать назначение типа или приводить значения к конкретному типу перед записью.
Третья ошибка — использование сериализатора для интеграции с внешними системами, ожидающими строгий формат. XML, который формирует платформа, содержит служебные пространства имён и представления типов 1С. Внешняя система такой формат, скорее всего, не поймёт: для неё нужна ручная запись XML или JSON по согласованной схеме.
Альтернативы сериализатору XDTO
Для обмена между разными конфигурациями стандартным инструментом остаётся Конвертация данных с правилами обмена: она умеет сопоставлять объекты с разными именами и структурой, искать по произвольным полям и переносить данные, а не только ссылки. Для интеграции с внешними системами чаще применяют JSON через объекты ЗаписьJSON и ЧтениеJSON — формат компактнее и понятен любой платформе.
Для передачи снимков данных между сеансами внутри одной базы подходит ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр — внутренний формат платформы, быстрый и компактный, но нечитаемый и непереносимый между версиями платформы. Выбор инструмента зависит от задачи: совместимость, объём, читаемость и скорость.
Перед промышленным использованием сериализатора проверьте обмен на копии базы с реальными данными: именно там всплывают битые ссылки и несовпадения типов, невидимые на тестовых примерах.
Частые вопросы
Чем сериализатор XDTO отличается от фабрики XDTO?
Фабрика XDTO создаёт и проверяет объекты XDTO по схеме пакета — это работа с типами и структурами. Сериализатор — надстройка, которая дополнительно умеет превращать в XML данные конфигурации: ссылки, перечисления, структуры. Фабрика работает с абстрактными типами, сериализатор — с конкретными данными базы.
Переносит ли сериализатор данные объекта вместе со ссылкой?
Нет. Записывается только ссылка: тип объекта и уникальный идентификатор. Реквизиты, табличные части и движения не передаются. Для переноса содержимого объекта выгружайте его поля в структуру или объект XDTO и заполняйте объект в приёмнике вручную.
Можно ли использовать сериализатор для обмена с сайтом или внешней системой?
Технически XML будет сформирован, но внешняя система не поймёт служебные пространства имён и представления типов 1С. Для внешних интеграций формируйте XML или JSON вручную по согласованной схеме либо используйте пакеты XDTO с собственной схемой.
Почему при чтении возникает ошибка «Неизвестный тип»?
Чаще всего при чтении XML, записанного без назначения типа, либо при несовпадении конфигураций источника и приёмника. Убедитесь, что тип объекта существует в обеих базах, а при записи указывайте назначение типа явно.
Подходит ли сериализатор для выгрузки больших объёмов данных?
Нет. Механизм создаёт в памяти полное представление данных и формирует развёрнутый XML, что при больших объёмах приводит к расходу памяти и медленной работе. Для массовых выгрузок используйте пакетную запись XML или специализированные форматы.
Что важно запомнить
Сериализатор XDTO преобразует данные 1С в XML и обратно, сохраняя типы и ссылки. Он передаёт ссылки, а не данные объектов, рассчитан на одинаковые конфигурации и небольшие объёмы. Для разных конфигураций — конвертация данных, для внешних систем — ручной XML или JSON.