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