При настройке обмена данными через конфигурацию «Конвертация данных 3» (КД 3) и использовании универсального формата EnterpriseData разработчики часто сталкиваются с проблемами передачи коллекций и табличных частей. Проанализируем типичную ситуацию: при попытке передать структуру, соответствие или таблицу значений в свойство формата XDTO, 1С выдает ошибку о том, что обязательное свойство не заполнено. Либо, если передается структура или соответствие, система воспринимает объект как таблицу значений, пытается обратиться к отсутствующему свойству Колонки и завершается с ошибкой. Разберем по шагам, почему это происходит и как правильно решить данную задачу.
Выясним причину такого поведения системы. Механизмы обмена в КД 3 и платформенная XDTO-сериализация строго контролируют передаваемые типы данных. Если в свойство, где по формату ожидается набор строк (коллекция или табличная часть), передать объект типа Структура или Соответствие, сериализатор 1С может попытаться автоматически привести переданный объект к итерируемому типу. Платформа предполагает, что передана ТаблицаЗначений. Из-за этого происходит внутреннее обращение к свойству Колонки, которого у структуры или соответствия нет. Именно это и вызывает критическую ошибку.
Вторая частая ошибка — неправильная настройка самого свойства в правилах. Использование элемента «Группа свойств» в схеме XDTO вместо конкретного комплексного типа (например, ОбщиеСвойства) приводит к тому, что система не может инстанцировать объект. Группы свойств в XML-схемах предназначены исключительно для логической маршрутизации, а для хранения реальных данных в структуре ДанныеXDTO требуется конкретный описанный тип.
Рассмотрим решение проблемы, которое помогло автору вопроса. Ошибка заключалась в неверном конфигурировании свойств при добавлении ПКС (правила конвертации свойств). Разработчик ошибочно создавал группу свойств формата. Для корректной работы необходимо было создать само свойство и назначить ему конкретный тип, в данном случае — ОбщиеСвойства.
После правильного указания типа свойства платформа перестает ругаться на незаполненность обязательных полей и корректно воспринимает передаваемые данные.
Разберем подробнее, как безошибочно передавать табличные части в обработчиках КД 3 (например, в обработчике ПриОтправкеДанных). Посмотрим на проверенные способы:
ДанныеXDTO всегда используйте тип ТаблицаЗначений. Не пытайтесь заменить его структурами или массивами структур, если формат строго ожидает таблицу.
ДанныеXDTO.Вставить("ИмяТабличнойЧастиВФормате", ТаблицаЗначений);
ТаблицыЗначений должны в точности соответствовать именам свойств, которые определены в правилах (свойствах формата). Таблицу можно заполнить выгрузкой из исходной табличной части объекта или сформировать прямым запросом к базе данных.ФабрикаXDTO.Создать(ТипОбъекта) и уже их помещайте в итоговую структуру.Если стандартный пакет EnterpriseData не содержит нужной вам группы свойств или табличной части, создавать их вручную через модификацию типовых схем не всегда обязательно. Рассмотрим альтернативные подходы:
1. Использование AdditionalInfo
Базовые объекты формата EnterpriseData имеют встроенное свойство AdditionalInfo. В него можно поместить структуру, которая будет содержать массивы, таблицы значений и другие дополнительные реквизиты. На стороне приемника эти данные легко прочитать и обработать в обработчике ПриКонвертацииДанныхXDTO.
2. Расширяющий XDTO-пакет
Если требуется добавить сложную группу свойств или новую таблицу в обмен, методология фирмы «1С» рекомендует использовать расширяющий XDTO-пакет. В нем вы явно прописываете новые типы, которые без конфликтов интегрируются в механизмы КД 3 через правила конвертации свойств. Это защищает от ошибок приведения типов и неверных обращений к методам несовместимых коллекций.
3. Использование ДополнительныеСвойства
На стороне получения (в правилах загрузки) удобно использовать структуру ПолученныеДанные.ДополнительныеСвойства. Туда можно временно поместить прочитанные из ДанныеXDTO таблицы, чтобы обработать их в событиях перед или при записи объекта, обходя таким образом ограничения стандартного маппинга реквизитов.