В чем разница между Сериализатором XDTO и Фабрикой XDTO и какой инструмент выбрать для работы с XML и JSON?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке механизмов интеграции в среде 1С:Предприятие программисты неизбежно сталкиваются с двумя мощными инструментами: СериализаторXDTO и ФабрикаXDTO. На первый взгляд может показаться, что они дублируют функции друг друга, так как оба умеют работать с XML, JSON и пакетами XDTO. Однако их идеология и область применения кардинально различаются. В этой статье мы подробно разберем, как работают эти механизмы, проанализируем их внутреннюю связь и выясним, в каких ситуациях стоит отдать предпочтение конкретному объекту.

Архитектурная связь: обертка над фундаментом

Для начала разберем иерархию этих объектов. Проанализируем ситуацию: СериализаторXDTO не является самостоятельной сущностью, существующей в вакууме. На самом деле, это высокоуровневая "обертка" над ФабрикойXDTO. Если ФабрикаXDTO — это фундамент, содержащий описание типов и правил (модель данных), то СериализаторXDTO — это набор инструментов, который использует этот фундамент для автоматизации рутинных операций.

Рассмотрим подробнее их взаимодействие:

  1. Глобальные объекты: В системе существует глобальная ФабрикаXDTO (содержащая метаданные всей конфигурации) и глобальный СериализаторXDTO, который по умолчанию работает именно с этой фабрикой.
  2. Локальные экземпляры: Мы можем создать собственную фабрику, загрузив в нее внешнюю схему .xsd. Чтобы использовать удобство сериализатора для этой схемы, нам нужно создать новый экземпляр СериализаторXDTO, передав ему в конструктор нашу локальную фабрику.

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


// Создаем фабрику на основании внешней схемы
МояФабрика = СоздатьФабрикуXDTO(ПутьКФайлуСхемы);
// Создаем сериализатор, привязанный к этой фабрике
МойСериализатор = Новый СериализаторXDTO(МояФабрика);

Сериализатор XDTO: путь автоматизации и "рельсы"

Основное назначение объекта СериализаторXDTO — максимально быстрое превращение прикладных объектов 1С (таких как справочники, документы, массивы, структуры) в формат XML или объект XDTO и обратно. Это своего рода "рельсы": система уже знает, как должен выглядеть СправочникСсылка.Номенклатура в формате XML, и делает преобразование автоматически.

Разберем основные преимущества сериализатора:

Пример использования СериализаторXDTO для выгрузки объекта:


// Получаем объект справочника
ОбъектСсылка = Справочники.Номенклатура.НайтиПоКоду("001");
// Записываем его в XML одной командой
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\temp\item.xml");
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектСсылка.ПолучитьОбъект());
ЗаписьXML.Закрыть();

Фабрика XDTO: свобода действий и работа с произвольными структурами

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

Проанализируем ситуации, когда ФабрикаXDTO незаменима:

  1. Жесткий сторонний формат: Если вы интегрируетесь с государственным сервисом (ЕГАИС, Честный Знак) или зарубежным API, где названия полей и иерархия строго заданы внешней стороной.
  2. Отсутствие прямой привязки к метаданным: Когда нужно собрать объект "сборную солянку" из разных реквизитов, констант и вычисляемых значений.
  3. Создание сложных типов: Когда требуется вручную управлять пространствами имен (namespace) и префиксами.

Рассмотрим пример ручного создания объекта через фабрику:


// Создаем тип на основе пространства имен и имени типа в схеме
ТипДанных = ФабрикаXDTO.Тип("http://www.my-service.com/items", "Product");
// Создаем сам объект XDTO
НовыйОбъектXDTO = ФабрикаXDTO.Создать(ТипДанных);
// Вручную заполняем каждое свойство
НовыйОбъектXDTO.ExternalID = "12345";
НовыйОбъектXDTO.Name = ОбъектНоменклатура.Наименование;
// Сериализуем объект XDTO в XML
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, НовыйОбъектXDTO);

Сравнительный анализ в контексте Web-сервисов

Выясним, как эти объекты взаимодействуют в рамках Web-сервисов 1С. Параметры и возвращаемые значения методов Web-сервисов всегда являются объектами XDTO. Здесь часто используется комбинированный подход.

Если нам нужно вернуть из Web-метода данные справочника, мы можем пойти двумя путями:

Работа с JSON и расширениями

Важно отметить, что начиная с версии платформы 8.3, оба механизма полноценно поддерживают формат JSON. Принципы остаются теми же: СериализаторXDTO превращает объект 1С в типизированную JSON-строку (что идеально для обмена между двумя базами 1С), а ФабрикаXDTO позволяет сформировать произвольную JSON-структуру для взаимодействия с любыми внешними системами.

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

Итоговые рекомендации по выбору

Выясним краткие правила, которые помогут вам быстро принять решение в реальной задаче:

Используйте СериализаторXDTO, если:

Используйте ФабрикуXDTO, если:

Таким образом, понимание различий между этими инструментами позволяет не только писать более лаконичный код, но и строить гибкие, отказоустойчивые системы интеграции. Сочетание автоматизма Сериализатора и гибкости Фабрики — это ключ к эффективной работе с любыми внешними данными в среде 1С.

← На главную