Как в 1С:ЗУП 3.1 получить список работающих сотрудников с помощью запроса

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

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

Почему прямой запрос к регистру СостоянияСотрудников не работает?

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

  1. Кадровая история: факты приема, перевода и увольнения. Эти данные хранятся в регистре КадроваяИсторияСотрудников.
  2. Данные об отсутствиях: отпуска, больничные, командировки, прогулы. Эти сведения фиксируются в регистре ДанныеСостоянийСотрудников.

Статус «Работа» в системе зачастую является «пустым» значением. То есть сотрудник считается работающим, если он числится в штате по кадровой истории и на текущую дату у него нет записей в регистре отсутствий. Именно поэтому обычный СрезПоследних по регистру СостоянияСотрудников может возвращать неактуальные или неполные данные.

Вариант 1. Запрос к регистру ДанныеСостоянийСотрудников

Если нам необходимо получить данные именно через запрос (например, для построения собственного отчета), рассмотрим подход с использованием регистра ДанныеСостоянийСотрудников. В отличие от СостоянияСотрудников, этот регистр хранит интервалы (даты начала и окончания) состояний.

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


ВЫБРАТЬ
    ДанныеСостоянийСотрудников.Сотрудник КАК Сотрудник,
    МАКСИМУМ(ДанныеСостоянийСотрудников.Начало) КАК Дата
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
    РегистрСведений.ДанныеСостоянийСотрудников КАК ДанныеСостоянийСотрудников
СГРУППИРОВАТЬ ПО
    ДанныеСостоянийСотрудников.Сотрудник;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица1.Сотрудник КАК Сотрудник,
    ВременнаяТаблица1.Дата КАК Дата,
    ДанныеСостоянийСотрудников.Состояние КАК Состояние
ИЗ
    ВременнаяТаблица1 КАК ВременнаяТаблица1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеСостоянийСотрудников КАК ДанныеСостоянийСотрудников
    ПО ВременнаяТаблица1.Сотрудник = ДанныеСостоянийСотрудников.Сотрудник
    И ВременнаяТаблица1.Дата = ДанныеСостоянийСотрудников.Начало

Однако помните, что этот способ покажет только последнее зафиксированное отклонение. Чтобы понять, работает ли сотрудник, этого недостаточно.

Вариант 2. Использование типового отчета Состояния сотрудников

Проанализируем самый надежный «ручной» способ получения правильного запроса. В ЗУП 3.1 есть типовой отчет «Состояния сотрудников» (подобный внешний отчет по сотрудникам часто требуется для кадровых задач).

Выполним следующие шаги для получения корректного алгоритма:

  1. Откроем отчет «Состояния сотрудников».
  2. В настройках укажем отбор по состоянию «Работа».
  3. Перейдем в режим изменения варианта отчета и изучим вкладку «Запрос» в схеме компоновки данных (СКД).

Типовой отчет использует сложные временные таблицы, которые объединяют данные из кадровой истории и регистра состояний. Вы можете скопировать этот запрос в свою разработку, удалив лишние поля и оставив только проверку на актуальность сотрудника в штате и отсутствие у него записей о неявках (отпусках по уходу за ребенком, больничных и т.д.).

Вариант 3. Программный интерфейс (API) ЗУП — самый правильный путь

Выясним наиболее эффективный метод разработки. В 1С:ЗУП 3.1 крайне не рекомендуется писать прямые запросы к регистрам для получения кадровых срезов. Система предоставляет мощный программный интерфейс в общем модуле КадровыйУчет.

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


// Определяем параметры
ДатаАктуальности = ТекущаяДата();
ПоляДанных = "Сотрудник, ТекущееСостояние, Подразделение, Должность";

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

Почему стоит использовать именно этот метод:

Как отфильтровать «неработающих» (отпуск по уходу за ребенком и прочее)

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

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


ГДЕ
    НЕ Состояние В (
        ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.ОтпускПоУходуЗаРебенком),
        ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Увольнение)
    )

Подведем итог: для получения списка реально работающих сотрудников в 1С:ЗУП 3.1 лучше всего использовать типовой механизм КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников. Если же вам принципиально нужен чистый запрос, возьмите его из типового отчета «Состояния сотрудников», так как он учитывает взаимосвязь кадровых приказов и документов-отклонений.

← На главную