Как программно определить, уволен ли сотрудник или физическое лицо на конкретную дату в 1С:ЗУП 3.x

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

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

Различие между физическим лицом и сотрудником

Перед тем как приступить к написанию кода, проанализируем важную особенность учета в ЗУП 3.x. В системе разделены понятия ФизическиеЛица и Сотрудники. Одно физическое лицо может иметь несколько карточек сотрудников (например, основное место работы и внутреннее совместительство). Если физическое лицо уволено по одному месту работы, оно может продолжать трудиться по другому. Поэтому, отвечая на вопрос "уволен ли человек", мы должны четко понимать, проверяем ли мы конкретный трудовой договор (сотрудника) или статус человека в организации вообще.

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

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

Рассмотрим пример кода, который позволяет узнать, числится ли сотрудник в штате:


// Формируем список сотрудников для проверки
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(СсылкаНаСотрудника);

// Определяем список необходимых полей
// Поле "ВШтате" возвращает Булево: Истина - работает, Ложь - уволен
КадровыеДанные = "ВШтате, ТекущееСостояние, ДатаУвольнения";

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

Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    Если СтрокаДанных.ВШтате Тогда
        Сообщить("Сотрудник " + СтрокаДанных.Сотрудник + " работает.");
    Иначе
        Сообщить("Сотрудник " + СтрокаДанных.Сотрудник + " уволен " + СтрокаДанных.ДатаУвольнения);
    КонецЕсли;
КонецЦикла;

Разберем основные параметры этой функции. Первый параметр ТолькоРазрешенные (Булево) отвечает за проверку прав доступа (RLS). Если установить Истина, в результат попадут только те данные, на которые у текущего пользователя есть права. Параметр КадровыеДанные может принимать как строку с именами полей через запятую, так и массив строк. Использование поля ВШтате — самый быстрый способ получить ответ на вопрос о состоянии.

Метод 2: Получение данных по физическому лицу

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


СписокФизЛиц = Новый Массив;
СписокФизЛиц.Добавить(СсылкаНаФизЛицо);

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

Проанализируем ситуацию: если нам нужно именно состояние "работает/уволен" для физического лица, лучше сначала получить всех его сотрудников через функцию КадровыйУчет.СотрудникиФизическогоЛица, а затем проверить их состояние методом, описанным выше.

Метод 3: Проверка через интервальные регистры (для продвинутых задач)

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

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

Массовая проверка состояния и оптимизация

Рассмотрим ситуацию, когда необходимо проверить состояние не одного, а тысячи сотрудников. Использование функций в цикле приведет к катастрофическому падению производительности, так как каждый вызов инициирует отдельный запрос к базе данных. Для решения этой задачи разберем алгоритм с использованием временных таблиц:

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

Посмотрим на пример подготовки такой временной таблицы:


МенеджерВТ = Новый МенеджерВременныхТаблиц;
// ... (здесь код по наполнению ВТ "ВТСписокСотрудников" полями Сотрудник и Дата)

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

КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ПараметрыПолученияДанных);

// Теперь в МенеджерВТ есть таблица "ВТКадровыеДанныеСотрудников", 
// которую можно соединять в своих запросах.

Полезные поля для анализа состояния

При использовании вышеперечисленных методов полезно знать, какие именно поля можно запрашивать для точного анализа:

Важный нюанс: Если вам нужно не просто знать, уволен сотрудник или нет, а понять, находится ли он сейчас "на месте" (не на больничном и не в отпуске), следует использовать функции другого модуля — СостоянияСотрудников. Кадровое состояние (уволен/работает) и оперативное состояние (в отпуске/на работе) — это разные разрезы учета в ЗУП 3.1.

Таким образом, для программного определения состояния физического лица на дату в ЗУП 3.x наиболее эффективным и безопасным является использование функций общего модуля КадровыйУчет. Это гарантирует корректность данных при обновлениях системы и обеспечивает оптимальную нагрузку на сервер базы данных.

← На главную