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