При реализации сложных обменов между конфигурациями (например, ЗУП 3.1 и УПП 1.3) часто возникает задача переноса кадровых данных. Особенность таких задач заключается в том, что в базе-источнике данные могут храниться в одном регистре, а в базе-приемнике их необходимо «привязать» к специфическому регистратору, такому как документ ПереносДанных. Это позволяет сохранить структуру движений и обеспечить корректную работу типовых отчетов в приемнике.
В этой статье мы подробно разберем, как правильно настроить правила конвертации объектов (ПКО) и правил выгрузки данных (ПВД) для решения этой задачи, проанализируем программные способы создания документа-регистратора «на лету» и рассмотрим важные нюансы синхронизации.
Рассмотрим ситуацию: нам нужно перенести данные из регистра КадроваяИсторияСотрудников (ЗУП 3.1) в регистр РаботникиОрганизаций (УПП 1.3). В УПП этот регистр является подчиненным регистратору. Прямого аналога документа в источнике может не существовать, поэтому мы будем создавать виртуальный документ ПереносДанных в приемнике и назначать его регистратором для каждой записи.
Для решения мы можем использовать два основных подхода:
Значение свойства Регистратор.Прежде всего, нам необходимо создать ПКО для самого документа-приемника ПереносДанных. Поскольку в источнике (ЗУП 3.1) такого документа для конкретных записей регистра может не быть, ПКО создается с пустым источником.
Важно правильно настроить синхронизацию, чтобы при каждом обмене не создавались дубли. Для этого в обработчике ПоляПоиска или на закладке «Настройки» ПКО укажем ключевые реквизиты: Номер, Дата и Организация.
Рассмотрим пример кода в обработчике ПриВыгрузке для программного формирования структуры документа:
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Номер", "ЗУП-" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd"));
ВходящиеДанные.Вставить("Дата", НачалоДня(ТекущаяДата()));
ВходящиеДанные.Вставить("Организация", Справочники.Организации.НайтиПоНаименованию("ООО Наша Организация"));
ВходящиеДанные.Вставить("ПериодРегистрации", НачалоМесяца(ТекущаяДата()));
// Инициируем выгрузку по правилу документа
ВыгрузитьПоПравилу(,, ВходящиеДанные, , "ПереносДанных");
Для переноса записей регистра сведений лучше всего использовать Правило Выгрузки Данных (ПВД) с типом «Произвольный алгоритм». Проанализируем ситуацию: нам нужно выбрать данные запросом и для каждой строки сформировать запись регистра в приемнике.
В обработчике ПВД ПередОбработкой мы пишем запрос к регистру КадроваяИсторияСотрудников. Полученную выборку мы обходим в цикле и передаем данные в ПКО регистра сведений.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений.КадроваяИсторияСотрудников ГДЕ ...";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ВходящиеДанныеРегистра = Новый Структура;
ВходящиеДанныеРегистра.Вставить("Период", Выборка.Период);
ВходящиеДанныеРегистра.Вставить("Сотрудник", Выборка.Сотрудник);
ВходящиеДанныеРегистра.Вставить("Организация", Выборка.Организация);
ВходящиеДанныеРегистра.Вставить("Должность", Выборка.Должность);
// Ссылаемся на наш документ-регистратор
// Здесь можно передать структуру для поиска/создания документа
ВходящиеДанныеРегистра.Вставить("Регистратор", Параметры.СсылкаНаДокументПереноса);
ВыгрузитьПоПравилу(,, ВходящиеДанныеРегистра, , "РаботникиОрганизаций");
КонецЦикла;
Теперь выясним, как правильно принять эти данные в ПКО регистра сведений. В правиле конвертации свойств (ПКС) для реквизита Регистратор нужно выполнить следующие настройки:
ПередВыгрузкой ПКС прописать логику получения ссылки.Если вы решили использовать совет опытных коллег, можно применить передачу структуры в переменную Значение. Это позволит системе Конвертации Данных найти объект в приемнике или создать его по описанию:
// В обработчике ПКС "Регистратор" ПередВыгрузкой
СтруктураРегистратора = Новый Структура;
СтруктураРегистратора.Вставить("Номер", "ПЕРЕНОС-001");
СтруктураРегистратора.Вставить("Дата", ТекущаяДата());
СтруктураРегистратора.Вставить("Организация", ОбъектКоллекции.Организация);
Значение = СтруктураРегистратора;
Важный нюанс: для ПКО документа ПереносДанных в этом случае должен быть включен флаг «Продолжить поиск по полям поиска, если по идентификатору не найден».
При переносе в РаботникиОрганизаций важно помнить, что этот регистр в УПП имеет измерения и ресурсы, которые могут отсутствовать в ЗУП 3.1 в явном виде. Например, реквизит ЗанимаемыхСтавок или дополнительные сведения о графике работы.
Разберем, как дополнить данные. Мы можем использовать функции типовых модулей источника (ЗУП 3.1) прямо в правилах обмена, если обмен запускается на стороне источника:
// Получение дополнительных данных перед выгрузкой записи
ДанныеГрафика = КадровыйУчет.КадровыеДанныеСотрудников(Истина, Выборка.Сотрудник, "ГрафикРаботы", Выборка.Период);
Если ДанныеГрафика.Количество() > 0 Тогда
ВходящиеДанные.Вставить("ГрафикРаботы", ДанныеГрафика[0].ГрафикРаботы);
КонецЕсли;
Рассмотрим ситуацию, когда данных очень много. Вызов ВыгрузитьПоПравилу для каждой строки может замедлить процесс. Проанализируем более производительный путь:
Вместо того чтобы выгружать каждую запись отдельно, мы можем сформировать таблицу значений со всеми движениями и передать её в ВходящиеДанные документа ПереносДанных. В самом документе в обработчике ПослеЗагрузки мы программно запишем набор записей регистра.
Рекомендации по стабильности обмена:
Период записи регистра значением даты кадрового события, а не датой документа.ПереносДанных) в приемнике корректно заполнены реквизиты, влияющие на проведение, если конфигурация выполняет проверки при записи.ПередЗагрузкой установите Объект.Движения.РаботникиОрганизаций.Записывать = Истина;.Таким образом, мы обеспечим надежную связку между данными регистра и универсальным регистратором в целевой базе, сохранив целостность кадровой истории сотрудников.