Перейти к основному содержимому

XML и XDTO в интеграции 1С

Разработчику

XML и XDTO

Как в 1С используются XML и XDTO

В 1С есть несколько способов работы с XML, и выбор зависит от задачи:

  • XDTO. Строгие форматы (госсистемы, внешние API), типобезопасность, сложные структуры.
  • ЧтениеXML / ЗаписьXML. Простые выгрузки, разовые задачи, нет готовой схемы, но нет автоматической валидации.
  • DOM‑подход (ПостроительDOM). Частичная обработка больших файлов, выборочное чтение узлов, но много кода.
  • Готовые механизмы обмена (EnterpriseData, планы обмена). Не подходит для произвольных внешних форматов.

XML (eXtensible Markup Language) — универсальный формат для передачи структурированных данных. В экосистеме 1С он нужен для:

  • Обмена с внешними системами: CRM, интернет‑магазинами, госсистемами (ФНС, Честный ЗНАК и т. п.).
  • Выгрузки/загрузки отчётности и регламентированных данных, где формат жёстко задан (часто в виде XSD‑схемы).
  • Сохранения настроек, правил обмена, шаблонов.
  • Интеграции через веб‑ и SOAP‑сервисы, где XML — транспортный формат.

Например, для приёма заказов из интернет-магазина будет использоваться XML по XSD, десериализация через XDTO, создание документов в 1С, ответ в том же формате. Или для отправки отчётности в госорганы - строгое соответствие XSD, валидация на этапе сериализации, контроль обязательных полей.

XDTO (XML Data Transfer Objects) — встроенный механизм платформы 1С для типобезопасной работы с XML. Вместо ручного разбора узлов XML вы работаете с объектами, свойства которых строго соответствуют схеме. Задачи XDTO:

  • Сериализация: превратить объект 1С (или XDTO‑объект) в XML‑документ.
  • Десериализация: прочитать XML и получить объект с типизированными полями.
  • Валидация: проверить, что данные соответствуют XSD‑схеме ещё до записи/отправки.

XDTO удобно использовать для описания типов запросов/ответов, платформа сама сформирует WSDL и будет проверять входящие сообщения.

XML — исторически главный формат обмена в 1С — планы обмена, EnterpriseData, отраслевые схемы, SOAP. XDTO (XML Data Transfer Objects) — объектная модель поверх XSD — типы, фабрика, сериализация значений платформы.

ЗадачаИнструмент
Обмен между конфигурациямиXDTO + план обмена (Универсальный обмен данными 1С)
Произвольная схема контрагентаФабрикаXDTO по НаборСхемXML
Типы Web-сервисаПакеты XDTO (Web-сервисы 1С (SOAP))
Сохранить ссылку/объект в файлСериализаторXDTO

Для новых REST-интеграций чаще JSON; XML остаётся в обмене с гос. системами и типовыми форматами 1С.

Как устроена работа с XDTO?

  1. Схема (XSD) описывает структуру XML: элементы, атрибуты, типы, обязательность, вложенность.
  2. Пакет XDTO в конфигурации 1С хранит описание типов на основе XSD. Его можно создать импортом XSD или вручную.
  3. Фабрика XDTO создаёт объекты по типам из пакета.
  4. Методы ПрочитатьXML / ЗаписатьXML выполняют преобразование между XML и объектами XDTO.

Пример логики:

Фабрика = Новый ФабрикаXDTO("file://C:\schemas\orders.xsd");
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\in\order.xml");

// Десериализация: XML → объект XDTO
Заказ = Фабрика.ПрочитатьXML(Чтение);

// Работа с данными как с объектами
Сообщить(Заказ.Номер + " от " + Заказ.Дата);

// Сериализация: объект XDTO → XML
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\out\response.xml");
Фабрика.ЗаписатьXML(Запись, Заказ);
Запись.Закрыть();

Пространства имён (namespaces) в XSD должны точно совпадать с теми, что в XML. Ошибка в namespace — частая причина «не читается» даже при внешне одинаковом содержимом. Также стоит учесть, что XDTO хорошо работает для документов среднего размера (сотни КБ — несколько МБ). Для очень больших файлов иногда эффективнее частичная обработка через ЧтениеXML/DOM.


Фабрика и сериализатор

В платформе 1С эти два механизма решают смежные задачи (преобразование данных в XML/JSON и обратно), но устроены и применяются по‑разному.

  • ФабрикаXDTO — глобальная (все типы конфигурации) или созданная из набора XSD.
  • СериализаторXDTO — запись и чтение значений БД в XML.

Фабрика XDTO — это объект, который «знает» про типы данных из пакетов XDTO (в том числе загруженных из XSD). Она отвечает за:

  • Создание экземпляров объектов XDTO: Фабрика.Создать(Тип).
  • Чтение и запись XML/JSON строго по схеме: ПрочитатьXML, ЗаписатьXML.
  • Работу с типами по их именам и пространствам имён, валидацию по XSD.

Фабрика не привязана к метаданным 1С (справочникам, документам и т. п.) — она оперирует только тем, что описано в пакете XDTO. Это удобно, когда формат диктует внешняя система (госсистема, SOAP‑сервис, чужой API).

Пример - создание и заполнение объекта через Фабрику:

Фабрика = Новый ФабрикаXDTO("file://C:\schemas\orders.xsd");
ТипЗаказа = Фабрика.Тип("http://example.com/orders", "Order");
Заказ = Фабрика.Создать(ТипЗаказа);

