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