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

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

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

Особенности интервальных регистров и риски прямых запросов

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

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

  1. Обработка пустых и бесконечных дат: для бессрочных кадровых состояний поле ДатаОкончания может содержать служебные значения (например, 3999-12-31 или пустую дату). Некорректное условие сравнения приведет к потере актуальных записей.
  2. Служебный механизм актуализации: интервальные таблицы являются детерминированными вспомогательными срезами. Они обновляются специализированными подписками и фоновыми заданиями. При проведении больших пакетов документов или отложенном расчете интервалы могут быть временно не синхронизированы.
  3. День увольнения: по правилам кадрового учета день увольнения является последним рабочим днем сотрудника. Если сделать срез или прямое условие на конец дня увольнения, запрос вернет событие «Увольнение», из-за чего сотрудник выпадет из списка работающих.

Если вам обязательно требуется получить данные чистым запросом без использования программных методов конфигурации (например, при интеграции через COM-соединение или во внешних источниках), безопаснее обращаться к виртуальной таблице СрезПоследних основного регистра сведений РегистрСведений.КадроваяИсторияСотрудников с фильтрацией по виду события:


ВЫБРАТЬ
    КадроваяИстория.Сотрудник КАК Сотрудник,
    КадроваяИстория.Подразделение КАК Подразделение,
    КадроваяИстория.Должность КАК Должность
ИЗ
    РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(
        &Период,
        Сотрудник В (&СписокСотрудников)) КАК КадроваяИстория
ГДЕ
    КадроваяИстория.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

Использование программного интерфейса: функция КадровыеДанныеСотрудников

Основным и рекомендованным фирмой «1С» способом получения кадровой информации является использование функций общего модуля КадровыйУчет. Этот программный интерфейс берет на себя все нюансы формирования запросов, работы с временными таблицами и исключения уволенных сотрудников.

Рассмотрим вызов базовой функции КадровыйУчет.КадровыеДанныеСотрудников, когда список сотрудников уже известен:


СписокКадровыхДанных = "Должность,Подразделение,ВидЗанятости";
ТаблицаКадровыхДанных = КадровыйУчет.КадровыеДанныеСотрудников(
    Истина,                    // ТолькоРазрешенные (учет прав RLS)
    СписокСотрудников,          // Массив или ссылка на сотрудника
    СписокКадровыхДанных,       // Строка с перечислением требуемых полей
    Период                     // Дата, на которую требуются данные
);

Получение списка сотрудников с отбором по подразделению

Когда требуется получить не просто кадровые данные по фиксированному списку, а выбрать всех работающих сотрудников конкретной организации или подразделения на дату, применим метод КадровыйУчет.СотрудникиОрганизации.

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


// 1. Инициализируем структуру параметров
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.Организация      = Организация;
ПараметрыПолучения.Подразделение    = Подразделение;
ПараметрыПолучения.ОкончаниеПериода = Период;
ПараметрыПолучения.КадровыеДанные   = "Должность,Подразделение,ВидЗанятости";

// 2. Получаем готовую таблицу сотрудников с учетом иерархии подразделений
ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолучения);

Важный момент: при указании подразделения в параметрах функция автоматически отбирает сотрудников как самого подразделения, так и всех подчиненных ему узлов структуры.

Наложение сложных отборов на выборку сотрудников

Проанализируем ситуацию, когда необходимо отобрать сотрудников по дополнительным кадровым критериям — например, по графикам работы или виду занятости. Для этого в структуру параметров передается массив условий, сформированный через общий модуль ЗарплатаКадрыОбщиеНаборыДанных.

Посмотрим на пример выборки сотрудников, работающих на заданную дату с определенными графиками:


ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.НачалоПериода    = Период;
ПараметрыПолучения.ОкончаниеПериода = Период;

// Формируем коллекцию условий
Отборы = Новый Массив;
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
    Отборы, 
    "ГрафикРаботы", 
    "В", 
    МассивГрафиковРаботы
);

ПараметрыПолучения.Отборы = Отборы;

// Получаем результирующую таблицу
ТаблицаРезультат = КадровыйУчет.СотрудникиОрганизации(Ложь, ПараметрыПолучения);

Помещение кадровых данных во временную таблицу для сложных запросов

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

Рассмотрим, как сгенерировать временную таблицу и обратиться к ней в последующем запросе:


МенеджерВТ = Новый МенеджерВременныхТаблиц;

ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.Организация      = Организация;
ПараметрыПолучения.ОкончаниеПериода = Период;
ПараметрыПолучения.КадровыеДанные   = "Подразделение,Должность";

// Метод создает во временных таблицах таблицу с именем "ВТСотрудникиОрганизации"
КадровыйУчет.СоздатьВТСотрудникиОрганизации(
    МенеджерВТ, 
    Истина, 
    ПараметрыПолучения, 
    "ВТСотрудникиОрганизации"
);

// Используем сформированную таблицу в своем запросе
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Кадры.Сотрудник КАК Сотрудник,
    |    Кадры.Подразделение КАК Подразделение,
    |    Кадры.Должность КАК Должность
    |ИЗ
    |    ВТСотрудникиОрганизации КАК Кадры";

РезультатЗапроса = Запрос.Выполнить();

Такой подход обеспечивает максимальную производительность, гарантирует корректность среза данных и полностью сохраняет совместимость при обновлении типовой конфигурации «1С:ЗУП 3.1».

← На главную