При переходе с конфигурации Зарплата и Управление Персоналом 2.5 на версию 3.1 разработчики часто сталкиваются с тем, что привычные объекты метаданных больше не существуют. Одной из самых распространенных ошибок является попытка обращения к регистру сведений РаботникиОрганизаций и перечислению ПричиныИзмененияСостояния. В архитектуре 1С:ЗУП 3.1 эти объекты были полностью переработаны и заменены более гибкими механизмами. В этой статье мы подробно разберем, как адаптировать ваши запросы под актуальную версию программы.
Разберем ситуацию: в версии 2.5 информация о кадровых изменениях хранилась в регистре РаботникиОрганизаций. В версии 3.1 структура данных стала иной. Теперь данные разделены на несколько специализированных регистров, каждый из которых отвечает за свою область — либо за кадровые события (приемы, переводы), либо за фактические состояния (отпуска, больничные), либо за оперативные данные для отчетов.
Если вы попытаетесь использовать конструкцию:
|ГДЕ
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
система выдаст ошибку, так как ни регистра, ни перечисления с такими именами в конфигурации ЗУП 3.1 нет. Нам необходимо перестроить логику запроса на использование актуальных объектов. При смене редакции программы для переноса накопленных кадровых и расчетных сведений можно воспользоваться инструментами из раздела решений для переноса данных ЗУП.
Проанализируем наиболее близкий аналог старого регистра — РегистрСведений.КадроваяИсторияСотрудников. Это периодический регистр, который хранит информацию о каждом кадровом событии. Для того чтобы узнать, работает ли сотрудник на определенную дату, нам необходимо обратиться к виртуальной таблице СрезПоследних.
Рассмотрим, как будет выглядеть условие в этом случае. Вместо ПричинаИзмененияСостояния мы используем поле ВидСобытия, которое связано с перечислением ВидыКадровыхСобытий.
Пример корректного условия для отсечения уволенных сотрудников:
ВЫБРАТЬ
КадроваяИстория.Сотрудник,
КадроваяИстория.Должность,
КадроваяИстория.Подразделение
ИЗ
РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Период, ) КАК КадроваяИстория
ГДЕ
КадроваяИстория.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)
Важный нюанс: поле ВидСобытия может принимать такие значения, как Прием, Перевод, Увольнение, ВосстановлениеВДолжности. Этот метод хорош тем, что позволяет получить данные на любую историческую дату.
Выясним, как можно оптимизировать запрос, если нам нужны данные только на текущий момент. В ЗУП 3.1 существует специальный регистр сведений ТекущиеКадровыеДанные. Он не является периодическим и хранит "схлопнутую" актуальную информацию по каждому сотруднику.
Работа с этим регистром гораздо производительнее, так как системе не нужно вычислять срез последних. В нем уже есть готовое поле ДатаУвольнения. Посмотрим на пример запроса:
ВЫБРАТЬ
ТекущиеКадровыеДанные.Сотрудник,
ТекущиеКадровыеДанные.Подразделение,
ТекущиеКадровыеДанные.Должность
ИЗ
РегистрСведений.ТекущиеКадровыеДанные КАК ТекущиеКадровыеДанные
ГДЕ
ТекущиеКадровыеДанные.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
Если ДатаУвольнения пустая (равна пустой дате), значит, сотрудник в данный момент числится в штате организации. Это самый простой и быстрый способ проверки статуса работы в актуальной версии ЗУП.
Иногда задача стоит сложнее: нужно не просто знать, уволен ли человек, а выяснить, находится ли он на рабочем месте или, например, в отпуске, на больничном или в командировке. Для этих целей в ЗУП 3.1 предусмотрен регистр сведений ДанныеСостоянийСотрудников.
Здесь используется перечисление СостоянияСотрудника. Рассмотрим основные значения, которые могут нам понадобиться:
Пример запроса к этому регистру:
ВЫБРАТЬ
Состояния.Сотрудник,
Состояния.Состояние
ИЗ
РегистрСведений.ДанныеСостоянийСотрудников.СрезПоследних(&Период, ) КАК Состояния
ГДЕ
Состояния.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Работа)
Этот запрос вернет только тех сотрудников, которые фактически присутствуют на работе на указанную дату (не болеют и не в отпуске).
Разберем еще несколько важных моментов, которые помогут избежать ошибок при написании запросов:
Сотрудники. Одно физическое лицо (справочник ФизическиеЛица) может иметь несколько карточек сотрудников (например, основное место работы и внутреннее совместительство). Всегда проверяйте, какой объект является измерением в регистре.Организация. Если вам нужны данные по всей компании, включая филиалы, необходимо накладывать условия на ГоловнаяОрганизация.ВидДоговора. В кадровой истории они могут отображаться, но логика работы с ними отличается от штатных единиц.Подведем итог: если ваша цель — заменить старый запрос из 2.5 для проверки увольнения, используйте РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних с фильтром по ВидыКадровыхСобытий.Увольнение или обращайтесь к РегистрСведений.ТекущиеКадровыеДанные для получения оперативной информации.