// Ручное заполнение полей
Заказ.Номер = "ORD-12345";
Заказ.Дата = ТекущаяДата();

Сериализатор XDTO — это инструмент для быстрой сериализации/десериализации объектов платформы (справочников, документов, структур, таблиц значений) в/из XML или JSON. Он «понимает» типы 1С и умеет превращать их в XDTO‑объекты и обратно.

  • Автоматически маппит реквизиты объектов 1С на поля XDTO (если типы совместимы).
  • Поддерживает ссылки 1С, преобразуя их в строковые идентификаторы/GUID и обратно.
  • Позволяет быстро выгрузить документ/справочник в XML без ручного перебора полей.

Сериализатор можно использовать как глобальный объект СериализаторXDTO либо создать свой экземпляр, привязанный к конкретной Фабрике.

Пример - выгрузка справочника через Сериализатор:

НоменклатураОбъект = Справочники.Номенклатура.НайтиПоКоду("001").ПолучитьОбъект();

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\out\nomen.xml");

// Одна команда: объект 1С → XML
СериализаторXDTO.ЗаписатьXML(Запись, НоменклатураОбъект);
Запись.Закрыть();

На практике часто используют связку: Сериализатор для быстрого получения XDTO‑объекта из данных 1С, а затем Фабрику (или методы объекта XDTO) для тонкой настройки перед отправкой (добавить атрибуты, изменить namespace, подменить значения).

// 1. Быстрое получение XDTO-объекта из документа 1С
ДокументОбъект = Документы.ЗаказПокупателя.НайтиПоНомеру("Z-001").ПолучитьОбъект();
XDTOОбъект = СериализаторXDTO.Сериализовать(ДокументОбъект);

// 2. Доработка через методы Фабрики/XDTO (если нужно добавить спец. атрибуты)
// Например, установить значение атрибута, которого нет в метаданных 1С
XDTOОбъект.УстановитьАтрибут("http://example.com/ns", "externalId", "EXT-999");

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

Сериализация на сервере, файл — во временном хранилище, клиент скачивает через НачатьПолучениеФайлаССервера:

&НаСервереБезКонтекста
Функция СериализацияВXMLНаСервере(Ссылка)
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ИмяФайла = ПолучитьИмяВременногоФайла("xml");
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла);
Сериализатор.ЗаписатьXML(Запись, Ссылка, НазначениеТипаXML.Явное);
Запись.Закрыть();
Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
КонецФункции

Обратная операция — ПрочитатьXML через ЧтениеXML.


Клиент ↔ сервер: файлы

В 1С передача файлов между клиентом и сервером строго регламентирована архитектурой: у сервера нет доступа к локальным дискам клиента, а клиент — к дискам сервера. Поэтому используют временное хранилище как промежуточный механизм. Если передать на сервер строку вроде C:\Users\User\file.xlsx, это не сработает:

  • клиент и сервер (особенно в кластере) — это разные машины, имеют разные файловые системы;
  • сервер 1С запускается от имени специального пользователя, у которого нет прав на диски пользователей;
  • в браузере вообще нет прямого доступа к файловой системе.

На тонком клиенте прямой доступ к диску сервера недоступен. Схема:

  1. Клиент — НачатьПомещениеФайлаНаСервер → адрес во временном хранилище.
  2. Сервер — читает ДвоичныеДанные, парсит XML, пишет результат.
  3. Клиент — НачатьПолучениеФайлаССервера для выгрузки.

Тот же паттерн для ZIP — на сервере ЧтениеZipФайла, извлечение во временный каталог, каждый файл — ПоместитьВоВременноеХранилище, массив адресов возвращается клиенту.

Временное хранилище — это область памяти (или дисковое хранилище кластера), доступная и клиенту, и серверу в рамках сеанса. Данные хранятся по уникальному адресу (строке вида e1cib/tempstorage/...). Временное хранилище хранится в оперативной памяти или на диске кластера. Большие файлы (сотни МБ и выше) могут создавать нагрузку. Для очень больших файлов используют потоковую передачу чанками или внешние хранилища (S3, сетевые шары с общим доступом). Данные во временном хранилище живут до конца сеанса либо до явного удаления (УдалитьИзВременногоХранилища). Не стоит хранить там файлы «навсегда».


ZIP в обмене

В 1С ZIP‑архивы используют в обмене, чтобы уменьшить объём передаваемых данных, упаковать несколько файлов в один контейнер и соответствовать требованиям внешних систем (например, госсистем или маркетплейсов).

Основные объекты для работы с ZIP в платформе 1С

  • ЗаписьZipФайла — для создания ZIP‑архивов.
  • ЧтениеZip — для распаковки и просмотра содержимого архива.
  • СжатиеДанных — если не нужна полноценная ZIP‑структура с именами файлов, а нужно просто сжать поток (Gzip/Deflate). Это часто эффективнее для HTTP‑интеграций.

На сервере ZIP обычно формируют через временные файлы: платформа ожидает реальные файлы на диске для добавления в архив.

Архивы сжимают пакеты обмена и наборы вложений. Типовой цикл на сервере:

Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ЧтениеАрхива = Новый ЧтениеZipФайла(Поток, , Пароль);
Пока ЧтениеАрхива.Следующий() Цикл
Элемент = ЧтениеАрхива.ТекущийЭлемент;
// Извлечь(), ПоместитьВоВременноеХранилище ...
КонецЦикла;
ЧтениеАрхива.Закрыть();

Пароль архива запрашивают на клиенте до помещения файла на сервер.


Связь с другими механизмами


Связанные материалы