Работа с механизмами XDTO (XML Data Transfer Objects) в 1С часто вызывает трудности у начинающих разработчиков, особенно когда речь идет об интеграции с внешними системами, такими как ЕГАИС. В этой статье мы подробно разберем, как избежать типичных ошибок при заполнении коллекций XDTO, как сформировать правильную структуру XML-документа («конверт») и как сохранить полученный результат на локальный диск.
Рассмотрим типичную ситуацию: при попытке заполнить свойство объекта XDTO (например, поле bc в запросах ЕГАИС) возникает ошибка доступа. Проанализируем причину. В XSD-схемах ЕГАИС поле bc (Barcode) часто имеет признак maxOccurs="unbounded". Это означает, что в модели XDTO данное свойство является не строкой, а объектом типа СписокXDTO.
Важный нюанс: Вы не можете напрямую присвоить значение списку (Объект.bc = "Значение"). Вместо этого необходимо использовать метод Добавить(). Выясним, как это выглядит в коде:
// Неправильно:
// ЗапросXDTO.bc = АкцизнаяМарка; // Вызовет ошибку записи
// Правильно:
АкцизнаяМарка = "236200053897321018001V3QKZFRNKSPNE2RP3F2QYMLQ...";
ЗапросXDTO.bc.Добавить(АкцизнаяМарка);
Если вам нужно добавить несколько марок, мы просто вызываем метод Добавить() в цикле. Платформа сама позаботится о том, чтобы в итоговом XML создалось нужное количество тегов <bc>.
Для успешной отправки данных в ЕГАИС недостаточно просто сериализовать объект запроса. Универсальный транспортный модуль (УТМ) ожидает строго определенную иерархию элементов в файле. Рассмотрим структуру стандартного сообщения:
Documents.FSRAR_ID организации-отправителя.QueryFilter).Для формирования такой структуры проанализируем и применим следующий подход, который часто используется в типовых конфигурациях 1С (УТ 11, КА, ERP). Нам понадобится создать вспомогательные объекты XDTO через ФабрикаXDTO.Создать() для каждого уровня вложенности.
// Определяем пространства имен (Namespace)
КорневоеПространствоИмен = "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01";
// 1. Создаем структуру отправителя (Owner)
ОтправительXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(КорневоеПространствоИмен, "SenderInfo"));
ОтправительXDTO.FSRAR_ID = ИдентификаторФСРАР;
// 2. Создаем тело документа (DocBody) и вкладываем в него наш запрос
СодержимоеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(КорневоеПространствоИмен, "DocBody"));
СодержимоеXDTO.QueryFilter = ЗапросXDTO; // Здесь "QueryFilter" — имя свойства в типе DocBody
Разберем ситуацию, когда 1С при записи XML добавляет лишние префиксы (например, d2p1:) или технические маркеры. УТМ ЕГАИС крайне чувствителен к формату и может отклонить файл, если увидит незнакомые префиксы в именах тегов. Посмотрим на «грязный», но эффективный способ очистки XML, который применяется в промышленной разработке.
Проанализируем фрагмент кода, исправляющий структуру пространства имен после формирования строки:
ТекстXML = ЗаписьXML.Закрыть();
// Удаляем технические префиксы, которые 1С может добавить при сериализации "unqualified" элементов
ТекстXML = СтрЗаменить(ТекстXML, "unqualified_element:", "");
ТекстXML = СтрЗаменить(ТекстXML, "remove:", "");
ТекстXML = СтрЗаменить(ТекстXML, "xmlns:remove", "xmlns");
Зачем это нужно? В схемах ЕГАИС используется настройка elementFormDefault="unqualified". Это означает, что вложенные элементы не должны иметь префиксов. Однако ФабрикаXDTO иногда подставляет их принудительно, если видит зависимости между пакетами. Метод СтрЗаменить позволяет привести документ к виду, который гарантированно примет УТМ.
Когда мы сформировали итоговую строку XML (после всех замен и проверок), нам нужно сохранить ее на диск. Здесь часто возникает путаница: использовать ЗаписьXML или ЗаписьТекста?
Если у вас уже есть переменная типа Строка, содержащая весь текст XML, использование ЗаписьXML избыточно. Правильнее и проще использовать объект ЗаписьТекста. Разберем финальный алгоритм сохранения:
// Предположим, переменная "ТекстXML" уже получена из функции формирования
ПутьКФайлу = "C:\EGAIS\request.xml";
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", , , Истина);
// Истина в конце позволяет записывать XML с отступами (красивый вид)
Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
Запись.Записать(ТекстXML);
Запись.Закрыть();
Суммируем все шаги в единый процесс, который можно использовать в своих обработках:
FSRAR_ID и определяем формат обмена (v2, v3 и т.д.).ФабрикаXDTO.Создать() с нужным URI пространства имен.СписокXDTO.Добавить().Documents, Owner и Document.ЗаписьXML.УстановитьСтроку() и ФабрикаXDTO.ЗаписатьXML().СтрЗаменить для удаления лишних префиксов.ЗаписьТекста для сохранения итогового файла.Следуя этой методике, вы сможете формировать валидные XML-файлы для ЕГАИС, которые будут успешно проходить проверку схем в УТМ без ошибок формата.