Разработка и Конфигурация · 11 мин
XDTO-пакеты в 1С: что это и как с ними работать
XDTO-пакеты в 1С: назначение, создание фабрики, сериализация объектов в XML, обмен данными с веб-сервисами, типичные ошибки и проверка результата.
XDTO-пакет (XML Data Transfer Objects) — это объект конфигурации 1С, который описывает модель данных для обмена в формате XML: типы, структуры, свойства и их ограничения. По сути, это аналог XML-схемы (XSD), встроенный прямо в конфигурацию. На основе XDTO-пакета платформа строит фабрику XDTO — механизм, который умеет превращать объекты 1С в XML-документы и обратно с проверкой типов.
Механизм появился как основа для веб-сервисов, но сегодня применяется гораздо шире: выгрузка и загрузка данных между базами, интеграция с внешними системами, работа с форматами обмена (EnterpriseData, CommerceML), передача структурированных данных без привязки к планам обмена. Понимание XDTO критично для любого разработчика, который строит интеграции на платформе 1С:Предприятие.
Главное преимущество XDTO перед ручным разбором XML — типизация и валидация. Если внешняя система прислала документ, не соответствующий схеме, фабрика выдаст понятную ошибку ещё на этапе чтения, а не в середине бизнес-логики. При этом разработчик работает с привычными объектами и свойствами, а не с узлами DOM-дерева.
Что такое XDTO-пакет и из чего он состоит
XDTO-пакет находится в дереве конфигурации в ветке «Общие» → «XDTO-пакеты». Каждый пакет имеет пространство имён (URI), которое уникально идентифицирует модель данных — аналогично namespace в XML-схемах. Внутри пакета описываются типы значений (аналоги простых типов: строки, числа, даты с ограничениями) и типы объектов (структуры со свойствами).
Тип объекта содержит набор свойств. У каждого свойства задаётся имя, тип, кратность (обязательное или необязательное, минимальное и максимальное количество вхождений) и значение по умолчанию. Свойство может ссылаться на простой тип, на другой объектный тип того же или другого пакета, либо быть списком. Это позволяет описывать иерархические документы любой вложенности.
Важно различать пакет и фабрику. Пакет — это статическое описание схемы в конфигураторе. Фабрика — рабочий объект в памяти, который используется в коде встроенного языка. Одна фабрика может объединять несколько пакетов, например когда сообщение одного формата вкладывается в конверт другого.
Где XDTO-пакеты применяются на практике
Первый и исторически основной сценарий — веб-сервисы 1С. Когда вы публикуете web-сервис, платформа автоматически генерирует WSDL-описание на основе XDTO-пакетов, указанных в свойствах сервиса. Внешняя система по WSDL понимает, какие операции доступны и какие структуры данных нужно передавать. Без XDTO-пакетов типизированный веб-сервис на 1С не построить.
Второй сценарий — обмен данными между базами 1С и с внешними системами. Типовые форматы EnterpriseData и CommerceML реализованы именно как XDTO-пакеты. Если нужно настроить нестандартную интеграцию — например, выгрузить заказы в собственном формате для логистического оператора — разработчик создаёт свой пакет и сериализует данные через фабрику.
Третий сценарий — чтение XML от внешних систем по известной XSD-схеме. Пакет можно импортировать из готового XSD-файла (кнопка «Импорт XML-схемы» в редакторе пакета), после чего входящие документы читаются строго по схеме. Это резко снижает количество ошибок разбора по сравнению с ручным чтением через ЧтениеXML.
Сравнение вариантов работы с XML
Подходит для типизированного обмена по схеме: веб-сервисы, интеграции, строгая валидация. Требует описания пакета, но убирает ручной разбор.
Потоковый разбор произвольного XML без схемы. Гибко и быстро для простых файлов, но вся проверка структуры — на разработчике.
Готовый механизм обмена с регистрацией изменений. Использует сериализацию внутри, но решает задачу репликации, а не произвольной интеграции.
Как создать XDTO-пакет в конфигураторе
Создание пакета начинается в дереве конфигурации: правый клик на ветке «XDTO-пакеты» → «Добавить». Обязательное поле — пространство имён, например http://mycompany.ru/exchange/orders. Используйте URI, который контролируете, чтобы избежать конфликтов имён при интеграции с чужими схемами.
Далее в редакторе пакета добавляются типы объектов и их свойства. Для каждого свойства укажите тип (встроенный из пространства http://www.w3.org/2001/XMLSchema или собственный), кратность и, при необходимости, фасеты: длину строки, шаблон, диапазон значений. Чем точнее схема, тем надёжнее валидация входящих данных.
- 1Создайте пакет в ветке «Общие» → «XDTO-пакеты», задайте уникальное пространство имён.
- 2Добавьте типы объектов и свойства, укажите типы, кратность и ограничения.
- 3Обновите конфигурацию базы данных — без этого фабрика не увидит новый пакет.
- 4Напишите тестовый код: создайте объект через фабрику, заполните свойства, запишите в XML.
- 5Выполните обратное чтение из XML и сверьте значения свойств.
- 6Проверьте валидацию: передайте заведомо некорректный XML и убедитесь, что фабрика выдаёт ошибку.
Если у вас уже есть XSD-схема от контрагента, не описывайте её вручную — используйте импорт. В редакторе пакета выберите «Импорт XML-схемы» и укажите файл. Платформа создаст типы автоматически, хотя иногда потребуется ручная доработка сложных конструкций вроде choice и расширений типов.
Как работать с фабрикой XDTO в коде
Работа в коде строится по одному шаблону: получить тип из фабрики, создать объект, заполнить свойства, записать в XML. Тип получают методом ФабрикаXDTO.Тип(ПространствоИмен, ИмяТипа), объект — методом ФабрикаXDTO.Создать(Тип). Свойства заполняются как обычные свойства объекта, списковые свойства — через метод Добавить().
ТипЗаказ = ФабрикаXDTO.Тип("http://mycompany.ru/exchange", "Заказ");
Заказ = ФабрикаXDTO.Создать(ТипЗаказ);
Заказ.Номер = "А-00125";
Заказ.Дата = ТекущаяДатаСеанса();
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Заказ);
ТекстXML = ЗаписьXML.Закрыть();Обратная операция — чтение. Создаётся объект ЧтениеXML, ему передаётся текст или файл, затем вызывается ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, Тип). Если тип не указан, фабрика попытается определить его сама по корневому элементу и пространству имён — но явное указание типа надёжнее и защищает от подмены структуры.
Для проверки объекта до записи используйте метод Проверить() объекта XDTO или ФабрикаXDTO.Проверить(Объект). Он выявит нарушения обязательности свойств, типов и ограничений. Проверять стоит всегда перед отправкой данных внешней системе — дешевле поймать ошибку локально, чем разбирать отказ удалённой стороны.
Типичные ошибки и ограничения механизма
Самая частая ошибка — несовпадение пространства имён. Если в XML-документе namespace отличается от указанного в пакете хотя бы символом (включая регистр и завершающий слэш), фабрика не найдёт тип и выдаст ошибку «Ошибка разбора XML». При интеграциях всегда сверяйте фактический namespace в присланном файле со схемой.
Вторая группа проблем — даты, числа и пустые значения. XML не знает про «пустую ссылку» 1С: незаполненное обязательное свойство приведёт к ошибке валидации. Даты сериализуются в формат ISO 8601, и если внешняя система ждёт другой формат, придётся передавать дату строкой с явным преобразованием. Числа с разделителями групп или локальными форматами — ещё один источник сбоев.
Из ограничений: XDTO не поддерживает произвольные графы объектов с циклическими ссылками — только деревья. Производительность фабрики ниже, чем у потокового ЧтениеXML, поэтому для разбора гигантских файлов без строгой схемы XDTO может быть неоптимален. Также часть экзотических конструкций XSD (некоторые виды наследования, anyType с произвольным содержимым) импортируется с ограничениями.
Как проверить, что обмен через XDTO работает правильно
Базовая проверка — круговой тест: создать объект, записать в XML, прочитать обратно и сравнить значения всех свойств. Если на каком-то свойстве значение потерялось или изменилось (типично для дат и чисел с плавающей точкой), проблема в типе свойства или его ограничениях.
Как проверить результат
ФабрикаXDTO.Создать() возвращает объект, свойства доступны по именам из схемы
Ошибка «тип не найден» — проверьте пространство имён и обновление конфигурации
XML содержит все заполненные свойства, корневой элемент с правильным namespace
Свойства отсутствуют — проверьте кратность и заполнение списков
ПрочитатьXML возвращает объект того же типа, значения совпадают
Ошибка валидации — сверить namespace, обязательные поля и форматы дат
Метод Проверить() проходит без ошибок для корректного объекта
Сообщения о нарушении ограничений — уточнить фасеты типов в пакете
Для интеграций с внешними системами полезно сохранять образцы реальных сообщений и прогонять их через чтение фабрикой в тестовой базе. Это быстро выявляет расхождения схемы с фактическими данными контрагента — например, необязательное по схеме поле, которое партнёр всегда присылает, или значение, не укладывающееся в ограничение длины.
FAQ: частые вопросы об XDTO-пакетах
Чем XDTO отличается от плана обмена?
План обмена — механизм репликации данных между базами с регистрацией изменений, узлами и номерами сообщений. XDTO-пакет — только описание формата данных и средство сериализации. Они решают разные задачи и могут использоваться вместе: план обмена определяет, что и куда отправлять, а формат сообщения может быть построен на XDTO.
Можно ли использовать XDTO без создания пакета в конфигурации?
Да. Фабрику можно построить программно из XSD-схемы, загруженной из файла или строки, с помощью объекта СхемаXML и конструктора фабрики. Это удобно, когда схема часто меняется или поставляется внешней системой динамически, но усложняет поддержку кода.
Почему фабрика не находит тип, хотя пакет создан?
Чаще всего конфигурация базы данных не обновлена после изменения пакета — глобальная фабрика строится по сохранённой в БД конфигурации. Вторая причина — несовпадение пространства имён в вызове ФабрикаXDTO.Тип() с тем, что указано в свойствах пакета. Проверьте оба момента.
Как передать через XDTO таблицу значений или массив?
Напрямую — никак: XDTO оперирует только типами, описанными в пакете. Создайте объектный тип со списковым свойством (кратность 0.. или 1..) и перенесите строки таблицы в элементы этого списка. При чтении выполните обратное преобразование в таблицу значений.
Подходит ли XDTO для обмена большими файлами?
Фабрика XDTO загружает документ в память целиком, поэтому для файлов в сотни мегабайт это рискованно по памяти и скорости. Для больших объёмов лучше потоковое чтение через ЧтениеXML с построчной обработкой, а XDTO использовать для отдельных порций данных или заголовков.
Как версионировать формат обмена при его изменении?
Принятая практика — включать версию в пространство имён пакета, например .../exchange/v2. Старый пакет остаётся для обработки сообщений прежнего формата, новый работает параллельно. Так обе стороны интеграции могут мигрировать на новую версию не одновременно.
Что важно запомнить
XDTO-пакет описывает модель данных для XML-обмена, а фабрика XDTO сериализует и десериализует объекты с проверкой типов. Механизм — основа веб-сервисов и типизированных интеграций в 1С. Ключевые правила: следите за пространством имён, обновляйте конфигурацию БД после изменения пакета, проверяйте объекты методом Проверить и не меняйте действующие схемы без версионирования.