Как в Конвертации данных 2.1 передать реквизит из ПКС в ПКГС при отсутствии коллекции в источнике?

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

При работе с инструментом «1С:Конвертация данных 2.1» разработчики часто сталкиваются с ситуацией, когда структура данных источника и приемника существенно различается. Типичный пример: в информационной базе источнике значение хранится в обычном реквизите (например, ТипЦен в шапке документа), а в базе приемнике это же значение должно попасть в табличную часть или другую группу свойств (ПКГС). Поскольку в источнике нет соответствующей коллекции (табличной части), стандартное сопоставление полей не срабатывает, вызывая ошибку «Поле объекта не обнаружено».

В этой статье мы подробно разберем, как обойти это ограничение, программно сформировать структуру данных и передать её в правила конвертации группы свойств.

Анализ проблемы: почему возникает ошибка?

Когда мы настраиваем ПКГС (Правило конвертации группы свойств), система по умолчанию ожидает, что в объекте-источнике существует коллекция с тем же именем или указанная в настройках. Если мы пытаемся передать одиночное значение ТипЦен напрямую, механизм конвертации не находит итерируемый объект (таблицу или список) и прерывает выгрузку. Нам необходимо создать «виртуальную» коллекцию на лету.

Решение задачи через использование «Входящих данных»

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

Шаг 1. Подготовка данных в ПКО (Обработчик «Перед выгрузкой»)

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


// 1. Получаем значение из реквизита источника
ТипЦенЗначение = Источник.ТипЦен; 

// 2. Создаем структуру, которую ожидает ПКГС (имитируем таблицу)
ТаблицаДляГруппы = Новый ТаблицаЗначений;
ТаблицаДляГруппы.Колонки.Добавить("ТипЦен"); 

// 3. Заполняем строку таблицы
НоваяСтрока = ТаблицаДляГруппы.Добавить();
НоваяСтрока.ТипЦен = ТипЦенЗначение;

// 4. Инициализируем ВходящиеДанные
// Важно: проверяем, не были ли они созданы ранее, чтобы не затереть данные из ПВД
Если ВходящиеДанные = Неопределено Тогда
    ВходящиеДанные = Новый Структура;
КонецЕсли;

// 5. Помещаем нашу таблицу в структуру под уникальным ключом
ВходящиеДанные.Вставить("МояВиртуальнаяКоллекцияТиповЦен", ТаблицаДляГруппы);

В данном примере мы создаем таблицу с одной колонкой и одной строкой. Если логика требует переноса нескольких значений в группу, мы можем добавить в таблицу столько строк, сколько необходимо.

Шаг 2. Настройка ПКГС в правилах выгрузки

После того как данные подготовлены в коде, нам нужно правильно настроить само правило группы свойств в дереве ПКС:

  1. Найдите нужную группу свойств (ПКГС) в списке правил.
  2. Установите флажок «Получить из входящих данных». Это критически важный момент: он сообщает системе, что не нужно искать данные в объекте Источник, а следует обратиться к структуре ВходящиеДанные.
  3. В поле «Имя свойства источника» укажите тот самый ключ, который мы использовали в коде (в нашем примере это "МояВиртуальнаяКоллекцияТиповЦен").

Шаг 3. Настройка вложенных ПКС

Внутри ПКГС находятся правила для конкретных реквизитов (например, реквизит ТипЦен внутри табличной части приемника). Их также нужно настроить:

Разбор типичной ошибки: «Значение не является значением объектного типа (Вставить)»

Выясним причину популярной ошибки, на которую жалуются пользователи форумов. Если вы вызываете ВходящиеДанные.Вставить(...), а система выдает ошибку, это означает, что переменная ВходящиеДанные не является структурой.

Такое случается, если ВходящиеДанные были инициализированы как Неопределено или им было присвоено значение другого типа в ПВД (Правилах выгрузки данных). Всегда используйте проверку типа перед обращением к методам структуры. Рассмотрим безопасный вариант инициализации:


Если ТипЗнч(ВходящиеДанные) <> Тип("Структура") Тогда
    ВходящиеДанные = Новый Структура;
КонецЕсли;
ВходящиеДанные.Вставить("ИмяКоллекции", ТаблицаДанных);

Альтернативный метод: Использование «Исходящих данных»

Иногда требуется передать значение не просто внутри одного объекта, а между разными правилами конвертации. В этом случае проанализируем использование ИсходящихДанных:

В ПКС в обработчике «Перед выгрузкой» мы определяем структуру: ИсходящиеДанные = Новый Структура("ТипЦен", Источник.ТипЦен);. Эти данные автоматически станут «входящими» для того ПКО, которое указано в данном правиле. Это более гибкий способ, если целевая группа свойств требует сложной логики сопоставления объектов.

Дополнительные рекомендации

При использовании программного формирования коллекций следует помнить о нескольких нюансах:

Таким образом, мы рассмотрели универсальный способ передачи данных из реквизита в группу свойств. Использование структуры ВходящиеДанные в сочетании с программным созданием объектов ТаблицаЗначений или Массив позволяет реализовать практически любую сложную трансформацию данных при переходе из одной конфигурации в другую.

← На главную