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?
- Схема (XSD) описывает структуру XML: элементы, атрибуты, типы, обязательность, вложенность.
- Пакет XDTO в конфигурации 1С хранит описание типов на основе XSD. Его можно создать импортом XSD или вручную.
- Фабрика XDTO создаёт объекты по типам из пакета.
- Методы Прочитать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С запускается от имени специального пользователя, у которого нет прав на диски пользователей;
- в браузере вообще нет прямого доступа к файловой системе.
На тонком клиенте прямой доступ к диску сервера недоступен. Схема:
- Клиент —
НачатьПомещениеФайлаНаСервер→ адрес во временном хранилище. - Сервер — читает
ДвоичныеДанные, парсит XML, пишет результат. - Клиент —
НачатьПолучениеФайлаССерверадля выгрузки.
Тот же паттерн для ZIP — на сервере ЧтениеZipФайла, извлечение во временный каталог, каждый файл — ПоместитьВоВременноеХранилище, массив адресов возвращается клиенту.
Временное хранилище — это область памяти (или дисковое хранилище кластера), доступная и клиенту, и серверу в рамках сеанса. Данные хранятся по уникальному адресу (строке вида e1cib/tempstorage/...). Временное хранилище хранится в оперативной памяти или на диске кластера. Большие файлы (сотни МБ и выше) могут создавать нагрузку. Для очень больших файлов используют потоковую передачу чанками или внешние хранилища (S3, сетевые шары с общим доступом). Данные во временном хранилище живут до конца сеанса либо до явного удаления (УдалитьИзВременногоХранилища). Не стоит хранить там файлы «навсегда».
ZIP в обмене
В 1С ZIP‑архивы используют в обмене, чтобы уменьшить объём передаваемых данных, упаковать несколько файлов в один контейнер и соответствовать требованиям внешних систем (например, госсистем или маркетплейсов).
Основные объекты для работы с ZIP в платформе 1С
ЗаписьZipФайла— для создания ZIP‑архивов.ЧтениеZip— для распаковки и просмотра содержимого архива.СжатиеДанных— если не нужна полноценная ZIP‑структура с именами файлов, а нужно просто сжать поток (Gzip/Deflate). Это часто эффективнее для HTTP‑интеграций.
На сервере ZIP обычно формируют через временные файлы: платформа ожидает реальные файлы на диске для добавления в архив.
Архивы сжимают пакеты обмена и наборы вложений. Типовой цикл на сервере:
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ЧтениеАрхива = Новый ЧтениеZipФайла(Поток, , Пароль);
Пока ЧтениеАрхива.Следующий() Цикл
Элемент = ЧтениеАрхива.ТекущийЭлемент;
// Извлечь(), ПоместитьВоВременноеХранилище ...
КонецЦикла;
ЧтениеАрхива.Закрыть();
Пароль архива запрашивают на клиенте до помещения файла на сервер.
Связь с другими механизмами
- Универсальный обмен — XML-сообщения плана обмена.
- JSON в интеграции 1С — JSON для REST; XDTO — для XSD/SOAP.
- FTP и электронная почта в 1С — транспорт готового файла по FTP или почте.