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

Разработка и Конфигурация · 10 мин

XDTO-пакеты в 1С: что это такое и как их использовать

XDTO-пакеты в 1С: назначение, структура, создание и использование для обмена данными. Практические примеры сериализации, типичные ошибки и ответы на вопросы.

XDTO-пакет (XML Data Transfer Objects) — это объект конфигурации 1С, который описывает структуру данных для обмена через XML: какие типы объектов существуют, какие у них свойства, какого они типа и какие значения допустимы. По сути, XDTO-пакет — это схема данных, импортированная из XSD-файла или созданная вручную, на основе которой платформа умеет сериализовать объекты в XML и обратно.

Главная задача механизма — избавить разработчика от ручного разбора XML. Вместо того чтобы построчно читать файл через ЧтениеXML и сопоставлять теги с реквизитами, вы описываете структуру один раз в XDTO-пакете, а платформа сама проверяет типы, обязательность полей и вложенность. Это резко снижает количество ошибок при интеграциях.

XDTO-пакеты лежат в основе большинства типовых механизмов обмена: веб-сервисов 1С, Enterprise Data Exchange, обменов с сайтами по CommerceML, взаимодействия с государственными сервисами (ФНС, ФСС, ЕГАИС). Практически любая современная интеграция 1С через XML так или иначе опирается на этот механизм.

Из чего состоит XDTO-пакет

Пакет XDTO находится в ветке конфигуратора «Общие → XDTO-пакеты». Каждый пакет имеет имя и пространство имён (namespace) — уникальный URI, который отличает его типы от типов других пакетов. Именно пространство имён попадает в XML-документ и позволяет платформе понять, по какой схеме читать данные.

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

Типы могут наследоваться: объектный тип расширяет базовый, добавляя свои свойства. Это удобно для моделирования сложных форматов, где, например, «Товар» и «Услуга» наследуют общий тип «ПозицияДокумента» с общими полями цены и количества.

Как создать XDTO-пакет в конфигураторе

Есть два пути. Первый — импорт готовой XSD-схемы: в конфигураторе откройте список XDTO-пакетов, вызовите контекстное меню и выберите «Импорт XML-схемы», укажите XSD-файл. Платформа создаст пакет с типами, соответствующими схеме. Так обычно поступают при интеграции с внешними системами, у которых уже есть формальная спецификация формата.

Второй путь — создание пакета вручную через конструктор. Вы добавляете типы значений и типы объектов, задаёте свойства, их типы и кратность. Этот вариант подходит, когда формат проектируется «с нуля» под собственный обмен между двумя базами 1С.

Создание пакета вручную
  1. 1
    В конфигураторе откройте Общие → XDTO-пакеты и добавьте новый пакет
  2. 2
    Задайте имя и пространство имён пакета
  3. 3
    Добавьте типы значений для простых полей (строки с ограничением длины, даты, перечисления)
  4. 4
    Добавьте типы объектов и опишите их свойства, указав тип и кратность каждого свойства
  5. 5
    Сохраните конфигурацию и проверьте пакет, создав тестовый объект в коде

Работа с XDTO в коде: сериализация и десериализация

Основной сценарий — создать объект XDTO, заполнить его данными и записать в XML. Объект создаётся через фабрику XDTO: сначала получаете тип из пакета по имени, затем создаёте объект этого типа и заполняете свойства. Платформа контролирует типы на лету: присвоить строковому свойству число без приведения не получится.

Запись в XML выполняется через объект ЗаписьXML с указанием фабрики и пространства имён. Обратная операция — чтение: ЧтениеXML в связке с ФабрикаXDTO.ПрочитатьXML() возвращает готовый объект XDTO, у которого можно читать свойства как у обычной структуры, но с контролем типов и обязательности.

bsl
// Запись объекта в XML
Пакет = ФабрикаXDTO.Пакеты.Получить("http://mycompany.ru/exchange");
ТипЗаказ = Пакет.Получить("Заказ");
Заказ = ФабрикаXDTO.Создать(ТипЗаказ);
Заказ.Номер = "А-1024";
Заказ.Дата = ТекущаяДатаСеанса();

Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
ФабрикаXDTO.ЗаписатьXML(Запись, Заказ, , , , НазначениеТипаXML.Явное);
СтрокаXML = Запись.Закрыть();

Для чтения XML, пришедшего извне, достаточно знать, что пространство имён документа совпадает с пространством имён одного из пакетов конфигурации (или глобальной фабрики). Если схема не совпадёт с фактическим XML — например, пришло неизвестное свойство или нарушен порядок элементов, — платформа выдаст ошибку валидации, что и является защитой от некорректных данных.

Фабрика XDTO: глобальная и собственная

Фабрика XDTO — это объект, который «знает» набор пакетов и умеет создавать их объекты. Глобальная фабрика (ФабрикаXDTO) автоматически включает все XDTO-пакеты конфигурации, поэтому в большинстве случаев отдельно ничего настраивать не нужно.

