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

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

Фабрика XDTO в 1С: что это и как использовать

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

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

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

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

Что такое XDTO и зачем нужна фабрика

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

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

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

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

Первый и самый массовый сценарий — планы обмена и типовые правила конвертации. Многие механизмы обмена между конфигурациями (например, между ERP и Бухгалтерией) построены на XDTO: данные сериализуются в XML по описанию формата EnterpriseData и передаются через файлы, сообщения или веб-сервисы.

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

Третий сценарий — произвольные интеграции: загрузка прайсов, выгрузка каталога на маркетплейс, приём заказов с сайта. Здесь разработчик описывает формат пакетом XDTO (или использует готовую XSD-схему партнёра) и через фабрику читает входящие файлы и формирует исходящие.

Формат обменаXML с фиксированной структурой

Есть XSD-схема или документация с точным перечнем полей

НаправлениеИмпорт или экспорт

Нужно прочитать внешний файл или сформировать документ для внешней системы

ВалидацияТребуется контроль типов

Важно отловить неверные данные до записи в базу

Ключевые объекты: пакеты, типы, значения

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

Во встроенном языке работа строится вокруг нескольких сущностей. ОбъектXDTO — экземпляр данных, соответствующий типу объекта; к его свойствам обращаются как к полям структуры. ЗначениеXDTO — простое типизированное значение. СвойствоXDTO и ТипОбъектаXDTO описывают метаданные схемы и нужны при универсальной обработке, когда структура заранее неизвестна.

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

Как прочитать XML через фабрику XDTO

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

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

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

Для проверки результата полезно после чтения вывести тип полученного объекта и несколько ключевых свойств в журнал регистрации или сообщение. Если объект прочитался, но свойства пустые — чаще всего нарушено соответствие имён: в XML учитывается регистр и точное написание тегов.

Как сформировать XML через фабрику XDTO

Формирование документа — зеркальная задача. Сначала из фабрики получают тип нужного объекта методом ФабрикаXDTO.Тип(ПространствоИмен, ИмяТипа), затем создают объект методом ФабрикаXDTO.Создать(Тип), заполняют свойства и записывают через ЗаписьXML методом ФабрикаXDTO.ЗаписатьXML.

bsl
Тип = ФабрикаXDTO.Тип("http://example.org/orders", "Заказ");
Объект = ФабрикаXDTO.Создать(Тип);
Объект.Номер = "А-1024";
Объект.Дата = ТекущаяДатаСеанса();

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\\obmen\\order.xml");
ФабрикаXDTO.ЗаписатьXML(Запись, Объект);
Запись.Закрыть();

При заполнении обязательные свойства пропускать нельзя: при записи фабрика проверит объект на соответствие схеме и выдаст ошибку, если обязательное поле не заполнено или значение не проходит ограничение типа (например, строка длиннее допустимой). Это удобно — некорректный файл просто не будет сформирован.

Собственная фабрика и работа с внешними схемами

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

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

Маршрут решения

Как выбрать подход

Формат фиксирован и используется постоянноДобавьте пакет XDTO в конфигурацию и работайте через глобальную ФабрикаXDTO
Схема приходит извне и может меняться без обновления конфигурацииСтройте фабрику программно из XSD-файла в момент обмена
Данные простые и схемы нетРассмотрите обычное ЧтениеXML/ЗаписьXML без XDTO — типизация не нужна

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

Самая частая проблема — несовпадение пространств имён. Даже лишний слэш в конце URI делает пакет «чужим» для файла. Вторая по частоте — работа с множественными свойствами как с одиночными: обращение Объект.Товар.Наименование вместо обхода списка приводит к ошибке или неверным данным.

Третья группа ошибок — типы данных. Даты в XML передаются в формате ISO, и фабрика сама преобразует их в тип Дата, но если в схеме поле описано как строка, платформа не будет ничего конвертировать — сравнение таких «дат» строками даст неожиданные результаты. Аналогично с числами: разделитель дробной части в XML — точка.

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

Из ограничений стоит помнить: XDTO ориентирован на XML, для JSON у платформы отдельные механизмы. Кроме того, типовые пакеты (например, форматы EnterpriseData) меняются поставщиком конфигурации, поэтому дорабатывать их напрямую нельзя — расширяйте через собственные пакеты или подписки в коде обмена.

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

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

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

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

Чтение файла
Норма

ПрочитатьXML возвращает объект без исключения

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

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

Содержимое объекта
Норма

Свойства заполнены, списки содержат ожидаемое число элементов

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

Свойства пустые при непустом XML — вероятно, не совпали имена или пространства имён

Сформированный файл
Норма

Приёмная сторона читает файл без ошибок

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

Ошибки валидации обязательных полей или типов

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

При отладке обмена сохраняйте проблемный XML-файл и воспроизводите чтение в отдельной обработке на копии базы. Так вы изолируете проблему формата от бизнес-логики и не рискуете данными рабочей базы.
ПЗ
Практическое замечание

Частые вопросы о фабрике XDTO

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

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

Можно ли использовать фабрику XDTO для JSON?

Нет, XDTO предназначен только для XML. Для JSON в платформе есть объекты ЧтениеJSON и ЗаписьJSON, а также сериализация через функции работы с JSON. Пытаться «скормить» JSON фабрике бессмысленно — она ожидает XML-поток.

Куда добавлять пакет XDTO в конфигураторе?

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

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

Почти всегда причина в несовпадении пространства имён корневого элемента файла с пространствами имён пакетов, известных фабрике. Сравните URI в атрибуте xmlns файла с URI пакета посимвольно, включая регистр и завершающие слэши.

Как обработать необязательные свойства, которых может не быть в файле?

Перед обращением проверяйте наличие свойства через метод Установлено() объекта XDTO или обрабатывайте его внутри попытки. Обращение к неустановленному необязательному свойству вернёт неопределённое значение, и прямая работа с ним без проверки может привести к ошибке.

Итог

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

Фабрика XDTO — типизированный мост между объектами 1С и XML по описанной схеме пакетов. Ключ к стабильной работе — точное совпадение пространств имён, корректная обработка множественных и необязательных свойств и отказ от изменения типовых пакетов.