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

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

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

Метод 1. Использование типового программного интерфейса (рекомендуемый способ)

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

Основным инструментом здесь выступает процедура СоздатьВТСотрудникиОрганизации. Рассмотрим пошагово, как ее использовать в своем коде.

Шаг 1. Подготовка параметров

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


Параметры = КадровыйУчет.ПараметрыПолученияСотрудников();
Параметры.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
Параметры.НачалоПериода = ДатаОтчета;
Параметры.ОкончаниеПериода = ДатаОтчета;
Параметры.УчитыватьУволенных = Ложь; // Это ключевой момент для получения только работающих

Шаг 2. Вызов процедуры формирования временной таблицы

Теперь мы вызываем саму процедуру, которая создаст в нашем менеджере временных таблиц таблицу с данными сотрудников. Проанализируем пример вызова:


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

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

В результате выполнения этого кода в менеджере временных таблиц появится таблица под именем ВТСотрудники. Она будет содержать список сотрудников, которые числятся в штате на указанную дату (не уволены). После этого мы можем обращаться к этой таблице в своем основном запросе. Для интерактивной отладки и выполнения запросов к API конфигурации можно использовать консоль запросов с поддержкой программного интерфейса ЗУП.

Метод 2. Написание запроса к регистру «Кадровая история сотрудников»

Если по каким-то причинам использование типовых процедур невозможно (например, в сложном внешнем отчете без доступа к контексту модулей), мы можем составить запрос самостоятельно. Разберем, к какому объекту следует обращаться.

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

Рассмотрим структуру запроса:

  1. Обращаемся к виртуальной таблице СрезПоследних регистра КадроваяИсторияСотрудников.
  2. Устанавливаем дату среза.
  3. Накладываем условие на поле ВидСобытия.

Пример кода запроса:


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

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

Метод 3. Получение списка через механизм «Кадровые данные»

Если нам нужно получить не просто список ссылок на сотрудников, а еще и дополнительные данные (ФИО, табельный номер, ИНН), лучше использовать универсальный механизм получения кадровых данных. Рассмотрим, как это работает через программный интерфейс.

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

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


// Описываем поля, которые нам нужны
Поля = "Сотрудник, Должность, Подразделение, ДатаПриема";

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

Здесь важно понимать, что СписокСотрудников предварительно можно получить, выбрав всех сотрудников, у которых в справочнике не заполнена дата увольнения, или используя первый метод с временными таблицами.

Анализ различий между регистрами

Давайте разберем подробнее, почему использование регистра Состояния сотрудников для получения списка работающих — это не всегда верный путь.

Регистр «Кадровая история сотрудников»: Это «юридическая» история. Здесь фиксируются приказы о приеме, переводе и увольнении. Если последняя запись по сотруднику — «Прием» или «Перевод», значит, он работает (числится в штате).

Регистр «Состояния сотрудников»: Это «фактическая» история. Здесь фиксируются отсутствия. Если сотрудник ушел в отпуск по уходу за ребенком на 3 года, в регистре состояний будет запись «Отпуск по уходу за ребенком». Но при этом в регистре кадровой истории он по-прежнему «Работает». Если вы строите отчет по штатной численности, вы должны его учитывать. Если же вы строите список тех, кто сегодня должен выйти в смену — тогда вам нужен регистр состояний.

Рекомендации по оптимизации запросов

При работе с большими базами (более 1000 сотрудников) рекомендуется придерживаться следующих правил:

  1. Используйте временные таблицы. Не делайте вложенных запросов к виртуальным таблицам внутри циклов. Сначала получите список сотрудников во временную таблицу, а затем соединяйте ее с другими данными.
  2. Индексация. Если вы создаете временную таблицу вручную, не забывайте индексировать поле Сотрудник. Это значительно ускорит последующие соединения (JOIN).
  3. Отбор по организации. Всегда старайтесь передавать параметр Организация в виртуальные таблицы СрезПоследних. Это позволит платформе использовать более эффективный план запроса на уровне СУБД.

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

← На главную