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