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