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