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