Как программно определить, рабочий ли день у сотрудника в 1С:ЗУП 3.1?

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

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

Анализ задачи и возможные подводные камни

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

  1. Документы ИндивидуальныйГрафик, которые переопределяют норму времени на месяц.
  2. Кадровые переводы, которые могут менять график сотрудника посреди месяца.
  3. Документы отклонений (отпуска, больничные листы, прогулы).
  4. Фактически отработанное время (сверхурочные, работа в выходные и праздники).

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

Решение 1: Использование типовых функций модуля УчетРабочегоВремениРасширенный

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

1. Получение чистого планового времени

Если нам нужно узнать строгую норму дней и часов по графику (или индивидуальному графику) без учета того, заболел сотрудник или ушел в отпуск, используем процедуру:

УчетРабочегоВремениРасширенный.СоздатьВТПлановоеВремя

Она формирует временную таблицу с плановыми данными. Это идеальный вариант, если требуется определить, должен ли был человек работать в этот день в принципе.

2. Получение фактического времени с учетом всех отклонений

Если нам нужно понять, работал ли человек по факту (то есть получить данные, аналогичные тем, что выводятся в табеле Т-13), воспользуемся другой процедурой:

УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников

Эта функция учитывает все введенные отсутствия. Обратите внимание: если по графику у сотрудника рабочий день, но он на больничном, функция вернет состояние больничного, а не часы явки. К формированию параметров для этой функции нужно подходить аккуратно. Чтобы понять, какие структуры и массивы передавать на вход, советуем посмотреть примеры ее вызова в модулях документа Табель или отчета УнифицированнаяФормаТ13.

3. Получение планового времени с учетом переработок

Существует также промежуточный вариант:

УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаРабочегоВремениСотрудников

Она не учитывает отсутствия (как больничные), но зато "видит" документы переработок и работы в выходные/праздничные дни.

Решение 2: Работа с платформенными календарными графиками

Если в вашем алгоритме уже получена ссылка на график работы сотрудника на конкретную дату (например, с помощью функции КадровыйУчет.КадровыеДанныеСотрудников), можно пойти более простым путем без формирования тяжелых временных таблиц. Выясним, как это сделать с помощью модуля КалендарныеГрафики.

В платформе нет функции с названием вроде "ЯвляетсяЛиДнемРабочим", но мы можем использовать метод:

КалендарныеГрафики.ДатыБлижайшихРабочихДней(График, МассивДат)

Мы помещаем проверяемую дату в массив и передаем в функцию вместе со ссылкой на график. Анализируя возвращаемый результат, мы легко можем определить рабочий статус переданной даты для данного графика.

Решение 3: Прямые запросы к регистрам (Не рекомендуется)

Рассмотрим метод решения задачи "в лоб". Некоторые разработчики делают прямой запрос к регистру сведений ГрафикиРаботыПоВидамВремени.

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

Почему мы не советуем так делать? При таком подходе вам придется самостоятельно собирать всю историю кадровых переводов сотрудника на дату, а также отдельным сложным запросом проверять наличие и проведение документа ИндивидуальныйГрафик на расчетный месяц. Это ведет к дублированию типового кода и потенциальным ошибкам в расчетах.

Резюме и рекомендации

Подведем итоги. Выбор метода зависит от ваших бизнес-требований:

Всегда отдавайте предпочтение вызовам общих модулей 1С перед написанием собственных прямых запросов к регистрам расчета и сведений. Это сэкономит ваше время при дальнейшей поддержке и обновлении базы.

← На главную