Как в запросе 1С:ЗУП определить подразделение сотрудника на определенную дату?

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

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

Определение подразделения на дату в ЗУП 2.5 с помощью запроса

В конфигурации 1С:ЗУП редакции 2.5 вся кадровая история сотрудников хранится в периодическом регистре сведений РаботникиОрганизаций. Для получения данных на конкретный момент времени используется виртуальная таблица СрезПоследних. В параметры виртуальной таблицы передается дата среза.

Однако простого обращения к реквизитам ПодразделениеОрганизации и Должность часто оказывается недостаточно. В ЗУП 2.5 кадровые перемещения могут регистрироваться как временные — с указанием даты возврата на предыдущее место работы. В этом случае в регистре заполняются поля завершения: ПериодЗавершения, ПодразделениеОрганизацииЗавершения, ДолжностьЗавершения.

Рассмотрим пример правильного запроса к регистру сведений с разыменованием полей завершения:


ВЫБРАТЬ
    РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
    ВЫБОР
        КОГДА &Период >= РаботникиОрганизацийСрезПоследних.ПериодЗавершения
                И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения
        ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации
    КОНЕЦ КАК Подразделение,
    ВЫБОР
        КОГДА &Период >= РаботникиОрганизацийСрезПоследних.ПериодЗавершения
                И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА РаботникиОрганизацийСрезПоследних.ДолжностьЗавершения
        ИНАЧЕ РаботникиОрганизацийСрезПоследних.Должность
    КОНЕЦ КАК Должность
ИЗ
    РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК РаботникиОрганизацийСрезПоследних

Разберем по шагам, как работает это условие:

  1. Параметр &Период передается в параметры среза последних, чтобы получить самую свежую запись на указанный момент времени.
  2. Конструкция ВЫБОР КОГДА проверяет, наступила ли дата окончания временного перевода (ПериодЗавершения) и не является ли это поле пустой датой.
  3. Если дата завершения уже наступила, запрос возвращает подразделение и должность, в которые сотрудник вернулся после окончания срока перевода.

Важные нюансы получения кадровых данных в ЗУП 2.5

Проанализируем тонкости, которые необходимо учитывать при работе с кадровой историей в ЗУП 2.5:

  1. Учет увольнения сотрудника: Запись об увольнении также попадает в срез последних регистра РаботникиОрганизаций. Чтобы отсечь уволенных сотрудников, следует проверять поле ПричинаИзмененияСостояния (и ПричинаИзмененияСостоянияЗавершения). Если значение равно Перечисление.ПричиныИзмененияСостояния.Увольнение, сотрудник на эту дату в организации уже не работает.
  2. Точность границы среза: Если кадровый документ оформлен в течение дня, срез на начало дня (00:00:00) не учтет изменения, произошедшие в этот день. Рекомендуется передавать в параметр дату конца дня через КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) либо использовать объект Граница со значением ВидГраницы.Включая.
  3. Вложенные временные переводы: Если внутри периода одного временного перемещения был введен еще один кадровый документ, простая логика с ПериодЗавершения может дать сбой. В таких случаях надежнее использовать методы общего модуля КадровыйУчет типовой конфигурации.

Как получить подразделение на дату в ЗУП 3.1

В ЗУП 3.1 структура хранения кадровой информации кардинально изменилась. Кадровая история хранится в регистре сведений КадроваяИсторияСотрудников и вспомогательном регистре КадроваяИсторияСотрудниковИнтервальный.

Для разработчиков предусмотрен штатный программный API, который избавляет от необходимости писать сложные запросы к интервальным регистрам вручную. Рекомендуется использовать экспортную функцию общего модуля КадровыйУчет:


МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);

КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(
    Истина, 
    МассивСотрудников, 
    "Подразделение, Должность", 
    ДатаОценки
);

Посмотрим на преимущества использования типового метода КадровыйУчет.КадровыеДанныеСотрудников:

  1. Метод возвращает таблицу значений с готовыми данными на указанную дату.
  2. Автоматически корректно обрабатываются временные и постоянные переводы, увольнения, перемещения по штатному расписанию.
  3. Учитываются права доступа на уровне записей (RLS).

Если же требуется написать собственный прямой запрос в ЗУП 3.1, наиболее производительным решением является обращение к регистру КадроваяИсторияСотрудниковИнтервальный с условием вхождения требуемой даты в интервал действия записи (&Дата МЕЖДУ ДатаНачала И ДатаОкончания).

← На главную