Как программно заполнить вложенные объекты и списки в XDTO для ГИС «Электронный бюджет»?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Финансы и профессиональные услуги
← На главную

При работе с интеграциями, особенно с государственными информационными системами, такими как ГИС «Электронный бюджет», разработчики 1С часто сталкиваются с необходимостью формирования сложных XML-файлов на основе XDTO-пакетов. Одной из типичных задач является корректное заполнение вложенных структур, когда один объект содержит в себе коллекцию (список) других объектов. В этой статье мы подробно разберем, как работать с такими структурами на примере объекта tTSE_0401060_D07.

Понимание структуры списков в XDTO

Прежде чем приступать к написанию кода, проанализируем, как 1С интерпретирует XSD-схемы. Если в схеме элемент (например, TSE_Tab0401060_ITEM) имеет свойство «Максимальное количество» (UpperBound), установленное в значение больше 1 или -1 (без ограничений), то в объектной модели 1С это свойство будет представлено не как одиночный объект, а как СписокXDTO.

Типичная ошибка начинающих разработчиков заключается в попытке напрямую присвоить созданному свойству объект. На самом деле, сначала необходимо получить доступ к самому списку, а затем добавлять в него элементы.

Пошаговый алгоритм заполнения вложенного списка

Рассмотрим процесс заполнения на примере структуры, где объект TSE_Tab0401060 содержит список элементов TSE_Tab0401060_ITEM. Разберем по шагам, как это реализовать программно:

  1. Создание родительского объекта: Сначала мы создаем основной объект через фабрику XDTO, используя соответствующий тип из пакета.
  2. Получение ссылки на список: Мы обращаемся к свойству родительского объекта, которое должно содержать коллекцию. 1С автоматически инициализирует пустой СписокXDTO.
  3. Создание и заполнение элемента списка: Создаем новый объект типа, соответствующего элементу списка.
  4. Добавление в коллекцию: Используем метод Добавить() для включения элемента в список.

Посмотрим на практический пример кода:


// 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.Добавить(НовыйЭлемент);

Особенности работы с пространствами имен (Namespaces)

Проанализируем ситуацию, когда при импорте в «Электронный бюджет» возникает ошибка, хотя структура кажется верной. Одной из наиболее частых причин является неверное указание URI пространства имен. Система казначейства строго проверяет соответствие targetNamespace, указанного в заголовке XML.

При записи XML через объект ЗаписьXML крайне важно правильно объявить префиксы. Если вы создаете корневой объект, убедитесь, что при вызове метода ЗаписатьXML() вы передаете фабрику и корректно настроенные параметры записи. Выясним причину возможного отказа: если система ожидает префикс eb для конкретного URI, а ваша выгрузка генерирует произвольный префикс (например, d1p1), это может стать причиной отклонения файла.

Валидация данных перед выгрузкой

Чтобы избежать ошибок на стороне приемного шлюза, настоятельно рекомендуется выполнять проверку объекта еще на этапе формирования в 1С. Для этого в платформе предусмотрен метод Проверить(). Проанализируем, как его использовать:


Попытка
    КорневойОбъект.Проверить();
    Сообщить("Объект XDTO соответствует схеме");
Исключение
    // Метод Проверить() вызывает исключение, если структура нарушена
    ИнформацияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    Сообщить("Ошибка валидации: " + ИнформацияОбОшибке);
КонецПопытки;

Важный момент: Валидация проверяет не только структуру (наличие узлов), но и типы данных. Например, если поле определено как число с двумя знаками после запятой, а вы передаете строку или число с большей точностью, Проверить() укажет на это нарушение.

Альтернативный подход: Использование настроек форматов в БГУ

Если вы работаете в конфигурации «1С:Бухгалтерия государственного учреждения» (БГУ), разработка собственной выгрузки с нуля может быть избыточной. В данной программе реализован мощный механизм «Настройка поставок форматов обмена». Для импорта данных можно использовать готовое решение для загрузки расходных расписаний из систем «Электронный бюджет» в 1С:БГУ.

Рассмотрим преимущества этого метода:

Типичные ошибки при формировании XML для «Электронного бюджета»

Выясним, на что еще стоит обратить внимание при заполнении объектов типа tTSE_0401060_D07:

  1. Формат даты: В XDTO даты часто требуют строгого соблюдения стандарта (ГГГГ-ММ-ДД). Убедитесь, что вы не передаете время, если схема ожидает только дату.
  2. Пустые значения: Если свойство в схеме помечено как обязательное (MinOccurs > 0), но при этом оно может быть пустым по логике бизнеса, в XML должен присутствовать пустой тег или атрибут xsi:nil="true", если это разрешено схемой. В 1С это регулируется установкой значения Неопределено или использованием метода Установить().
  3. Кодировка: Система «Электронный бюджет» ожидает файлы в кодировке UTF-8. При использовании ЗаписьXML убедитесь, что кодировка указана явно при открытии файла или записи в строку.

Таким образом, для успешного заполнения XML по затейливым XDTO-схемам необходимо четко понимать принцип работы с СписокXDTO, использовать фабрику для создания типизированных объектов и не забывать о методах встроенной валидации платформы 1С.

← На главную