При разработке механизмов интеграции в среде 1С:Предприятие программисты неизбежно сталкиваются с двумя мощными инструментами: СериализаторXDTO и ФабрикаXDTO. На первый взгляд может показаться, что они дублируют функции друг друга, так как оба умеют работать с XML, JSON и пакетами XDTO. Однако их идеология и область применения кардинально различаются. В этой статье мы подробно разберем, как работают эти механизмы, проанализируем их внутреннюю связь и выясним, в каких ситуациях стоит отдать предпочтение конкретному объекту.
Для начала разберем иерархию этих объектов. Проанализируем ситуацию: СериализаторXDTO не является самостоятельной сущностью, существующей в вакууме. На самом деле, это высокоуровневая "обертка" над ФабрикойXDTO. Если ФабрикаXDTO — это фундамент, содержащий описание типов и правил (модель данных), то СериализаторXDTO — это набор инструментов, который использует этот фундамент для автоматизации рутинных операций.
Рассмотрим подробнее их взаимодействие:
ФабрикаXDTO (содержащая метаданные всей конфигурации) и глобальный СериализаторXDTO, который по умолчанию работает именно с этой фабрикой..xsd. Чтобы использовать удобство сериализатора для этой схемы, нам нужно создать новый экземпляр СериализаторXDTO, передав ему в конструктор нашу локальную фабрику.Посмотрим на пример создания локального сериализатора:
// Создаем фабрику на основании внешней схемы
МояФабрика = СоздатьФабрикуXDTO(ПутьКФайлуСхемы);
// Создаем сериализатор, привязанный к этой фабрике
МойСериализатор = Новый СериализаторXDTO(МояФабрика);
Основное назначение объекта СериализаторXDTO — максимально быстрое превращение прикладных объектов 1С (таких как справочники, документы, массивы, структуры) в формат XML или объект XDTO и обратно. Это своего рода "рельсы": система уже знает, как должен выглядеть СправочникСсылка.Номенклатура в формате XML, и делает преобразование автоматически.
Разберем основные преимущества сериализатора:
UUID и добавит метаданные о типе.Пример использования СериализаторXDTO для выгрузки объекта:
// Получаем объект справочника
ОбъектСсылка = Справочники.Номенклатура.НайтиПоКоду("001");
// Записываем его в XML одной командой
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\temp\item.xml");
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектСсылка.ПолучитьОбъект());
ЗаписьXML.Закрыть();
В отличие от сериализатора, ФабрикаXDTO — это инструмент ручной работы. Она не знает о том, как устроен ваш справочник в 1С. Она знает только то, что описано в её пакетах XDTO. С помощью фабрики мы можем построить XML-документ любой сложности, который вообще не похож на структуру метаданных 1С.
Проанализируем ситуации, когда ФабрикаXDTO незаменима:
Рассмотрим пример ручного создания объекта через фабрику:
// Создаем тип на основе пространства имен и имени типа в схеме
ТипДанных = ФабрикаXDTO.Тип("http://www.my-service.com/items", "Product");
// Создаем сам объект XDTO
НовыйОбъектXDTO = ФабрикаXDTO.Создать(ТипДанных);
// Вручную заполняем каждое свойство
НовыйОбъектXDTO.ExternalID = "12345";
НовыйОбъектXDTO.Name = ОбъектНоменклатура.Наименование;
// Сериализуем объект XDTO в XML
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, НовыйОбъектXDTO);
Выясним, как эти объекты взаимодействуют в рамках Web-сервисов 1С. Параметры и возвращаемые значения методов Web-сервисов всегда являются объектами XDTO. Здесь часто используется комбинированный подход.
Если нам нужно вернуть из Web-метода данные справочника, мы можем пойти двумя путями:
СериализаторXDTO.ЗаписатьXDTO(Объект). Он мгновенно превращает справочник в объект XDTO, который можно сразу вернуть как результат функции. Это эффективно и быстро.Фабрика.Создать() и начинаем циклом перекладывать данные из справочника в свойства объекта XDTO. Это трудозатратно, но позволяет изменить структуру "на лету" (например, переименовать поля).Важно отметить, что начиная с версии платформы 8.3, оба механизма полноценно поддерживают формат JSON. Принципы остаются теми же: СериализаторXDTO превращает объект 1С в типизированную JSON-строку (что идеально для обмена между двумя базами 1С), а ФабрикаXDTO позволяет сформировать произвольную JSON-структуру для взаимодействия с любыми внешними системами.
Еще одна важная деталь — ограничения. СериализаторXDTO не умеет "прыгать выше головы". Если вам нужно добавить в XML технический заголовок или атрибут, которого нет в объекте 1С, сериализатор вам не поможет. В таких случаях мы сначала получаем объект XDTO через сериализатор, а затем с помощью методов фабрики модифицируем его (добавляем свойства или меняем значения) перед окончательной отправкой.
Выясним краткие правила, которые помогут вам быстро принять решение в реальной задаче:
Используйте СериализаторXDTO, если:
Используйте ФабрикуXDTO, если:
Таким образом, понимание различий между этими инструментами позволяет не только писать более лаконичный код, но и строить гибкие, отказоустойчивые системы интеграции. Сочетание автоматизма Сериализатора и гибкости Фабрики — это ключ к эффективной работе с любыми внешними данными в среде 1С.