Как при обмене данными записать документ в регистр сведений базы-приемника

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Разберем по шагам, почему стандартные события модулей объектов могут не срабатывать при обмене, как правильно настроить правила конвертации данных (КД 2) и какие существуют альтернативные способы решения задачи.

Причины, по которым код не выполняется при загрузке

Выясним причину, из-за которой код записи в регистр часто не отрабатывает так, как ожидается:

  1. Флаг ОбменДанными.Загрузка: во время выполнения обмена платформа 1С автоматически устанавливает свойство Объект.ОбменДанными.Загрузка = Истина. В типовых конфигурациях в процедурах ПередЗаписью и ПриЗаписи модулей объектов установлена проверка:
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    Поэтому код, добавленный непосредственно в типовой модуль документа в базе-приемнике, при обмене попросту игнорируется.
  2. Различие между событиями «После загрузки» и «После записи объекта»: в правилах конвертации обработчик ПКО «После загрузки» выполняется до фактической записи объекта в базу данных. Ссылка на объект уже сформирована, но физически запись в таблицах СУБД еще отсутствует. Если логика требует наличия записанного документа, код следует помещать в обработчик «После записи объекта».
  3. Кэширование правил в базе-приемнике: если правила обмена загружены в информационную базу (например, в типовой план обмена на базе БСП), изменение правил в источнике не обновит логику в приемнике автоматически. Правила необходимо перезагрузить в обеих базах.

Способ 1. Запись в регистр через обработчики правил конвертации

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

Для независимого регистра сведений в обработчике ПКО «После записи объекта» базы-приемника используем МенеджерЗаписи:


Менеджер = РегистрыСведений.СлужебныеДанныеДокументов.СоздатьМенеджерЗаписи();
Менеджер.Документ = Объект.Ссылка;
Менеджер.Идентификатор = Строка(Объект.Ссылка.УникальныйИдентификатор());
Менеджер.ДатаЗаписи = ТекущаяДатаСеанса();
Менеджер.Записать(Истина);

Если регистр сведений подчинен регистратору, использовать МенеджерЗаписи нельзя. В этом случае формируем НаборЗаписей:


Набор = РегистрыСведений.РегистрСПодчинением.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Объект.Ссылка);

НоваяСтрока = Набор.Добавить();
НоваяСтрока.Период = Объект.Дата;
НоваяСтрока.Идентификатор = Строка(Объект.Ссылка.УникальныйИдентификатор());

Набор.Записать(Истина);

Способ 2. Вызов процедур общего модуля базы-приемника из правил

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

МойОбщийМодульСервер.ЗарегистрироватьДокументВРегистре(Объект.Ссылка);

Важное ограничение: общий модуль базы-приемника должен иметь установленные флаги Сервер и Внешнее соединение (если обмен выполняется через COM-подключение или регламентное задание). Если процедура объявлена в клиентском модуле, при выполнении фонового обмена возникнет ошибка выполнения.

Способ 3. Выгрузка записи регистра по правилу (на стороне источника)

Штатный механизм КД позволяет обойтись без ручного написания кода записи в приемнике. Посмотрим на алгоритм настройки:

  1. Создаем ПКО для документа и отдельное ПКО для регистра сведений.
  2. В ПКО документа в обработчике «При выгрузке» вызываем функцию ВыгрузитьПоПравилу, передавая параметры для формирования записи регистра.
  3. Механизм конвертации самостоятельно свяжет создаваемый документ с записью регистра и корректно заполнит ссылку при загрузке.

Способ 4. Реализация логики через подписку на событие в расширении

Если требуется избежать изменения правил обмена и сохранить конфигурацию на поддержке, наиболее надежным решением является использование расширения конфигурации в базе-приемнике:

  1. Создаем расширение для базы-приемника.
  2. Добавляем подписку на событие ПриЗаписи для нужного документа.
  3. В модуле обработчика подписки реализуем запись в регистр сведений:
    
    Процедура Расш_ПриЗаписиДокумента(Источник, Отказ) Экспорт
        
        // Не прерываем выполнение при ОбменДанными.Загрузка = Истина,
        // чтобы код гарантированно отработал при переносе данных
        
        Менеджер = РегистрыСведений.СлужебныеДанныеДокументов.СоздатьМенеджерЗаписи();
        Менеджер.Документ = Источник.Ссылка;
        Менеджер.Идентификатор = Строка(Источник.Ссылка.УникальныйИдентификатор());
        Менеджер.Записать(Истина);
        
    КонецПроцедуры
    

Данный подход гарантирует фиксацию данных в регистре вне зависимости от того, как именно документ попал в информационную базу — через универсальный обмен по правилам КД, через формат EnterpriseData или при интерактивном вводе пользователем.

← На главную