Как получить актуальную запись по сотруднику из регистра сведений «Работники организаций» при повторном приеме?

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

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

Причины появления дублирующих записей в срезе последних

Для понимания логики работы платформы проанализируем структуру хранения кадровой информации:

  1. Разделение сущностей «Физическое лицо» и «Сотрудник». Человек в системе представлен элементом справочника ФизическиеЛица, а каждый факт заключения трудового договора — отдельным элементом справочника СотрудникиОрганизаций. При повторном трудоустройстве создается новый элемент справочника сотрудников. Поскольку измерением регистра сведений РаботникиОрганизаций является Сотрудник, виртуальная таблица СрезПоследних возвращает последнюю запись для каждого элемента справочника сотрудников. В результате мы получаем последнюю запись по первому (уволенному) сотруднику и последнюю запись по второму (принятому).
  2. Интервальные события и период завершения. Если в организации оформлялись временные кадровые перемещения со сроком действия «С ... ПО ...», в регистре заполняются реквизиты ПериодЗавершения, ДолжностьЗавершения, ПодразделениеОрганизацииЗавершения. Стандартный СрезПоследних не умеет автоматически возвращать исходные значения после наступления даты завершения, ориентируясь только на поле Период.

Способ 1. Получение последней кадровой записи в разрезе физического лица через вложенный запрос

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


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

Обратите внимание: если требуется получить данные по конкретному человеку в единственном числе, можно воспользоваться конструкцией ПЕРВЫЕ 1 с сортировкой по убыванию периода:


ВЫБРАТЬ ПЕРВЫЕ 1
    РаботникиОрганизацийСрезПоследних.Период КАК Период,
    РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
    РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК Подразделение,
    РаботникиОрганизацийСрезПоследних.Должность КАК Должность
ИЗ
    РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаАктуальности, Организация = &Организация) КАК РаботникиОрганизацийСрезПоследних
ГДЕ
    РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо = &ФизЛицо
УПОРЯДОЧИТЬ ПО
    РаботникиОрганизацийСрезПоследних.Период УБЫВ

Способ 2. Учет временных кадровых перемещений (полей завершения)

Разберем ситуацию, когда по сотруднику было оформлено срочное кадровое перемещение с указанием периода окончания. На дату после завершения временного перемещения срез последних по-прежнему вернет строку перемещения, однако фактические реквизиты должны браться из полей завершения. Для корректного извлечения должности и подразделения применим условную конструкцию ВЫБОР КОГДА ...:


ВЫБРАТЬ
    Работники.Сотрудник КАК Сотрудник,
    ВЫБОР
        КОГДА Работники.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            И Работники.ПериодЗавершения <= &ДатаАктуальности
        ТОГДА Работники.ПодразделениеОрганизацииЗавершения
        ИНАЧЕ Работники.ПодразделениеОрганизации
    КОНЕЦ КАК Подразделение,
    ВЫБОР
        КОГДА Работники.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            И Работники.ПериодЗавершения <= &ДатаАктуальности
        ТОГДА Работники.ДолжностьЗавершения
        ИНАЧЕ Работники.Должность
    КОНЕЦ КАК Должность,
    ВЫБОР
        КОГДА Работники.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            И Работники.ПериодЗавершения <= &ДатаАктуальности
        ТОГДА Работники.ЗанимаемыхСтавокЗавершения
        ИНАЧЕ Работники.ЗанимаемыхСтавок
    КОНЕЦ КАК ЗанимаемыхСтавок
ИЗ
    РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаАктуальности, Организация = &Организация) КАК Работники

Способ 3. Использование специализированных регистров и типовых механизмов

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

  1. Регистр сведений «СостояниеРаботниковОрганизаций» (или «СостоянияСотрудников»). В нем фиксируется текущее состояние работника (например, значение перечисления Работает или Не работает/Уволен). Соединяя кадровые данные с этим регистром по сотруднику, можно легко отфильтровать уволенных людей.
  2. Регистр сведений «ТекущиеКадровыеДанныеСотрудников». В современных конфигурациях этот непериодический регистр хранит актуальные сведения о месте работы, должности, ставке и признаке увольнения без необходимости вычисления срезов кадровой истории.
  3. Программный интерфейс общих модулей. В типовых решениях для получения кадровых срезов правильнее вызывать функции типового кадрового учета (например, КадровыйУчет.КадровыеДанныеСотрудников), которые уже содержат всю необходимую логику обработки совместителей, повторных приемов и временных кадровых перемещений.
← На главную