Разработка и Конфигурация · 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В конфигураторе откройте Общие → XDTO-пакеты и добавьте новый пакет
- 2Задайте имя и пространство имён пакета
- 3Добавьте типы значений для простых полей (строки с ограничением длины, даты, перечисления)
- 4Добавьте типы объектов и опишите их свойства, указав тип и кратность каждого свойства
- 5Сохраните конфигурацию и проверьте пакет, создав тестовый объект в коде
Работа с XDTO в коде: сериализация и десериализация
Основной сценарий — создать объект XDTO, заполнить его данными и записать в XML. Объект создаётся через фабрику XDTO: сначала получаете тип из пакета по имени, затем создаёте объект этого типа и заполняете свойства. Платформа контролирует типы на лету: присвоить строковому свойству число без приведения не получится.
Запись в XML выполняется через объект ЗаписьXML с указанием фабрики и пространства имён. Обратная операция — чтение: ЧтениеXML в связке с ФабрикаXDTO.ПрочитатьXML() возвращает готовый объект XDTO, у которого можно читать свойства как у обычной структуры, но с контролем типов и обязательности.
// Запись объекта в 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
Подходит для простых или нестабильных форматов; нет контроля типов, много кода, высокий риск ошибок
Подходит для REST-интеграций, где формат JSON; для XML-схем с валидацией не заменяет XDTO
Подходят для XML-обменов с формальной схемой: контроль типов, валидация, поддержка WSDL; требуют актуальности схемы
Типичные ошибки и ограничения
Чаще всего проблемы возникают из-за рассинхронизации схемы и реальных данных. Внешняя система добавила поле, а пакет в конфигурации не обновили — чтение падает с ошибкой о неизвестном свойстве. Лечится импортом актуальной XSD или доработкой пакета вручную.
Вторая группа ошибок — работа с необязательными и множественными свойствами. Если свойство не заполнено, обращение к нему вернёт Неопределено, а не пустую строку, и код без проверки упадёт. Множественные свойства возвращаются как список XDTO, даже если элемент один, — обращаться к нему нужно через индекс или цикл, а не напрямую.
Также учитывайте ограничения: XDTO описывает только XML, для JSON нужен другой механизм; схемы с рекурсивными или очень развитыми структурами могут заметно нагружать память при чтении больших файлов — в таких случаях иногда эффективнее потоковое чтение через Чтение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. Главные риски — рассинхронизация схемы с реальными данными и ошибки при работе с необязательными и множественными свойствами.