При формировании электронных перевозочных документов (ЭТрН) и электронных документов произвольного формата часто возникает задача модификации готового дерева ОбъектXDTO. В частности, требуется внести дополнительные сведения в информационные поля, такие как ИнфПол и вложенные теги ТекстИнф.
Разберем детально, как устроена работа со списочными свойствами в модели XDTO, как правильно получить тип создаваемого узла и добавить новые данные в структуру XML.
Прежде чем перейти к коду, проанализируем поведение платформы 1С при работе с XDTO:
СписокXDTO в тех случаях, когда в соответствующей схеме XSD для элемента указано ограничение количества maxOccurs > 1 или maxOccurs="unbounded".СписокXDTO создаются платформой автоматически. Попытка напрямую присвоить новое значение списочному свойству через знак равенства вызовет исключительную ситуацию «Поле объекта недоступно для записи». Работа с такими полями выполняется исключительно через методы коллекции: Добавить() или Вставить().ФабрикаXDTO.Создать() необходимо передать точный тип данных (ТипОбъектаXDTO). Если тип узла объявлен в XSD локально (анонимный тип), получить его можно через свойство родителя или через цепочку метаданных типа: Родитель.Свойства().Получить("ИмяСвойства").Тип либо через ВладеющееСвойство.Тип.Рассмотрим практическую реализацию задачи. Допустим, у нас есть входящий ОбъектXDTO, в котором нужно заполнить блок дополнительных сведений из таблицы значений или табличной части объекта 1С.
Разберем по шагам логику наполнения:
СодИнфГО документа).ИнфПол, используя безопасный метод Свойства().Получить().ИнфПол с помощью фабрики XDTO.ТекстИнф, заполняем их свойства и добавляем во вложенный список.ИнфПол в родительскую коллекцию документа.Посмотрим на пример программного кода, решающего данную задачу:
Если НЕ (Объект.ДанныеИнфПол.Количество() = 0) Тогда
СодИнфГО = ОбъектXDTO.Документ.СодИнфГО;
// Проверяем наличие свойства в схеме XDTO
Если НЕ (СодИнфГО.Свойства().Получить("ИнфПол") = Неопределено) Тогда
// Создаем экземпляр ИнфПол по типу его свойства
ИнфПол = СтруктураСФабрикой.Фабрика.Создать(ОбъектXDTO.Документ.СодИнфГО.ИнфПол.ВладеющееСвойство.Тип);
Для Каждого врСтрокаТЧ Из Объект.ДанныеИнфПол Цикл
// Создаем экземпляр ТекстИнф
ТекстИнф = СтруктураСФабрикой.Фабрика.Создать(ИнфПол.ТекстИнф.ВладеющееСвойство.Тип);
// Заполняем атрибуты (Идентиф, Значение)
ЗаполнитьЗначенияСвойств(ТекстИнф, врСтрокаТЧ);
// Добавляем заполненный узел в коллекцию строк ИнфПол
ИнфПол.ТекстИнф.Добавить(ТекстИнф);
КонецЦикла;
// Добавляем сформированный блок в список ИнфПол документа
ОбъектXDTO.Документ.СодИнфГО.ИнфПол.Добавить(ИнфПол);
КонецЕсли;
КонецЕсли;
При использовании процедуры ЗаполнитьЗначенияСвойств для объектов XDTO обратите внимание на следующие моменты:
ЗаполнитьЗначенияСвойств копирует значения только при совпадении имен. Если в XSD-схеме свойство строго типизировано (например, дата или число), передача неконвертированной строки может привести к ошибке сериализации.Фабрика.Проверить(ОбъектXDTO). Это позволит своевременно выявить нарушения порядка следования тегов (xs:sequence) или несоответствие шаблонам данных до передачи документа в криптографический модуль.