В конфигурации 1С:Зарплата и Управление Персоналом (ЗУП) редакции 3.x архитектура хранения кадровых данных значительно отличается от предыдущих версий. Определение состояния физического лица — работает оно в организации или уже уволено — требует понимания механизмов работы программного интерфейса (API) общего модуля КадровыйУчет. В этой статье мы подробно разберем, как правильно извлекать данные о состоянии сотрудников, какие функции использовать и на какие технические нюансы стоит обратить внимание для обеспечения высокой производительности кода.
Перед тем как приступить к написанию кода, проанализируем важную особенность учета в ЗУП 3.x. В системе разделены понятия ФизическиеЛица и Сотрудники. Одно физическое лицо может иметь несколько карточек сотрудников (например, основное место работы и внутреннее совместительство). Если физическое лицо уволено по одному месту работы, оно может продолжать трудиться по другому. Поэтому, отвечая на вопрос "уволен ли человек", мы должны четко понимать, проверяем ли мы конкретный трудовой договор (сотрудника) или статус человека в организации вообще.
Наиболее правильным и рекомендуемым фирмой 1С способом получения состояния сотрудника является использование функции КадровыйУчет.КадровыеДанныеСотрудников. Эта функция позволяет получить срез данных на определенную дату, не прибегая к написанию сложных запросов к регистрам сведений вручную.
Рассмотрим пример кода, который позволяет узнать, числится ли сотрудник в штате:
// Формируем список сотрудников для проверки
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(СсылкаНаСотрудника);
// Определяем список необходимых полей
// Поле "ВШтате" возвращает Булево: Истина - работает, Ложь - уволен
КадровыеДанные = "ВШтате, ТекущееСостояние, ДатаУвольнения";
// Получаем данные на нужную дату
ДатаПроверки = ТекущаяДата();
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(Истина, СписокСотрудников, КадровыеДанные, ДатаПроверки);
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
Если СтрокаДанных.ВШтате Тогда
Сообщить("Сотрудник " + СтрокаДанных.Сотрудник + " работает.");
Иначе
Сообщить("Сотрудник " + СтрокаДанных.Сотрудник + " уволен " + СтрокаДанных.ДатаУвольнения);
КонецЕсли;
КонецЦикла;
Разберем основные параметры этой функции. Первый параметр ТолькоРазрешенные (Булево) отвечает за проверку прав доступа (RLS). Если установить Истина, в результат попадут только те данные, на которые у текущего пользователя есть права. Параметр КадровыеДанные может принимать как строку с именами полей через запятую, так и массив строк. Использование поля ВШтате — самый быстрый способ получить ответ на вопрос о состоянии.
Если у нас есть только ссылка на Справочник.ФизическиеЛица и мы хотим узнать его статус, целесообразно использовать метод КадровыйУчет.КадровыеДанныеФизическихЛиц. Однако стоит помнить, что это физлицо может работать на нескольких должностях.
СписокФизЛиц = Новый Массив;
СписокФизЛиц.Добавить(СсылкаНаФизЛицо);
// Запрашиваем данные.
// ВАЖНО: Список доступных полей может отличаться от данных сотрудников.
Поля = "ФИОПолные, ДатаРождения";
ТаблицаФизЛиц = КадровыйУчет.КадровыеДанныеФизическихЛиц(Истина, СписокФизЛиц, Поля, ДатаПроверки);
Проанализируем ситуацию: если нам нужно именно состояние "работает/уволен" для физического лица, лучше сначала получить всех его сотрудников через функцию КадровыйУчет.СотрудникиФизическогоЛица, а затем проверить их состояние методом, описанным выше.
Выясним причину, почему разработчики часто обращаются к регистру КадроваяИсторияСотрудников. В ЗУП 3.x существуют так называемые "интервальные" регистры (например, КадроваяИсторияСотрудниковИнтервальный). Они созданы для оптимизации производительности. В отличие от обычных регистров сведений, где для получения состояния на дату нужно использовать виртуальную таблицу СрезПоследних, интервальный регистр хранит записи с четкими границами ДатаНачала и ДатаОкончания.
Несмотря на то что обращение к ним напрямую возможно, 1С рекомендует использовать методы программного интерфейса, так как структура интервальных регистров может меняться в обновлениях конфигурации. Использование КадровыйУчет.КадровыеДанныеСотрудников внутри себя уже содержит логику обращения к нужным регистрам (включая интервальные).
Рассмотрим ситуацию, когда необходимо проверить состояние не одного, а тысячи сотрудников. Использование функций в цикле приведет к катастрофическому падению производительности, так как каждый вызов инициирует отдельный запрос к базе данных. Для решения этой задачи разберем алгоритм с использованием временных таблиц:
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников.Посмотрим на пример подготовки такой временной таблицы:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
// ... (здесь код по наполнению ВТ "ВТСписокСотрудников" полями Сотрудник и Дата)
ПараметрыПолученияДанных = КадровыйУчет.ПараметрыДляСозданияВТКадровыеДанныеСотрудников();
ПараметрыПолученияДанных.МенеджерВременныхТаблиц = МенеджерВТ;
ПараметрыПолученияДанных.ИмяВТСписокСотрудников = "ВТСписокСотрудников";
ПараметрыПолученияДанных.КадровыеДанные = "ВШтате, Подразделение, Должность";
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ПараметрыПолученияДанных);
// Теперь в МенеджерВТ есть таблица "ВТКадровыеДанныеСотрудников",
// которую можно соединять в своих запросах.
При использовании вышеперечисленных методов полезно знать, какие именно поля можно запрашивать для точного анализа:
Истина, если на указанную дату сотрудник не уволен и уже принят.Работа, Увольнение).Важный нюанс: Если вам нужно не просто знать, уволен сотрудник или нет, а понять, находится ли он сейчас "на месте" (не на больничном и не в отпуске), следует использовать функции другого модуля — СостоянияСотрудников. Кадровое состояние (уволен/работает) и оперативное состояние (в отпуске/на работе) — это разные разрезы учета в ЗУП 3.1.
Таким образом, для программного определения состояния физического лица на дату в ЗУП 3.x наиболее эффективным и безопасным является использование функций общего модуля КадровыйУчет. Это гарантирует корректность данных при обновлениях системы и обеспечивает оптимальную нагрузку на сервер базы данных.