При разработке отчетов, обработок и механизмов интеграции в конфигурации «1С:Зарплата и управление персоналом 3.1» разработчики часто сталкиваются с задачей получения актуальных кадровых сведений сотрудника (подразделения, должности, вида занятости и других реквизитов) на определенную дату. Разберем основные подходы к решению этой задачи, рассмотрим типовой программный интерфейс конфигурации и выясним, почему прямое обращение к интервальным регистрам может привести к ошибкам.
Проанализируем структуру хранения кадровых сведений в ЗУП 3.1. В отличие от ЗУП 2.5, где применялись периодические регистры сведений с периодичностью по позиции документа и реквизитом ПериодЗавершения, в ЗУП 3.1 используется связка основных периодических регистров и вспомогательных интервальных регистров (например, РегистрСведений.КадроваяИсторияСотрудниковИнтервальный).
Попытка написать прямой запрос к интервальному регистру с простым условием попадания даты в интервал несет в себе несколько скрытых проблем:
ДатаОкончания может содержать служебные значения (например, 3999-12-31 или пустую дату). Некорректное условие сравнения приведет к потере актуальных записей.Если вам обязательно требуется получить данные чистым запросом без использования программных методов конфигурации (например, при интеграции через COM-соединение или во внешних источниках), безопаснее обращаться к виртуальной таблице СрезПоследних основного регистра сведений РегистрСведений.КадроваяИсторияСотрудников с фильтрацией по виду события:
ВЫБРАТЬ
КадроваяИстория.Сотрудник КАК Сотрудник,
КадроваяИстория.Подразделение КАК Подразделение,
КадроваяИстория.Должность КАК Должность
ИЗ
РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(
&Период,
Сотрудник В (&СписокСотрудников)) КАК КадроваяИстория
ГДЕ
КадроваяИстория.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)
Основным и рекомендованным фирмой «1С» способом получения кадровой информации является использование функций общего модуля КадровыйУчет. Этот программный интерфейс берет на себя все нюансы формирования запросов, работы с временными таблицами и исключения уволенных сотрудников.
Рассмотрим вызов базовой функции КадровыйУчет.КадровыеДанныеСотрудников, когда список сотрудников уже известен:
СписокКадровыхДанных = "Должность,Подразделение,ВидЗанятости";
ТаблицаКадровыхДанных = КадровыйУчет.КадровыеДанныеСотрудников(
Истина, // ТолькоРазрешенные (учет прав RLS)
СписокСотрудников, // Массив или ссылка на сотрудника
СписокКадровыхДанных, // Строка с перечислением требуемых полей
Период // Дата, на которую требуются данные
);
Когда требуется получить не просто кадровые данные по фиксированному списку, а выбрать всех работающих сотрудников конкретной организации или подразделения на дату, применим метод КадровыйУчет.СотрудникиОрганизации.
Разберем по шагам подготовку параметров и выполнение выборки:
// 1. Инициализируем структуру параметров
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.Организация = Организация;
ПараметрыПолучения.Подразделение = Подразделение;
ПараметрыПолучения.ОкончаниеПериода = Период;
ПараметрыПолучения.КадровыеДанные = "Должность,Подразделение,ВидЗанятости";
// 2. Получаем готовую таблицу сотрудников с учетом иерархии подразделений
ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолучения);
Важный момент: при указании подразделения в параметрах функция автоматически отбирает сотрудников как самого подразделения, так и всех подчиненных ему узлов структуры.
Проанализируем ситуацию, когда необходимо отобрать сотрудников по дополнительным кадровым критериям — например, по графикам работы или виду занятости. Для этого в структуру параметров передается массив условий, сформированный через общий модуль ЗарплатаКадрыОбщиеНаборыДанных.
Посмотрим на пример выборки сотрудников, работающих на заданную дату с определенными графиками:
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.НачалоПериода = Период;
ПараметрыПолучения.ОкончаниеПериода = Период;
// Формируем коллекцию условий
Отборы = Новый Массив;
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
Отборы,
"ГрафикРаботы",
"В",
МассивГрафиковРаботы
);
ПараметрыПолучения.Отборы = Отборы;
// Получаем результирующую таблицу
ТаблицаРезультат = КадровыйУчет.СотрудникиОрганизации(Ложь, ПараметрыПолучения);
Если кадровые данные требуется объединить с другими учетными регистрами, сгруппировать или использовать в едином запросе, нет необходимости выгружать все во внешние таблицы значений. Программный интерфейс позволяет сразу создать временную таблицу внутри переданного объекта МенеджерВременныхТаблиц.
Рассмотрим, как сгенерировать временную таблицу и обратиться к ней в последующем запросе:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.Организация = Организация;
ПараметрыПолучения.ОкончаниеПериода = Период;
ПараметрыПолучения.КадровыеДанные = "Подразделение,Должность";
// Метод создает во временных таблицах таблицу с именем "ВТСотрудникиОрганизации"
КадровыйУчет.СоздатьВТСотрудникиОрганизации(
МенеджерВТ,
Истина,
ПараметрыПолучения,
"ВТСотрудникиОрганизации"
);
// Используем сформированную таблицу в своем запросе
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| Кадры.Сотрудник КАК Сотрудник,
| Кадры.Подразделение КАК Подразделение,
| Кадры.Должность КАК Должность
|ИЗ
| ВТСотрудникиОрганизации КАК Кадры";
РезультатЗапроса = Запрос.Выполнить();
Такой подход обеспечивает максимальную производительность, гарантирует корректность среза данных и полностью сохраняет совместимость при обновлении типовой конфигурации «1С:ЗУП 3.1».