К статье
Практический материал

Разработка и Конфигурация · 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 и открыв текст.

Сравнение вариантов обмена

Сериализатор XDTO

Подходит для одинаковых конфигураций и небольших объектов. Ограничение: не переносит данные объектов, только ссылки.

Конвертация данных

Подходит для разных конфигураций со сложными правилами сопоставления. Требует настройки правил обмена.

Ручная запись XML/JSON

Полный контроль формата, подходит для интеграции с внешними системами. Требует самостоятельной обработки типов.

Пошаговый пример: выгрузка и загрузка объекта

Рассмотрим практическую задачу: передать структуру с параметрами и ссылкой на контрагента из одной базы в другую с идентичной конфигурацией. Порядок действий одинаков для любых сериализуемых значений.

Порядок действий
  1. 1
    Сформируйте значение: структуру, ссылку или объект XDTO
  2. 2
    Создайте объект ЗаписьXML и установите строку или файл
  3. 3
    Запишите объявление XML методом ЗаписатьОбъявлениеXML
  4. 4
    Вызовите СериализаторXDTO.ЗаписатьXML с указанием значения
  5. 5
    Передайте полученную строку или файл в базу-приёмник
  6. 6
    В приёмнике создайте ЧтениеXML и вызовите ПрочитатьXML
  7. 7
    Проверьте, что ссылки восстановились и не стали битыми

Проверка результата обязательна. После чтения убедитесь, что восстановленная ссылка указывает на существующий объект: запросите у неё реквизит или проверьте через Ссылка.ПолучитьОбъект() с обработкой исключения. Пустая или битая ссылка — признак того, что объект отсутствует в приёмнике.

Контрольные точки

Как проверить результат

Ссылка после чтения
Норма

Реквизиты объекта доступны, GUID совпадает с источником

Тревожный признак

Ошибка при обращении к реквизитам или пустое представление

Структура XML
Норма

Открывается в редакторе, содержит ожидаемые узлы и типы

Тревожный признак

Обрыв документа, неизвестные пространства имён

Примитивные значения
Норма

Даты, числа и строки совпадают с исходными

Тревожный признак

Сдвиг дат, потеря дробной части, обрезанные строки

Типичные ошибки и как их избежать

Самая частая проблема — попытка сериализовать объект базы данных целиком, ожидая, что в приёмнике появится полная копия со всеми реквизитами. Сериализатор передаёт ссылку, а не данные. Если нужно перенести содержимое элемента справочника, выгружайте его реквизиты явно через структуру или объект XDTO.

Вторая группа ошибок связана с типами. При записи значения неопределённого типа или составного типа без указания назначения сериализатор может выбросить исключение. Решение — явно задавать назначение типа или приводить значения к конкретному типу перед записью.

Типичные ошибки
01
Ожидание переноса данных объекта вместе со ссылкой — в приёмнике появляется битая ссылка
02
Запись значения без назначения типа — ошибка сериализации на этапе ЗаписатьXML
03
Использование для массовой выгрузки — рост памяти и времени выполнения
04
Обмен между конфигурациями с разными версиями — несовпадение типов и потеря данных
05
Игнорирование проверки результата чтения — скрытые битые ссылки в данных

Третья ошибка — использование сериализатора для интеграции с внешними системами, ожидающими строгий формат. 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.