Разработка и Конфигурация · 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-схему партнёра) и через фабрику читает входящие файлы и формирует исходящие.
Есть XSD-схема или документация с точным перечнем полей
Нужно прочитать внешний файл или сформировать документ для внешней системы
Важно отловить неверные данные до записи в базу
Ключевые объекты: пакеты, типы, значения
В конфигураторе пакеты XDTO находятся в ветке «Общие → XDTO-пакеты». Каждый пакет имеет пространство имён (URI), которое однозначно идентифицирует формат. Внутри пакета описываются типы объектов (аналог структур) и типы значений (простые типы с ограничениями — длина строки, диапазон числа, перечисление допустимых значений).
Во встроенном языке работа строится вокруг нескольких сущностей. ОбъектXDTO — экземпляр данных, соответствующий типу объекта; к его свойствам обращаются как к полям структуры. ЗначениеXDTO — простое типизированное значение. СвойствоXDTO и ТипОбъектаXDTO описывают метаданные схемы и нужны при универсальной обработке, когда структура заранее неизвестна.
Важная особенность: свойства, которые в схеме могут повторяться (множественные), представлены списком СписокXDTO, даже если элемент один. Обращение к такому свойству как к одиночному значению — частая причина ошибок; правильно работать через индекс или цикл.
Как прочитать XML через фабрику XDTO
Чтение выполняется через объект ЧтениеXML совместно с фабрикой. Потоковый подход позволяет обрабатывать большие файлы, не загружая их целиком в память как текст. Типовой порядок такой: открыть файл, создать чтение XML, вызвать метод фабрики ПрочитатьXML и получить объект XDTO, далее обойти его свойства.
- 1Убедитесь, что в конфигурации есть пакет XDTO с пространством имён, совпадающим с пространством имён файла
- 2Создайте объект ЧтениеXML и откройте файл через ОткрытьФайл()
- 3Вызовите ФабрикаXDTO.ПрочитатьXML(ЧтениеXML) и получите ОбъектXDTO
- 4Обратитесь к свойствам объекта; множественные свойства обходите циклом по списку
- 5Закройте чтение XML и обработайте возможные исключения с текстом ошибки валидации
Если пространство имён файла не совпадает ни с одним пакетом в фабрике, чтение завершится ошибкой. Это нормальная защитная реакция: фабрика не гадает, а требует точного описания формата. Решение — добавить нужный пакет в конфигурацию или создать отдельную фабрику из схемы, загруженной программно.
Для проверки результата полезно после чтения вывести тип полученного объекта и несколько ключевых свойств в журнал регистрации или сообщение. Если объект прочитался, но свойства пустые — чаще всего нарушено соответствие имён: в XML учитывается регистр и точное написание тегов.
Как сформировать XML через фабрику XDTO
Формирование документа — зеркальная задача. Сначала из фабрики получают тип нужного объекта методом ФабрикаXDTO.Тип(ПространствоИмен, ИмяТипа), затем создают объект методом ФабрикаXDTO.Создать(Тип), заполняют свойства и записывают через ЗаписьXML методом ФабрикаXDTO.ЗаписатьXML.
Тип = ФабрикаXDTO.Тип("http://example.org/orders", "Заказ");
Объект = ФабрикаXDTO.Создать(Тип);
Объект.Номер = "А-1024";
Объект.Дата = ТекущаяДатаСеанса();
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\\obmen\\order.xml");
ФабрикаXDTO.ЗаписатьXML(Запись, Объект);
Запись.Закрыть();При заполнении обязательные свойства пропускать нельзя: при записи фабрика проверит объект на соответствие схеме и выдаст ошибку, если обязательное поле не заполнено или значение не проходит ограничение типа (например, строка длиннее допустимой). Это удобно — некорректный файл просто не будет сформирован.
Собственная фабрика и работа с внешними схемами
Глобальная фабрика содержит пакеты, описанные в конфигурации. Но иногда схему нужно загрузить динамически — например, партнёр прислал XSD-файл, и добавлять его в конфигурацию нежелательно. Для этого платформа позволяет программно построить фабрику из схемы: прочитать XSD построителем схем, создать пакеты и сформировать новый объект фабрики.
Такой подход полезен в универсальных загрузках, где формат может меняться без обновления конфигурации. Ограничение: программно созданная фабрика живёт только в рамках сеанса, её нужно пересоздавать при каждом обращении или кэшировать в рамках вызова сервера.
Как выбрать подход
Типичные ошибки и ограничения
Самая частая проблема — несовпадение пространств имён. Даже лишний слэш в конце URI делает пакет «чужим» для файла. Вторая по частоте — работа с множественными свойствами как с одиночными: обращение Объект.Товар.Наименование вместо обхода списка приводит к ошибке или неверным данным.
Третья группа ошибок — типы данных. Даты в XML передаются в формате ISO, и фабрика сама преобразует их в тип Дата, но если в схеме поле описано как строка, платформа не будет ничего конвертировать — сравнение таких «дат» строками даст неожиданные результаты. Аналогично с числами: разделитель дробной части в XML — точка.
Из ограничений стоит помнить: 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 по описанной схеме пакетов. Ключ к стабильной работе — точное совпадение пространств имён, корректная обработка множественных и необязательных свойств и отказ от изменения типовых пакетов.