При разработке отчетов, обработок и печатных форм в конфигурациях 1С:Зарплата и Управление Персоналом часто возникает задача получить кадровые данные сотрудника (подразделение, должность, состояние) не на текущий момент времени, а на произвольную дату в прошлом. Разберем особенности реализации такого запроса для классической редакции ЗУП 2.5, а также рассмотрим актуальные подходы для современной редакции ЗУП 3.1.
В конфигурации 1С:ЗУП редакции 2.5 вся кадровая история сотрудников хранится в периодическом регистре сведений РаботникиОрганизаций. Для получения данных на конкретный момент времени используется виртуальная таблица СрезПоследних. В параметры виртуальной таблицы передается дата среза.
Однако простого обращения к реквизитам ПодразделениеОрганизации и Должность часто оказывается недостаточно. В ЗУП 2.5 кадровые перемещения могут регистрироваться как временные — с указанием даты возврата на предыдущее место работы. В этом случае в регистре заполняются поля завершения: ПериодЗавершения, ПодразделениеОрганизацииЗавершения, ДолжностьЗавершения.
Рассмотрим пример правильного запроса к регистру сведений с разыменованием полей завершения:
ВЫБРАТЬ
РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
ВЫБОР
КОГДА &Период >= РаботникиОрганизацийСрезПоследних.ПериодЗавершения
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации
КОНЕЦ КАК Подразделение,
ВЫБОР
КОГДА &Период >= РаботникиОрганизацийСрезПоследних.ПериодЗавершения
И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА РаботникиОрганизацийСрезПоследних.ДолжностьЗавершения
ИНАЧЕ РаботникиОрганизацийСрезПоследних.Должность
КОНЕЦ КАК Должность
ИЗ
РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК РаботникиОрганизацийСрезПоследних
Разберем по шагам, как работает это условие:
&Период передается в параметры среза последних, чтобы получить самую свежую запись на указанный момент времени.ВЫБОР КОГДА проверяет, наступила ли дата окончания временного перевода (ПериодЗавершения) и не является ли это поле пустой датой.Проанализируем тонкости, которые необходимо учитывать при работе с кадровой историей в ЗУП 2.5:
РаботникиОрганизаций. Чтобы отсечь уволенных сотрудников, следует проверять поле ПричинаИзмененияСостояния (и ПричинаИзмененияСостоянияЗавершения). Если значение равно Перечисление.ПричиныИзмененияСостояния.Увольнение, сотрудник на эту дату в организации уже не работает.00:00:00) не учтет изменения, произошедшие в этот день. Рекомендуется передавать в параметр дату конца дня через КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) либо использовать объект Граница со значением ВидГраницы.Включая.ПериодЗавершения может дать сбой. В таких случаях надежнее использовать методы общего модуля КадровыйУчет типовой конфигурации.В ЗУП 3.1 структура хранения кадровой информации кардинально изменилась. Кадровая история хранится в регистре сведений КадроваяИсторияСотрудников и вспомогательном регистре КадроваяИсторияСотрудниковИнтервальный.
Для разработчиков предусмотрен штатный программный API, который избавляет от необходимости писать сложные запросы к интервальным регистрам вручную. Рекомендуется использовать экспортную функцию общего модуля КадровыйУчет:
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);
КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(
Истина,
МассивСотрудников,
"Подразделение, Должность",
ДатаОценки
);
Посмотрим на преимущества использования типового метода КадровыйУчет.КадровыеДанныеСотрудников:
Если же требуется написать собственный прямой запрос в ЗУП 3.1, наиболее производительным решением является обращение к регистру КадроваяИсторияСотрудниковИнтервальный с условием вхождения требуемой даты в интервал действия записи (&Дата МЕЖДУ ДатаНачала И ДатаОкончания).