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

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

ФабрикаXDTO в 1С: назначение, устройство и практика работы

Что такое ФабрикаXDTO в 1С, зачем нужны пакеты XDTO и схемы XML, как читать и записывать XML-данные, типичные ошибки и практические примеры кода.

ФабрикаXDTO — это глобальный объект встроенного языка 1С, который обеспечивает работу с XML-данными по заранее описанным схемам. Аббревиатура XDTO расшифровывается как XML Data Transfer Objects — объекты передачи данных XML. Механизм позволяет читать и формировать XML-документы не как «сырой текст», а как типизированные объекты: с проверкой типов, обязательности полей и соответствия структуре схемы.

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

Практически каждый разработчик сталкивается с фабрикой XDTO при настройке обменов: универсальный формат EnterpriseData, обмен с сайтами в формате CommerceML, печатные формы электронных счетов-фактур, интеграция с SOAP-сервисами — всё это построено на XDTO. Понимание механизма существенно упрощает отладку обменов и доработку типовых конфигураций.

Как устроен механизм XDTO

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

Каждый пакет имеет пространство имён — уникальный URI, идентифицирующий схему. Например, у типового формата EnterpriseData пространство имён вида http://v8.1c.ru/edi/edi_stnd/EnterpriseData. При чтении XML платформа сопоставляет пространство имён документа с пакетами, и если совпадения нет — документ не будет корректно распознан.

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

Важная особенность: фабрика строго проверяет соответствие схеме. Если в XML встретился элемент, не описанный в пакете, или обязательное поле отсутствует, при чтении возникнет ошибка. Это одновременно защита от некорректных данных и источник проблем при смене версий форматов.

Где применяется фабрика XDTO на практике

Наиболее частый сценарий — обмен данными между конфигурациями 1С. Типовые планы обмена «через универсальный формат» сериализуют объекты базы в XML именно через XDTO. Правила конвертации определяют, как реквизиты объекта отображаются на свойства XDTO-типа.

Второй крупный сценарий — веб-сервисы. При публикации SOAP-сервиса 1С автоматически строит WSDL-описание на основе пакетов XDTO, а при вызове операции входящее SOAP-сообщение десериализуется в объекты XDTO. Аналогично работает и клиентская сторона через WS-ссылки.

Третья область — формализованные документы: электронные счета-фактуры, УПД, отчётность, обмен с банками. Форматы этих документов утверждаются в виде XSD-схем, которые импортируются в конфигурацию как пакеты XDTO. Далее документ формируется как объект XDTO и записывается в XML, гарантированно соответствующий схеме.

Наконец, XDTO удобен как универсальный способ сериализации произвольных данных в XML без привязки к конкретному формату: разработчик создаёт собственный пакет, описывает свою структуру и получает контролируемый обмен с любой внешней системой.

Как создать и использовать пакет XDTO

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

После обновления конфигурации базы данных пакет становится доступен в коде через глобальную фабрику. Типы обращаются по пространству имён и имени типа, объекты создаются методом фабрики, заполняются значениями и записываются в XML.

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

Пример создания и записи простого объекта:

ТипЗаказ = ФабрикаXDTO.Тип("http://example.org/orders", "Заказ");

Заказ = ФабрикаXDTO.Создать(ТипЗаказ);

Заказ.Номер = "А-00125";

Заказ.Дата = ТекущаяДатаСеанса();

Запись = Новый ЗаписьXML;

Запись.ОткрытьФайл("C:\Temp\order.xml");

ФабрикаXDTO.ЗаписатьXML(Запись, Заказ);

Запись.Закрыть();

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

Чтение XML через фабрику XDTO

Чтение выполняется зеркально: создаётся объект ЧтениеXML, открывается файл или строка, и вызывается ФабрикаXDTO.ПрочитатьXML(). Результат — объект XDTO, свойства которого доступны по именам, как у обычной структуры данных 1С.

Чтение = Новый ЧтениеXML;

Чтение.ОткрытьФайл("C:\Temp\order.xml");

Заказ = ФабрикаXDTO.ПрочитатьXML(Чтение);

Чтение.Закрыть();

Сообщить("Номер заказа: " + Заказ.Номер);

