Разработка и Конфигурация · 9 мин
XDTO в 1С: что это и как с ним работать
Что такое XDTO в 1С: механизм сериализации данных в XML, пакеты XDTO, фабрика, обмен с веб-сервисами. Практические примеры, ошибки и советы разработчику.
XDTO (XML Data Transfer Objects) — это встроенный в платформу 1С:Предприятие механизм для описания, передачи и чтения данных в формате XML. По сути, это способ превратить объект конфигурации (документ, справочник, структуру) в XML-документ и обратно, не выдумывая собственный формат обмена. Механизм работает на уровне платформы, поэтому доступен в любой конфигурации без подключения внешних библиотек.
Основная задача XDTO — обеспечить обмен данными между 1С и внешними системами: веб-сервисами, другими базами 1С, банковскими клиентами, сайтами, государственными порталами. Когда вы настраиваете обмен с ЭДО, загружаете выписку из банка или публикуете веб-сервис, с высокой вероятностью внутри работает именно XDTO.
В отличие от «ручного» разбора XML через ЧтениеXML, XDTO опирается на схему данных (XSD): платформа знает, какие поля, типы и структуры допустимы, и проверяет соответствие автоматически. Это снижает количество ошибок при обмене, но требует понимания того, как устроены пакеты XDTO и фабрика.
Из чего состоит механизм XDTO
Механизм включает несколько связанных понятий, которые нужно различать. Пакет XDTO — это описание модели данных: типы объектов, их свойства, типы значений (строки, числа, даты, ссылки на другие типы). Пакет создаётся в конфигураторе в ветке «Общие — XDTO-пакеты» либо формируется платформой автоматически, например для описания объектов самой конфигурации.
Фабрика XDTO — это объект встроенного языка, который «умеет» создавать и читать объекты по описанию из пакетов. Глобальная фабрика (ФабрикаXDTO) содержит все пакеты конфигурации плюс системные пакеты платформы. Можно создать и собственную фабрику из файла схемы XSD, если нужно работать со сторонним форматом, не добавляя его в конфигурацию.
Объект XDTO — это экземпляр данных, созданный по типу из пакета. Значение XDTO — простое значение (строка, число, дата). Разница важна: у объекта есть свойства, а значение — это просто данные без структуры.
Где XDTO применяется на практике
Самый массовый сценарий — веб-сервисы. Когда вы публикуете веб-сервис 1С, платформа автоматически строит WSDL-описание на основе XDTO-пакетов, а входящие и исходящие SOAP-сообщения разбираются и формируются через фабрику. То же происходит при вызове внешних веб-сервисов через WS-ссылки: платформа импортирует WSDL и создаёт пакеты XDTO по её схемам.
Второй сценарий — универсальный формат обмена EnterpriseData, который используется для синхронизации между конфигурациями 1С (например, между ERP и Бухгалтерией) и с сайтами. Сообщения этого формата — XML-документы, обрабатываемые через XDTO. Также XDTO работает «под капотом» планов обмена и типовых механизмов обмена с банками и ЭДО.
Третий сценарий — собственные интеграции. Если партнёр прислал XSD-схему своего формата, вы создаёте по ней пакет XDTO и пишете код чтения и записи документов без ручного разбора тегов.
Как сериализовать объект в XML и обратно
Базовый приём — записать объект конфигурации в XML через фабрику. Платформа умеет представлять ссылки и объекты базы в системных типах XDTO, поэтому код получается коротким: создаётся ЗаписьXML, вызывается метод ФабрикаXDTO.ЗаписатьXML, и на выходе получается строка или файл.
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(Запись, СсылкаНаДокумент);
СтрокаXML = Запись.Закрыть();Обратная операция — чтение: создаётся ЧтениеXML, вызывается ФабрикаXDTO.ПрочитатьXML, и возвращается либо объект конфигурации, либо объект XDTO — в зависимости от того, по какому типу записаны данные. Если данные записаны по типу из пользовательского пакета, вы получите ОбъектXDTO, из которого значения читаются через свойства.
Для произвольных структур данных, которым не соответствует объект базы, создают объект XDTO вручную: получают тип из пакета методом ФабрикаXDTO.Тип, создают объект через ФабрикаXDTO.Создать, заполняют свойства и записывают. Перед записью полезно вызвать метод Проверить() у объекта — он сверит заполнение с ограничениями схемы.
- 1Создайте XDTO-пакет в конфигураторе и опишите в нём типы объектов и свойств.
- 2В коде получите тип: Тип = ФабрикаXDTO.Тип("http://ваше-пространство", "Заказ").
- 3Создайте объект: Объект = ФабрикаXDTO.Создать(Тип) и заполните его свойства.
- 4Вызовите Объект.Проверить() для контроля обязательных полей.
- 5Запишите объект через ЗаписьXML и ФабрикаXDTO.ЗаписатьXML, сохраните результат.
XDTO против ручного разбора XML
Выбор между XDTO и низкоуровневым ЧтениеXML зависит от задачи. XDTO выигрывает, когда есть формальная схема данных и нужен контроль типов: платформа сама проверит обязательность полей, преобразует даты и числа, подскажет ошибку структуры. Код получается компактнее и устойчивее к мелким изменениям формата.
Ручной разбор через ЧтениеXML оправдан, когда схемы нет, формат нестабилен или документ огромный и его нельзя целиком загружать в память. Объект XDTO строится в памяти полностью, поэтому для файлов в сотни мегабайт потоковое чтение может быть единственным рабочим вариантом.
Выбор подхода к работе с XML
Подходит, когда есть XSD-схема, нужны контроль типов и компактный код. Ограничение: весь документ загружается в память.
Подходит для больших файлов, нестабильных форматов и потоковой обработки. Требует вручную описывать разбор каждого узла.
Используется для преобразования объектов конфигурации (ссылок, документов) в объекты XDTO и обратно в планах обмена.
Типичные ошибки и ограничения
Самая частая проблема — несовпадение пространств имён. Если при чтении XML пространство имён в файле отличается от объявленного в пакете, фабрика не найдёт тип и выдаст ошибку обнаружения неизвестного элемента. Проверяйте атрибут xmlns в корневом элементе файла и сопоставляйте с URI пакета.
Вторая типичная ситуация — ошибки проверки типов: строка длиннее ограничения, число вне диапазона, незаполненное обязательное свойство. Фабрика сообщает об этом при записи или при вызове Проверить(). Лечится корректным заполнением данных, а не отключением проверок.
Третья группа ошибок связана с производительностью: попытка сериализовать огромные таблицы значений одним объектом приводит к росту памяти и тайм-аутам веб-сервисов. В таких случаях данные разбивают на порции или передают ссылки на выгрузку.
Как проверить, что обмен работает правильно
Начинайте отладку с сохранения фактического XML: запишите сформированный документ в файл и откройте в текстовом редакторе. Сверьте пространства имён, имена элементов и вложенность со схемой пакета — большинство проблем видно невооружённым глазом.
Для веб-сервисов полезно протестировать вызов внешним инструментом (например, отправкой SOAP-запроса из тестового клиента), чтобы отделить ошибки формирования XML от ошибок транспорта и авторизации. Если сервис отвечает корректно на внешний запрос, проблема в коде вызывающей стороны.
Как проверить результат
Документ читается без ошибок, значения совпадают с исходными
Ошибка типа или пространства имён при чтении
Метод Проверить() завершается без исключения
Сообщение о незаполненном или некорректном свойстве
Ответ возвращается в ожидаемом типе, поля заполнены
SOAP-ошибка или пустые поля при успешном вызове
Частые вопросы по XDTO в 1С
Чем XDTO отличается от обычного XML?
XML — это просто текстовый формат. XDTO — надстройка платформы, которая связывает XML-документ со схемой: проверяет типы, обязательность полей и преобразует данные в объекты встроенного языка. Работая через XDTO, вы оперируете объектами и свойствами, а не тегами.
Нужно ли создавать пакет XDTO вручную для веб-сервиса?
Обычно нет. При создании веб-сервиса и WS-ссылок платформа формирует пакеты автоматически из WSDL. Ручное создание требуется для собственных форматов обмена, когда схему задаёте вы или партнёр прислал XSD-файл.
Можно ли использовать XDTO без добавления пакета в конфигурацию?
Да. Можно создать отдельную фабрику из файла схемы средствами встроенного языка и работать через неё. Это удобно для разовых загрузок и для форматов, которые не должны храниться в конфигурации.
Почему фабрика не читает корректный на вид XML?
Чаще всего из-за несовпадения пространства имён или регистра имён элементов: XDTO чувствителен к точному соответствию схеме. Сравните xmlns и имена элементов в файле с описанием пакета, включая регистр символов.
Подходит ли XDTO для обмена большими файлами?
С ограничениями. Объект XDTO строится целиком в памяти, поэтому очень большие документы лучше передавать порциями или обрабатывать потоковым ЧтениеXML. Для типовых документов и справочников объёмов XDTO достаточно.
Что такое СериализаторXDTO и когда он нужен?
Это объект, который преобразует объекты базы (ссылки, документы, записи регистров) в объекты XDTO и обратно. Он применяется в планах обмена и там, где нужно передать данные конфигурации через XML, сохранив их связь с типами метаданных.
Что важно запомнить
XDTO — штатный механизм платформы 1С для обмена данными в XML по схеме: пакеты описывают типы, фабрика создаёт и читает объекты. Он лежит в основе веб-сервисов, планов обмена и интеграций. Контролируйте пространства имён, проверяйте объекты перед записью и не передавайте огромные объёмы одним документом.