Собственная фабрика создаётся функцией СоздатьФабрикуXDTO() на основе XSD-схемы, загруженной прямо в коде, или набора пакетов. Это нужно, когда схема хранится не в конфигурации, а во внешнем файле или макете, либо когда разные обмены требуют разных версий схемы с одинаковыми пространствами имён — глобальная фабрика такой конфликт не разрешит.

Где XDTO-пакеты применяются на практике

Самая частая область — веб-сервисы. При публикации web-сервиса 1С автоматически формирует WSDL-описание на основе XDTO-пакетов, указанных в свойствах сервиса. Внешняя система получает контракт, генерирует по нему клиентский код, а 1С сериализует параметры и возвращаемые значения через те же пакеты.

Второй сценарий — файловые обмены: выгрузка заказов на сайт по CommerceML, обмен с банками, отправка отчётности. Типовые конфигурации содержат десятки предопределённых пакетов для таких форматов, и при доработке обмена вы обычно расширяете существующий пакет, а не создаёте новый.

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

Чем заменить XDTO

Ручной разбор через ЧтениеXML

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

JSON через ЧтениеJSON

Подходит для REST-интеграций, где формат JSON; для XML-схем с валидацией не заменяет XDTO

XDTO-пакеты

Подходят для XML-обменов с формальной схемой: контроль типов, валидация, поддержка WSDL; требуют актуальности схемы

Типичные ошибки и ограничения

Чаще всего проблемы возникают из-за рассинхронизации схемы и реальных данных. Внешняя система добавила поле, а пакет в конфигурации не обновили — чтение падает с ошибкой о неизвестном свойстве. Лечится импортом актуальной XSD или доработкой пакета вручную.

Вторая группа ошибок — работа с необязательными и множественными свойствами. Если свойство не заполнено, обращение к нему вернёт Неопределено, а не пустую строку, и код без проверки упадёт. Множественные свойства возвращаются как список XDTO, даже если элемент один, — обращаться к нему нужно через индекс или цикл, а не напрямую.

Также учитывайте ограничения: XDTO описывает только XML, для JSON нужен другой механизм; схемы с рекурсивными или очень развитыми структурами могут заметно нагружать память при чтении больших файлов — в таких случаях иногда эффективнее потоковое чтение через ЧтениеXML.

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

Как проверить, что обмен работает корректно

Минимальная проверка — записать объект в строку XML и убедиться, что документ содержит все ожидаемые элементы с правильным пространством имён. Затем прочитать эту же строку обратно через фабрику и сверить значения свойств с исходными: это быстрый тест сериализации в обе стороны без внешних систем.

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

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

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

Чтение тестового XML фабрикой
Норма

Объект создан, свойства доступны, ошибок нет

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

Ошибка о неизвестном свойстве или типе — схема не совпадает с данными

Пространство имён в записанном XML
Норма

Совпадает с пространством имён пакета

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

Пустое или чужое пространство — внешняя система не распознает документ

Обязательные свойства объекта
Норма

Все заполнены перед записью

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

Запись падает или внешняя система отклоняет документ

Частые вопросы об XDTO-пакетах

Чем XDTO-пакет отличается от плана обмена?

План обмена описывает, какие объекты базы участвуют в обмене и куда они отправляются (узлы, регистрация изменений). XDTO-пакет описывает только формат данных — структуру XML. В обменах они дополняют друг друга: план обмена решает «что и куда», XDTO-пакет — «в каком виде».

Можно ли использовать XDTO без импорта XSD-схемы?

Да. Пакет можно создать полностью вручную в конфигураторе, описав типы значений и объектов. Импорт XSD — лишь удобный способ перенести готовую схему, а не обязательное условие.

Почему при чтении XML возникает ошибка «Неизвестное свойство»?

В XML присутствует элемент, которого нет в описании типа объекта в пакете. Обычно это значит, что внешняя система изменила формат, а пакет не обновили. Решение — импортировать актуальную XSD или добавить свойство в тип объекта вручную.

Как обработать свойство, которое может отсутствовать в XML?

Проверяйте его на Неопределено перед использованием или применяйте метод Установлено() у объекта XDTO — он показывает, было ли свойство явно заполнено. Для множественных свойств проверяйте Количество() у списка.

Подходит ли XDTO для обмена через JSON?

Нет, механизм XDTO работает только с XML. Для JSON используются ЧтениеJSON/ЗаписьJSON с разбором в структуры или соответствия. Если контрагент перешёл на JSON, XDTO-пакет придётся заменить отдельным кодом преобразования.

Итог

Что важно запомнить

XDTO-пакет — это схема XML-данных в конфигурации 1С, обеспечивающая сериализацию, десериализацию и валидацию. Создаётся импортом XSD или вручную, используется через фабрику XDTO. Главные риски — рассинхронизация схемы с реальными данными и ошибки при работе с необязательными и множественными свойствами.