Как записать данные в регистр сведений после загрузки объекта при обмене в Конвертации данных?

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

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

Почему не стоит использовать обработчик После загрузки объекта напрямую?

Многие разработчики пытаются записывать данные в регистры непосредственно в обработчике После загрузки. Однако здесь кроется ловушка: в момент исполнения этого кода объект может быть еще не до конца записан в базу данных или транзакция может быть не завершена. Это часто приводит к ошибкам поиска ссылок или блокировкам. Кроме того, при передаче строковых идентификаторов свойств (ПВХ) через структуру ИсходящиеДанные система часто не может корректно сопоставить переданную строку с реальным объектом метаданных на стороне приемника, если это свойство было создано пользователем в режиме 1С:Предприятие.

Пошаговое решение: отложенная запись

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

Шаг 1: Накопление данных на стороне приемника

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

Используем для этого массив, который предварительно инициализируем в параметрах конвертации:


// В обработчике 'После загрузки' документа
// Объект — это ссылка на загруженный документ
Если Объект.ЭтоНовый() Тогда
    СсылкаНаДокумент = Объект.ПолучитьСсылкуНового();
Иначе
    СсылкаНаДокумент = Объект.Ссылка;
КонецЕсли;

// Сохраняем данные во временный массив в параметрах
ДанныеДляРегистра = Новый Структура;
ДанныеДляРегистра.Вставить("Объект", СсылкаНаДокумент);
ДанныеДляРегистра.Вставить("Значение", Источник.ДатаППС); // Данные из источника

Параметры.МассивДопСведений.Добавить(ДанныеДляРегистра);

Шаг 2: Финальная запись в После загрузки данных

Обработчик После загрузки данных конвертации запускается один раз в самом конце процесса. К этому моменту все документы уже созданы и зафиксированы в информационной базе. Это идеальное место для пакетной записи данных в регистры.

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


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

Преимущества данного подхода

  1. Стабильность: Исключаются ошибки, связанные с попыткой записи данных в регистр до завершения записи самого документа.
  2. Корректность ссылок: Поиск ПланаВидовХарактеристик выполняется локально на стороне приемника, что гарантирует нахождение нужного элемента, даже если он был создан динамически.
  3. Производительность: Пакетная обработка записей в конце обмена работает быстрее, чем создание множества транзакций в процессе загрузки каждого объекта.
  4. Удобство поддержки: Код локализован в двух точках конвертации, что упрощает отладку и внесение изменений в будущем.

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

← На главную