Как правильно получить состояние сотрудника в ЗУП 3.1 и зачем в регистре Состояния сотрудников нужно измерение Год

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

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

Особенности измерения Год в регистре Состояния сотрудников

Проанализируем ситуацию: почему разработчики фирмы 1С добавили измерение Год в периодический регистр сведений? В крупных информационных базах количество записей о состояниях сотрудников (ежедневные данные о явках, неявках, отпусках) может достигать колоссальных объемов. Чтобы система не «зависала» при попытке получить СрезПоследних по всей таблице, было внедрено так называемое секционирование данных на уровне метаданных.

Рассмотрим, как это влияет на запрос. Если мы просто обратимся к виртуальной таблице СостоянияСотрудников.СрезПоследних, система будет пытаться найти актуальную запись, но из-за наличия измерения Год она может вернуть несколько строк на одного сотрудника (по одной на каждый год), либо не найти актуальную, если не указан конкретный период в параметрах виртуальной таблицы.

Чтобы получить корректные данные через прямой запрос, мы должны обязательно накладывать условие на это измерение. Выясним причину: без фильтра по году 1С будет выполнять сканирование лишних индексов. Рассмотрим пример правильного обращения к этому регистру в запросе:


ВЫБРАТЬ
    СостоянияСотрудниковСрезПоследних.Состояние,
    СостоянияСотрудниковСрезПоследних.Сотрудник
ИЗ
    РегистрСведений.СостоянияСотрудников.СрезПоследних(&Период, Год = ГОД(&Период)) КАК СостоянияСотрудниковСрезПоследних

В данном примере мы явно указываем, что нас интересуют записи только за тот год, в который попадает наша дата анализа. Это позволяет виртуальной таблице отработать корректно и быстро.

Почему Состояния сотрудников — не лучший выбор для проверки статуса Работает

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

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

Решение 1: Использование регистра Текущие кадровые данные сотрудников

Для оперативного получения информации в ЗУП 3.1 предусмотрен вспомогательный регистр ТекущиеКадровыеДанныеСотрудников. Его преимущество в том, что он непериодический. В нем всегда хранится актуальное состояние на текущий момент времени.

Рассмотрим состав его полей:

  1. ДатаПриема и ДатаУвольнения — позволяют сразу понять, числится ли человек в штате.
  2. ТекущееСостояние — краткое описание (Работа, Отпуск и т.д.).
  3. ТекущееПодразделение, ТекущаяДолжность — полезные данные для отчета без лишних соединений.

Если нам нужно быстро проверить, работает ли сотрудник сейчас, запрос будет выглядеть максимально просто:


ВЫБРАТЬ
    ТекущиеДанные.Сотрудник,
    ТекущиеДанные.ТекущееСостояние
ИЗ
    РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеДанные
ГДЕ
    ТекущиеДанные.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)

Решение 2: Получение данных на произвольную дату через Кадровую историю

Если нам нужно получить статус сотрудника на произвольную дату в прошлом, лучше всего обратиться к регистру КадроваяИсторияСотрудников. Именно он является первоисточником информации о приеме, перемещении и увольнении.

Посмотрим на алгоритм получения работающих сотрудников:

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

Решение 3: Использование программного интерфейса (Общие модули)

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

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


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

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

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

// Теперь в Запросе можно обращаться к таблице ВТКадровыеДанные
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ ВТКадровыеДанные ГДЕ ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)");
Запрос.МенеджерВременныхТаблиц = МенеджерВТ; // Если используется

Преимущество этого метода заключается в том, что система сама внутри функции обработает и измерение Год, и актуальность среза данных, и нюансы с физическими лицами (одно физлицо может иметь несколько позиций сотрудников — основное место и внутреннее совместительство).

Нюанс с Физлицами и Сотрудниками

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

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

← На главную