При работе с интеграциями, особенно с государственными информационными системами, такими как ГИС «Электронный бюджет», разработчики 1С часто сталкиваются с необходимостью формирования сложных XML-файлов на основе XDTO-пакетов. Одной из типичных задач является корректное заполнение вложенных структур, когда один объект содержит в себе коллекцию (список) других объектов. В этой статье мы подробно разберем, как работать с такими структурами на примере объекта tTSE_0401060_D07.
Прежде чем приступать к написанию кода, проанализируем, как 1С интерпретирует XSD-схемы. Если в схеме элемент (например, TSE_Tab0401060_ITEM) имеет свойство «Максимальное количество» (UpperBound), установленное в значение больше 1 или -1 (без ограничений), то в объектной модели 1С это свойство будет представлено не как одиночный объект, а как СписокXDTO.
Типичная ошибка начинающих разработчиков заключается в попытке напрямую присвоить созданному свойству объект. На самом деле, сначала необходимо получить доступ к самому списку, а затем добавлять в него элементы.
Рассмотрим процесс заполнения на примере структуры, где объект TSE_Tab0401060 содержит список элементов TSE_Tab0401060_ITEM. Разберем по шагам, как это реализовать программно:
СписокXDTO.Добавить() для включения элемента в список.Посмотрим на практический пример кода:
// 1. Получаем типы из фабрики XDTO
ТипРодителя = ФабрикаXDTO.Тип("http://www.roskazna.ru/eb/TSE_0401060_D07", "tTSE_Tab0401060");
ТипЭлемента = ФабрикаXDTO.Тип("http://www.roskazna.ru/eb/TSE_0401060_D07", "tTSE_Tab0401060_ITEM");
// 2. Создаем родительский объект
ОбъектТаблица = ФабрикаXDTO.Создать(ТипРодителя);
// 3. Создаем элемент списка и заполняем его свойства
НовыйЭлемент = ФабрикаXDTO.Создать(ТипЭлемента);
НовыйЭлемент.КодСтроки = 1;
НовыйЭлемент.Значение = 100.50;
// 4. Добавляем элемент в список родителя
// Обратите внимание: свойство TSE_Tab0401060_ITEM возвращает СписокXDTO
ОбъектТаблица.TSE_Tab0401060_ITEM.Добавить(НовыйЭлемент);
Проанализируем ситуацию, когда при импорте в «Электронный бюджет» возникает ошибка, хотя структура кажется верной. Одной из наиболее частых причин является неверное указание URI пространства имен. Система казначейства строго проверяет соответствие targetNamespace, указанного в заголовке XML.
При записи XML через объект ЗаписьXML крайне важно правильно объявить префиксы. Если вы создаете корневой объект, убедитесь, что при вызове метода ЗаписатьXML() вы передаете фабрику и корректно настроенные параметры записи. Выясним причину возможного отказа: если система ожидает префикс eb для конкретного URI, а ваша выгрузка генерирует произвольный префикс (например, d1p1), это может стать причиной отклонения файла.
Чтобы избежать ошибок на стороне приемного шлюза, настоятельно рекомендуется выполнять проверку объекта еще на этапе формирования в 1С. Для этого в платформе предусмотрен метод Проверить(). Проанализируем, как его использовать:
Попытка
КорневойОбъект.Проверить();
Сообщить("Объект XDTO соответствует схеме");
Исключение
// Метод Проверить() вызывает исключение, если структура нарушена
ИнформацияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Сообщить("Ошибка валидации: " + ИнформацияОбОшибке);
КонецПопытки;
Важный момент: Валидация проверяет не только структуру (наличие узлов), но и типы данных. Например, если поле определено как число с двумя знаками после запятой, а вы передаете строку или число с большей точностью, Проверить() укажет на это нарушение.
Если вы работаете в конфигурации «1С:Бухгалтерия государственного учреждения» (БГУ), разработка собственной выгрузки с нуля может быть избыточной. В данной программе реализован мощный механизм «Настройка поставок форматов обмена». Для импорта данных можно использовать готовое решение для загрузки расходных расписаний из систем «Электронный бюджет» в 1С:БГУ.
Рассмотрим преимущества этого метода:
.defx), которые уже содержат все необходимые XDTO-пакеты и правила заполнения.Выясним, на что еще стоит обратить внимание при заполнении объектов типа tTSE_0401060_D07:
MinOccurs > 0), но при этом оно может быть пустым по логике бизнеса, в XML должен присутствовать пустой тег или атрибут xsi:nil="true", если это разрешено схемой. В 1С это регулируется установкой значения Неопределено или использованием метода Установить().ЗаписьXML убедитесь, что кодировка указана явно при открытии файла или записи в строку.Таким образом, для успешного заполнения XML по затейливым XDTO-схемам необходимо четко понимать принцип работы с СписокXDTO, использовать фабрику для создания типизированных объектов и не забывать о методах встроенной валидации платформы 1С.