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