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