Как программно добавить и заполнить элементы в СписокXDTO?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При формировании электронных перевозочных документов (ЭТрН) и электронных документов произвольного формата часто возникает задача модификации готового дерева ОбъектXDTO. В частности, требуется внести дополнительные сведения в информационные поля, такие как ИнфПол и вложенные теги ТекстИнф.

Разберем детально, как устроена работа со списочными свойствами в модели XDTO, как правильно получить тип создаваемого узла и добавить новые данные в структуру XML.

Особенности работы со списками в объектах XDTO

Прежде чем перейти к коду, проанализируем поведение платформы 1С при работе с XDTO:

  1. Причина возникновения коллекции: Свойство становится объектом СписокXDTO в тех случаях, когда в соответствующей схеме XSD для элемента указано ограничение количества maxOccurs > 1 или maxOccurs="unbounded".
  2. Ограничение на прямое присвоение: Коллекции СписокXDTO создаются платформой автоматически. Попытка напрямую присвоить новое значение списочному свойству через знак равенства вызовет исключительную ситуацию «Поле объекта недоступно для записи». Работа с такими полями выполняется исключительно через методы коллекции: Добавить() или Вставить().
  3. Получение типов вложенных элементов: Для создания подчиненного объекта через ФабрикаXDTO.Создать() необходимо передать точный тип данных (ТипОбъектаXDTO). Если тип узла объявлен в XSD локально (анонимный тип), получить его можно через свойство родителя или через цепочку метаданных типа: Родитель.Свойства().Получить("ИмяСвойства").Тип либо через ВладеющееСвойство.Тип.

Пошаговое добавление элементов в коллекцию

Рассмотрим практическую реализацию задачи. Допустим, у нас есть входящий ОбъектXDTO, в котором нужно заполнить блок дополнительных сведений из таблицы значений или табличной части объекта 1С.

Разберем по шагам логику наполнения:

  1. Проверяем наличие исходных данных для заполнения, чтобы не создавать пустые узлы.
  2. Находим целевой узел (в нашем случае — блок СодИнфГО документа).
  3. Убеждаемся, что в схеме узла действительно описано требуемое свойство ИнфПол, используя безопасный метод Свойства().Получить().
  4. Создаем новый экземпляр составного типа ИнфПол с помощью фабрики XDTO.
  5. В цикле обходим строки с данными, генерируем элементы ТекстИнф, заполняем их свойства и добавляем во вложенный список.
  6. Помещаем сформированный блок ИнфПол в родительскую коллекцию документа.

Посмотрим на пример программного кода, решающего данную задачу:


Если НЕ (Объект.ДанныеИнфПол.Количество() = 0) Тогда
    СодИнфГО = ОбъектXDTO.Документ.СодИнфГО;
    
    // Проверяем наличие свойства в схеме XDTO
    Если НЕ (СодИнфГО.Свойства().Получить("ИнфПол") = Неопределено) Тогда
        
        // Создаем экземпляр ИнфПол по типу его свойства
        ИнфПол = СтруктураСФабрикой.Фабрика.Создать(ОбъектXDTO.Документ.СодИнфГО.ИнфПол.ВладеющееСвойство.Тип);
        
        Для Каждого врСтрокаТЧ Из Объект.ДанныеИнфПол Цикл
            // Создаем экземпляр ТекстИнф
            ТекстИнф = СтруктураСФабрикой.Фабрика.Создать(ИнфПол.ТекстИнф.ВладеющееСвойство.Тип);
            
            // Заполняем атрибуты (Идентиф, Значение)
            ЗаполнитьЗначенияСвойств(ТекстИнф, врСтрокаТЧ);
            
            // Добавляем заполненный узел в коллекцию строк ИнфПол
            ИнфПол.ТекстИнф.Добавить(ТекстИнф);
        КонецЦикла;
        
        // Добавляем сформированный блок в список ИнфПол документа
        ОбъектXDTO.Документ.СодИнфГО.ИнфПол.Добавить(ИнфПол);
        
    КонецЕсли;
КонецЕсли;

Важные нюансы и проверка корректности данных

При использовании процедуры ЗаполнитьЗначенияСвойств для объектов XDTO обратите внимание на следующие моменты:

  1. Соответствие типов данных: Метод ЗаполнитьЗначенияСвойств копирует значения только при совпадении имен. Если в XSD-схеме свойство строго типизировано (например, дата или число), передача неконвертированной строки может привести к ошибке сериализации.
  2. Регистр имен свойств: Имена колонок источника и атрибутов XDTO должны в точности совпадать по регистру символов, так как фабрика XDTO чувствительна к регистру.
  3. Валидация сформированного дерева: После ручного изменения дерева XDTO перед отправкой документа оператору или сохранением в файл настоятельно рекомендуется выполнить валидацию вызовом метода Фабрика.Проверить(ОбъектXDTO). Это позволит своевременно выявить нарушения порядка следования тегов (xs:sequence) или несоответствие шаблонам данных до передачи документа в криптографический модуль.
← На главную