Если свойство объявлено в схеме как список (множественное вхождение), на стороне кода оно будет объектом типа «СписокXDTO», по которому нужно итерироваться циклом. Частая ошибка начинающих — обращение к списку как к одиночному значению, что приводит к неверной обработке данных.

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

bsl
Попытка
	Объект = ФабрикаXDTO.ПрочитатьXML(Чтение);
Исключение
	ЗаписьЖурналаРегистрации("Обмен", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;

Глобальная фабрика и собственные фабрики

Глобальный объект ФабрикаXDTO автоматически включает все пакеты, определённые в конфигурации. Это удобно в простых сценариях, но создаёт ограничение: если нужно работать со схемой, которой нет в конфигурации, или с двумя разными версиями одного формата одновременно, глобальной фабрики недостаточно.

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

Ещё одна ситуация для отдельной фабрики — конфликт версий формата. Когда контрагенты присылают файлы разных версий одной схемы с одинаковым пространством имён, глобальная фабрика может содержать только одну из них. Загрузка нужной версии схемы в отдельную фабрику под конкретный файл решает проблему без изменения конфигурации.

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

Глобальная ФабрикаXDTO

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

Собственная фабрика через СоздатьФабрикуXDTO()

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

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

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

Типичные ошибки и их диагностика

Самая распространённая проблема — ошибка «Ошибка проверки данных XDTO» при чтении или записи. Причины почти всегда одни и те же: пространство имён XML не совпадает с пакетом, отсутствует обязательное свойство, значение не соответствует типу (например, строка в числовом поле) или нарушен порядок элементов, если он зафиксирован в схеме как последовательность.

Вторая группа ошибок связана с версиями форматов. Типовые конфигурации при обновлении подменяют пакеты XDTO новыми версиями, и самописные расширения, рассчитанные на старую структуру, перестают работать. Перед обновлением конфигурации стоит проверить все места, где код обращается к типам XDTO по имени.

Третья группа — работа с необязательными свойствами. Если свойство в схеме необязательное и в XML отсутствует, у объекта XDTO оно будет иметь значение Неопределено. Обращение к нему без проверки через Установлено() или сравнение с Неопределено приводит к ошибкам в логике обмена.

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

Проверка результата и отладка

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

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

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

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

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

Файл читается без исключений, свойства заполнены

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

Ошибка проверки данных XDTO с указанием элемента

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

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

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

Пустое или чужое пространство имён в корневом элементе

Обязательные поля по схеме
Норма

Все обязательные элементы присутствуют и заполнены

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

Элемент отсутствует или содержит пустое значение недопустимого типа

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

Когда XDTO не нужен: альтернативы

Не каждый XML требует фабрики. Если структура документа простая, нестабильная или схемы не существует в принципе, прямой разбор через ЧтениеXML с построением структуры или соответствия может быть проще и надёжнее. Нет смысла описывать полноценный пакет ради разового импорта трёх полей.

Для обмена с современными REST-сервисами чаще применяется JSON: объекты ЧтениеJSON и ЗаписьJSON работают без схем и заметно легче в сопровождении. XDTO остаётся там, где формат жёстко регламентирован: государственные документы, банковские выписки, типовые обмены между конфигурациями.

Итог

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

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

Частые вопросы

Чем ФабрикаXDTO отличается от обычного ЧтенияXML?

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

Можно ли использовать фабрику XDTO без изменения конфигурации?

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

Почему при чтении возникает «Ошибка проверки данных XDTO»?

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

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

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

Что делать, если контрагенты присылают разные версии одного формата?

Храните XSD-схемы обеих версий и загружайте нужную в отдельную фабрику перед чтением конкретного файла, определяя версию по содержимому документа. Менять пакет в конфигурации под каждого контрагента не нужно — это ломает остальные обмены.

Подходит ли XDTO для обмена с REST API?

Обычно нет: REST-сервисы преимущественно работают с JSON, для которого в 1С есть ЧтениеJSON и ЗаписьJSON без привязки к схемам. XDTO оправдан там, где формат жёстко стандартизован XSD-схемой — электронные документы, SOAP-сервисы, типовые обмены между конфигурациями.