Почему в ЗУП 3 при использовании документа «Перенос данных» не заполняется интервальный регистр кадровой истории

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

При миграции данных в 1С:Зарплата и управление персоналом 3.1 (включая локализацию для Казахстана) специалисты часто сталкиваются с ситуацией, когда записи успешно попадают в основной регистр КадроваяИсторияСотрудников, но интервальный регистр КадроваяИсторияСотрудниковИнтервальный остается пустым. В результате отчеты, такие как Личная карточка (Т-2), не отображают историю перемещений сотрудника или показывают только одну запись. Разберем подробно, почему так происходит, как работают механизмы системы и какими способами можно восстановить целостность данных.

Механизм интервальных регистров в ЗУП 3

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

Ключевая особенность заключается в том, что интервальные регистры являются вторичными. Они не заполняются документами напрямую. В типовой конфигурации обновление этих таблиц происходит в модуле набора записей первичного (основного) регистра в процедуре ПриЗаписи. Рассмотрим, как это выглядит в программном коде:


Процедура ПриЗаписи(Отказ, Замещение)
    
    // Проверка, не отключена ли бизнес-логика специальным свойством
    Если ЗарплатаКадры.ОтключитьБизнесЛогикуПриЗаписи(ЭтотОбъект) Тогда
        Возврат;
    КонецЕсли;
    
    // Вызов механизмов контроля и обновления интервалов
    ЗарплатаКадрыПериодическиеРегистры.КонтрольИзмененийПриЗаписи(ЭтотОбъект);
    
    // Сама процедура пересчета интервальной таблицы
    ОбновитьИнтервальныйРегистрСведений();
КонецПроцедуры

Почему «Перенос данных» не создает записи в интервальном регистре

Выясним причину, по которой документ Перенос данных часто игнорирует этот механизм. При программной записи данных или при использовании универсальных обработок обмена данными почти всегда устанавливается свойство ОбменДанными.Загрузка = Истина. Для платформы 1С это сигнал, что проверки и сопутствующие действия при записи выполнять не нужно, чтобы не замедлять процесс и не вызвать конфликтов блокировок.

В ЗУП 3 реализована проверка: если установлена «Загрузка», то вызов ОбновитьИнтервальныйРегистрСведений() блокируется. Таким образом, первичный регистр (например, КадроваяИсторияСотрудников) получает данные, а вторичный (интервальный) — нет. Это приводит к тому, что запросы кадровых отчетов, ориентированные на интервальные таблицы, не находят данных.

Варианты решения проблемы

Рассмотрим несколько способов исправления ситуации, в зависимости от того, на каком этапе находится ваш перенос данных.

Способ 1. Использование «Реестра кадровых приказов»

Если вы выполняете так называемый «упрощенный» или «рекомендованный» перенос данных на дату начала эксплуатации, важно понимать методологию 1С. В этом режиме история до даты переноса записывается не в кадровые документы, а в специализированный регистр «Реестр кадровых приказов».

Проанализируем преимущества этого подхода:

  1. Минимизация справочников: Вам не нужно создавать в базе подразделения и должности, которые были расформированы 5–10 лет назад. В реестре эти данные хранятся в виде строк.
  2. Работа отчетов: Отчет Т-2 в ЗУП 3 спроектирован как «сэндвич». Он сначала ищет данные в актуальных документах (Приемы, Переводы), а если их нет за нужный период — обращается к «Реестру кадровых приказов».

Если ваша цель — корректная Т-2, убедитесь, что данные о приказах перенесены именно в этот регистр. В этом случае заполнение КадроваяИсторияСотрудниковИнтервальный для старых периодов может вообще не потребоваться.

Способ 2. Принудительное обновление интервалов кодом

Если данные уже загружены в первичный регистр и вам необходимо «протолкнуть» их в интервальный, можно воспользоваться программным вызовом типовых функций. Это можно сделать через внешнюю обработку. Посмотрим на пример кода, который инициирует обновление:


// Пример принудительного обновления для конкретного сотрудника или списка
Менеджер = РегистрыСведений.КадроваяИсторияСотрудников.СоздатьНаборЗаписей();
// Устанавливаем отбор по сотруднику, если нужно
// Менеджер.Отбор.Сотрудник.Установить(ВыбранныйСотрудник);

// Важно: записываем пустой или существующий набор без флага Загрузка, 
// чтобы сработала бизнес-логика в модуле набора записей.
// Либо вызываем напрямую экспортную процедуру обновления.
ЗарплатаКадрыПериодическиеРегистры.ОбновитьВсеИнтервальныеРегистрыСведений();

Также в типовых конфигурациях существует скрытая возможность использования дополнительного свойства при загрузке. Если при записи набора записей установить ДополнительныеСвойства.Вставить("ПроверятьБизнесЛогикуПриЗаписи", Истина), то даже в режиме обмена данными система попытается выполнить обновление интервалов.

Способ 3. Перепроведение документов или «Начальной штатной расстановки»

Разберем ситуацию, когда данные вносились через документ Начальная штатная расстановка. Этот документ делает движения по многим регистрам сразу. Если интервалы не заполнились, попробуйте следующее:

  1. Снимите документ с проведения.
  2. Проверьте, очистились ли записи в регистрах.
  3. Проведите документ заново в обычном пользовательском режиме (не программно).

При проведении из интерфейса флаг «Загрузка» не устанавливается, и интервальные таблицы заполнятся автоматически.

Специфика истории отпусков

Посмотрим на ситуацию с отпусками, упомянутую в обсуждении. Для того чтобы история отпусков корректно отображалась в Т-2, данные должны находиться в регистре «Реестр отпусков». Обычного переноса остатков отпусков недостаточно для заполнения Раздела VIII личной карточки. При переносе данных обязательно заполняйте этот реестр, чтобы система «видела» факты предоставления отпусков в прошлых периодах.

Особенности локализации для Казахстана (КЗ)

Проанализируем нюансы для версии КЗ. В данной локализации печатная форма Т-2 и другие кадровые отчеты могут дополнительно опираться на регистр Основные данные контракта сотрудника. Если вы переносите историю, но не заполняете сведения о трудовых договорах в этом регистре, отчет может выводить информацию некорректно или не полностью, даже если кадровые приказы на месте.

Резюме и рекомендации

Для успешного завершения переноса данных в сжатые сроки мы рекомендуем придерживаться следующего алгоритма:

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

Помните, что архитектура ЗУП 3 намного сложнее, чем в версии 2.5, и простого «закидывания» данных в один регистр часто недостаточно для корректной работы всех механизмов программы.

← На главную