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

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

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

Анализируем причину ошибки: почему старый запрос не работает

Разберем ситуацию: в версии 2.5 информация о кадровых изменениях хранилась в регистре РаботникиОрганизаций. В версии 3.1 структура данных стала иной. Теперь данные разделены на несколько специализированных регистров, каждый из которых отвечает за свою область — либо за кадровые события (приемы, переводы), либо за фактические состояния (отпуска, больничные), либо за оперативные данные для отчетов.

Если вы попытаетесь использовать конструкцию:


|ГДЕ 
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)

система выдаст ошибку, так как ни регистра, ни перечисления с такими именами в конфигурации ЗУП 3.1 нет. Нам необходимо перестроить логику запроса на использование актуальных объектов. При смене редакции программы для переноса накопленных кадровых и расчетных сведений можно воспользоваться инструментами из раздела решений для переноса данных ЗУП.

Решение 1: Использование регистра «Кадровая история сотрудников»

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

Рассмотрим, как будет выглядеть условие в этом случае. Вместо ПричинаИзмененияСостояния мы используем поле ВидСобытия, которое связано с перечислением ВидыКадровыхСобытий.

Пример корректного условия для отсечения уволенных сотрудников:


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

Важный нюанс: поле ВидСобытия может принимать такие значения, как Прием, Перевод, Увольнение, ВосстановлениеВДолжности. Этот метод хорош тем, что позволяет получить данные на любую историческую дату.

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

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

Работа с этим регистром гораздо производительнее, так как системе не нужно вычислять срез последних. В нем уже есть готовое поле ДатаУвольнения. Посмотрим на пример запроса:


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

Если ДатаУвольнения пустая (равна пустой дате), значит, сотрудник в данный момент числится в штате организации. Это самый простой и быстрый способ проверки статуса работы в актуальной версии ЗУП.

Решение 3: Анализ фактических состояний сотрудников

Иногда задача стоит сложнее: нужно не просто знать, уволен ли человек, а выяснить, находится ли он на рабочем месте или, например, в отпуске, на больничном или в командировке. Для этих целей в ЗУП 3.1 предусмотрен регистр сведений ДанныеСостоянийСотрудников.

Здесь используется перечисление СостоянияСотрудника. Рассмотрим основные значения, которые могут нам понадобиться:

Пример запроса к этому регистру:


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

Этот запрос вернет только тех сотрудников, которые фактически присутствуют на работе на указанную дату (не болеют и не в отпуске).

Ключевые отличия в объектах ЗУП 3.1, о которых должен знать программист

Разберем еще несколько важных моментов, которые помогут избежать ошибок при написании запросов:

  1. Разделение на сотрудников и физлиц: В ЗУП 3.1 кадровый учет всегда ведется в разрезе справочника Сотрудники. Одно физическое лицо (справочник ФизическиеЛица) может иметь несколько карточек сотрудников (например, основное место работы и внутреннее совместительство). Всегда проверяйте, какой объект является измерением в регистре.
  2. Головная организация: В версии 3.1 реализован механизм филиалов. При написании запросов учитывайте поле Организация. Если вам нужны данные по всей компании, включая филиалы, необходимо накладывать условия на ГоловнаяОрганизация.
  3. Виды договоров: Если вам нужно исключить "договорников" (ГПХ), обращайте внимание на поле ВидДоговора. В кадровой истории они могут отображаться, но логика работы с ними отличается от штатных единиц.

Подведем итог: если ваша цель — заменить старый запрос из 2.5 для проверки увольнения, используйте РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних с фильтром по ВидыКадровыхСобытий.Увольнение или обращайтесь к РегистрСведений.ТекущиеКадровыеДанные для получения оперативной информации.

← На главную