При интеграции или миграции данных между конфигурациями 1С часто возникает задача перенести накопленную историю кадровых изменений без переноса всей массы первичных кадровых документов (приказов о приеме, переводе, увольнении). В конфигурации «Бухгалтерия предприятия КОРП» редакции 3.0 регистр сведений КадроваяИсторияСотрудников имеет режим записи Подчинение регистратору, что не позволяет просто так загрузить записи без документа, выступающего регистратором этих движений.
Разберем по шагам, как правильно настроить правила обмена в конфигурации «Конвертация данных» (КД 2.1), какой документ выбрать в качестве регистратора, как передать движения программно и как обойти характерные ошибки загрузки.
Проанализируем состав регистраторов регистра КадроваяИсторияСотрудников в типовой конфигурации БП 3.0. По умолчанию документ ВводНачальныхОстатков не делает движений по кадровым регистрам. Если попытаться назначить его регистратором в правилах обмена, платформа выдаст ошибку либо проигнорирует движения.
Для решения задачи можно использовать следующие варианты:
ОперацияБух (Операция, введенная вручную): содержит движения по кадровым регистрам сведений, однако в организациях со строгим разграничением прав доступ к нему обычно ограничен исключительно бухгалтерией.КорректировкаРегистров: типовой документ для конфигураций ERP и КА, который может быть добавлен в нетиповую БП КОРП специально для фиксации технических корректировок и движений по любым регистрам.КадровыйПеревод / ПриемНаРаботу: создание единого документа-заглушки без заполнения шапки и реквизитов, куда программно «привязываются» все наборы записей.Рассмотрим подробнее реализацию переноса с использованием произвольного алгоритма в Правиле выгрузки данных (ПВД). В источнике (ЗУП 2.5) мы выбираем записи регистра кадровых данных, формируем структуру и передаем ее в Правило конвертации объектов (ПКО) через параметр ИсходящиеДанные.
В ПВД со способом выборки Произвольный алгоритм в обработчике «Перед обработкой» пропишем выборку записей по каждой организации:
Выборка_Организации = Запросы.РС_РаботникиОрганизаций_ТолькоОрганизации.Выполнить().Выбрать();
Пока Выборка_Организации.Следующий() Цикл
Сообщить("Выгрузка записей кадровой истории по организации: " + Выборка_Организации.Организация.Наименование);
Запросы.РС_РаботникиОрганизаций.УстановитьПараметр("Организация", Выборка_Организации.Организация);
РезультатЗапроса = Запросы.РС_РаботникиОрганизаций.Выполнить();
КадроваяИсторияСотрудников = РезультатЗапроса.Выгрузить();
// Формируем структуру исходящих данных для передачи в ПКО документа-регистратора
ИсходящиеДанные = Новый Структура("Организация, Дата, ТаблицаРегистровСведений, КадроваяИсторияСотрудников");
ИсходящиеДанные.Организация = Выборка_Организации.Организация;
ИсходящиеДанные.Дата = ДатаВводаОстатков; // Дата формирования регистратора
// Передаем таблицу списка регистров (актуально для Корректировки регистров / Операции)
ТабРегистров = Новый ТаблицаЗначений;
ТабРегистров.Колонки.Добавить("Имя");
СтрокаРегистра = ТабРегистров.Добавить();
СтрокаРегистра.Имя = "КадроваяИсторияСотрудников";
ИсходящиеДанные.ТаблицаРегистровСведений = ТабРегистров;
ИсходящиеДанные.КадроваяИсторияСотрудников = КадроваяИсторияСотрудников;
// Явный вызов правила конвертации
ВыгрузитьПоПравилу(,, ИсходящиеДанные,, "КорректировкаРС_КадроваяИсторияСотрудников");
КонецЦикла;
Посмотрим на пример, когда требуется собрать и передать данные шапки и набора записей в рамках одной таблицы значений, передаваемой через ВыборкаДанных в ПВД:
ТабДок = Новый ТаблицаЗначений;
ТабДок.Колонки.Добавить("Организация");
ТабДок.Колонки.Добавить("Дата");
ТабДок.Колонки.Добавить("Комментарий");
ТабДок.Колонки.Добавить("КадроваяИсторияСотрудников");
Запрос = Новый Запрос(ТекстЗапросаКадров);
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Выборка = Запрос.Выполнить().Выбрать();
НоваяСтрокаТабДок = ТабДок.Добавить();
НоваяСтрокаТабДок.Организация = ВыбраннаяОрганизация;
НоваяСтрокаТабДок.Дата = ТекущаяДата();
НоваяСтрокаТабДок.Комментарий = "Перенос кадровой истории из ЗУП 2.5";
// Заполняем движения регистра
НоваяСтрокаТабДок.КадроваяИсторияСотрудников = Запрос.Выполнить().Выгрузить();
ВыборкаДанных = ТабДок;
Разберем по шагам структуру ПКО для документа-регистратора:
ДокументСсылка.КорректировкаРегистров (или ОперацияБух).Организация, Дата, Комментарий), установив флаг Получить из входящих данных.КадроваяИсторияСотрудников.Сотрудник, Период, Подразделение, Должность, ВидСобытия и др.), сопоставляя имена колонок выгруженной таблицы с полями регистра-приемника.Выясним причины ошибок, которые часто возникают при загрузке движений кадровой истории в БП 3.0, и способы их решения:
1. Ошибка «Запись с такими ключевыми полями существует»
В подчиненных регистрах сведений уникальность контролируется по составному ключу Регистратор + Период + [Все измерения]. В ЗУП 2.5 записи на одну дату по одному сотруднику могли быть созданы разными документами. Когда все эти записи попадают в один общий документ-регистратор в БП 3.0, их ключи дублируются. Для предотвращения ошибки необходимо в запросе выгрузки группировать записи или удалять дубли по периоду и измерениям.
2. Блокировка загрузки датой запрета изменения данных
При загрузке исторических движений за прошлые годы механизм БСП «Даты запрета изменения данных» может заблокировать запись объекта. Чтобы обойти это ограничение штатно без изменения кода конфигурации:
ОбменДанными.Загрузка = Истина.3. Обновление текущего состояния сотрудников в БП 3.0
В конфигурации БП 3.0 списки сотрудников и печатные формы используют вспомогательный регистр сведений Текущие кадровые данные сотрудников. Так как при прямой загрузке набора записей типовые процедуры проведения кадровых документов не вызываются, после завершения переноса данных необходимо запустить штатную процедуру пересчета текущего кадрового состояния сотрудников через обработчик После загрузки данных или регламентное задание.