При настройке обмена в конфигурации «Конвертация данных 2.1» (КД 2.1) часто возникает задача разделить один документ-источник на несколько документов-приемников (например, создать отдельное событие или документ CRM на каждую строку табличной части исходной реализации). При этом в каждый создаваемый документ требуется передать данные другой табличной части исходного документа (например, список акций или скидок).
Если пытаться передать такую табличную часть через структуру ВходящиеДанные с использованием объекта СписокЗначений, обработчик выгрузки завершает работу с ошибкой: «Поле объекта не обнаружено (ИмяРеквизита)» или «Ошибка получения коллекции подчиненных объектов из входящих данных». Проанализируем причинно-следственные связи этой проблемы и разберем корректные способы ее решения.
Проанализируем механику работы обработчика выгрузки правил конвертации объектов (ПКО) и правил конвертации группы свойств (ПКГС) при включенном флаге «Получать из входящих данных»:
СтрокаКоллекции.АкцияТЧ.СписокЗначений, то обращение к реквизиту по имени вызовет ошибку Поле объекта не обнаружено, так как у элементов списка значений нет произвольных именованных реквизитов.Разберем, как правильно сформировать коллекцию для передачи во входящие данные. Каждый элемент передаваемого массива должен являться объектом типа Структура, ключи которого строго совпадают с именами реквизитов приемника или именами входящих данных в ПКС.
Рассмотрим пример правильного заполнения структуры в обработчике:
Табл = Источник.Товары;
Для Каждого СтрокаТЧ Из Табл Цикл
СтрВыборкаДанных = Новый Структура;
СтрВыборкаДанных.Вставить("Номер", НовыйНомер);
СтрВыборкаДанных.Вставить("Дата", Источник.Дата);
СтрВыборкаДанных.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
СтрВыборкаДанных.Вставить("Количество", СтрокаТЧ.Количество);
СтрВыборкаДанных.Вставить("Сумма", СтрокаТЧ.Сумма);
// Формируем массив структур вместо списка значений
МассивАкций = Новый Массив;
Для Каждого СтрокаАкция Из Источник.Акции Цикл
СтрАкция = Новый Структура;
СтрАкция.Вставить("АкцияТЧ", СтрокаАкция.АкцияТЧ);
МассивАкций.Добавить(СтрАкция);
КонецЦикла;
СтрВыборкаДанных.Вставить("ТЧАкции", МассивАкций);
// Выгружаем объект по правилу, передавая подготовленную структуру
ВыгрузитьПоПравилу(, , СтрВыборкаДанных, , "РеализацияЦРМ");
КонецЦикла;
Отказ = Истина;
Альтернативный вариант — передача в качестве свойства ТЧАкции полноценного объекта ТаблицаЗначений. Имена колонок таблицы должны совпадать с именами входящих данных в соответствующих ПКС.
Посмотрим на пример формирования таблицы значений:
ТЧАкции = Новый ТаблицаЗначений;
ТЧАкции.Колонки.Добавить("АкцияТЧ");
Для Каждого СтрокаАкция Из Источник.Акции Цикл
НоваяСтр = ТЧАкции.Добавить();
НоваяСтр.АкцияТЧ = СтрокаАкция.АкцияТЧ;
КонецЦикла;
СтрВыборкаДанных.Вставить("ТЧАкции", ТЧАкции);
Чтобы выгрузка сработала без ошибок, проверим настройки правил конвертации в КД 2.1:
Установите флаг «Получать из входящих данных». В поле «Имя свойства входящих данных» укажите имя ключа из структуры (в нашем примере: ТЧАкции).
Для свойства (например, АкцияТЧ) поле «Источник» оставьте пустым. Поле «Приемник» должно указывать на реквизит табличной части приемника. Убедитесь, что имя ключа в структуре/колонке совпадает с именем источника во входящих данных.
Вызов функции ВыгрузитьПоПравилу внутри обработчиков событий ПКО (например, в ПередОбработкойВыгрузкиГруппыСвойств) с последующим установкой Отказ = Истина является обходным механизмом. Подобную логику расщепления объектов рекомендуется выносить в Правило выгрузки данных (ПВД) с режимом выборки «Произвольный алгоритм».
Рассмотрим порядок настройки ПВД:
ВыгрузитьПоПравилу, передавая входящие данные в параметр правила.Этот подход делает структуру правил конвертации прозрачной, исключает рекурсивные вызовы и предотвращает ошибки при работе с планами обмена и правилами регистрации объектов (ПРО).