Как передать табличную часть через входящие данные в Конвертации данных 2.1 и исправить ошибку «Поле объекта не обнаружено»?

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

При настройке обмена в конфигурации «Конвертация данных 2.1» (КД 2.1) часто возникает задача разделить один документ-источник на несколько документов-приемников (например, создать отдельное событие или документ CRM на каждую строку табличной части исходной реализации). При этом в каждый создаваемый документ требуется передать данные другой табличной части исходного документа (например, список акций или скидок).

Если пытаться передать такую табличную часть через структуру ВходящиеДанные с использованием объекта СписокЗначений, обработчик выгрузки завершает работу с ошибкой: «Поле объекта не обнаружено (ИмяРеквизита)» или «Ошибка получения коллекции подчиненных объектов из входящих данных». Проанализируем причинно-следственные связи этой проблемы и разберем корректные способы ее решения.

Выясним причину возникновения ошибки

Проанализируем механику работы обработчика выгрузки правил конвертации объектов (ПКО) и правил конвертации группы свойств (ПКГС) при включенном флаге «Получать из входящих данных»:

  1. Когда на уровне группы свойств (ПКГС) установлен флаг получения из входящих данных, выгрузка ожидает, что во входящих данных передается коллекция (массив или таблица значений).
  2. При обходе этой коллекции обработчик обращается к свойствам каждой строки коллекции по их именам, указанным в правилах конвертации свойств (ПКС) — например, СтрокаКоллекции.АкцияТЧ.
  3. Если внутри коллекции элементов передать объекты типа СписокЗначений, то обращение к реквизиту по имени вызовет ошибку Поле объекта не обнаружено, так как у элементов списка значений нет произвольных именованных реквизитов.

Способ 1. Использование массива структур (Рекомендуемый подход)

Разберем, как правильно сформировать коллекцию для передачи во входящие данные. Каждый элемент передаваемого массива должен являться объектом типа Структура, ключи которого строго совпадают с именами реквизитов приемника или именами входящих данных в ПКС.

Рассмотрим пример правильного заполнения структуры в обработчике:


Табл = Источник.Товары;

Для Каждого СтрокаТЧ Из Табл Цикл

    СтрВыборкаДанных = Новый Структура;
    СтрВыборкаДанных.Вставить("Номер", НовыйНомер);
    СтрВыборкаДанных.Вставить("Дата", Источник.Дата);
    СтрВыборкаДанных.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
    СтрВыборкаДанных.Вставить("Количество", СтрокаТЧ.Количество);
    СтрВыборкаДанных.Вставить("Сумма", СтрокаТЧ.Сумма);

    // Формируем массив структур вместо списка значений
    МассивАкций = Новый Массив; 
    
    Для Каждого СтрокаАкция Из Источник.Акции Цикл 
        СтрАкция = Новый Структура;
        СтрАкция.Вставить("АкцияТЧ", СтрокаАкция.АкцияТЧ);
        МассивАкций.Добавить(СтрАкция); 
    КонецЦикла;    

    СтрВыборкаДанных.Вставить("ТЧАкции", МассивАкций);

    // Выгружаем объект по правилу, передавая подготовленную структуру
    ВыгрузитьПоПравилу(, , СтрВыборкаДанных, , "РеализацияЦРМ");

КонецЦикла;

Отказ = Истина;

Способ 2. Использование Таблицы Значений

Альтернативный вариант — передача в качестве свойства ТЧАкции полноценного объекта ТаблицаЗначений. Имена колонок таблицы должны совпадать с именами входящих данных в соответствующих ПКС.

Посмотрим на пример формирования таблицы значений:


ТЧАкции = Новый ТаблицаЗначений;
ТЧАкции.Колонки.Добавить("АкцияТЧ");

Для Каждого СтрокаАкция Из Источник.Акции Цикл 
    НоваяСтр = ТЧАкции.Добавить();
    НоваяСтр.АкцияТЧ = СтрокаАкция.АкцияТЧ;
КонецЦикла;

СтрВыборкаДанных.Вставить("ТЧАкции", ТЧАкции);

Настройка правил в интерфейсе «Конвертации данных 2.1»

Чтобы выгрузка сработала без ошибок, проверим настройки правил конвертации в КД 2.1:

  1. Настройка ПКГС (группа свойств табличной части):

    Установите флаг «Получать из входящих данных». В поле «Имя свойства входящих данных» укажите имя ключа из структуры (в нашем примере: ТЧАкции).

  2. Настройка ПКС (подчиненные реквизиты табличной части):

    Для свойства (например, АкцияТЧ) поле «Источник» оставьте пустым. Поле «Приемник» должно указывать на реквизит табличной части приемника. Убедитесь, что имя ключа в структуре/колонке совпадает с именем источника во входящих данных.

Способ 3. Перенос логики в ПВД (Архитектурное решение)

Вызов функции ВыгрузитьПоПравилу внутри обработчиков событий ПКО (например, в ПередОбработкойВыгрузкиГруппыСвойств) с последующим установкой Отказ = Истина является обходным механизмом. Подобную логику расщепления объектов рекомендуется выносить в Правило выгрузки данных (ПВД) с режимом выборки «Произвольный алгоритм».

Рассмотрим порядок настройки ПВД:

  1. Создайте новое Правило выгрузки данных и укажите способ выборки «Произвольный алгоритм».
  2. В обработчике «Перед обработкой» напишите запрос, который выберет шапку документа, строки товаров и подчиненные акции.
  3. В цикле по результатам запроса сгруппируйте данные и вызовите ВыгрузитьПоПравилу, передавая входящие данные в параметр правила.

Этот подход делает структуру правил конвертации прозрачной, исключает рекурсивные вызовы и предотвращает ошибки при работе с планами обмена и правилами регистрации объектов (ПРО).

← На главную