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