Как в отчете 1С рассчитать фактически отгулянные дни отпуска с учетом праздничных дней

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

При построении пользовательских отчетов по использованным отпускам в конфигурациях «1С:Зарплата и управление персоналом 2.5» или «1С:Управление производственным предприятием 1.3» часто возникает задача посчитать точное количество дней отпуска по кадровым данным за определенный период.

Если рассчитывать длительность отпуска простой функцией РАЗНОСТЬДАТ(Период, ПериодЗавершения, ДЕНЬ) по регистру сведений СостояниеРаботниковОрганизаций, результат получается некорректным: в расчет попадают официальные нерабочие праздничные дни, которые согласно Трудовому кодексу РФ не включаются в число календарных дней отпуска и продлевают его. Разберем, как правильно реализовать этот расчет в запросе и какие типовые механизмы программы можно задействовать.

Вариант 1. Универсальный подсчет праздников через производственный календарь в запросе

Проанализируем ситуацию: чтобы не перечислять праздничные даты вручную через громоздкие конструкции ВЫБОР КОГДА, соединим интервалы отпусков сотрудников с данными регистра сведений РегламентированныйПроизводственныйКалендарь. В этом регистре хранится классификация каждого дня года.

Разберем по шагам логику построения такого запроса:

  1. Выбираем периоды отпусков сотрудников из регистра СостояниеРаботниковОрганизаций во временную таблицу.
  2. Левым соединением подключаем регистр РегламентированныйПроизводственныйКалендарь по условию попадания даты календаря внутрь периода отпуска и равенству вида дня значению праздника.
  3. Считаем количество праздничных дней внутри каждого интервала с помощью агрегатной функции КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДатаКалендаря).
  4. Вычитаем найденное количество праздников из общей календарной длительности отпуска.

Посмотрим на пример практической реализации запроса:


ВЫБРАТЬ
    Состояния.Сотрудник КАК Сотрудник,
    Состояния.Период КАК ДатаНачала,
    Состояния.ПериодЗавершения КАК ДатаОкончания,
    РАЗНОСТЬДАТ(Состояния.Период, Состояния.ПериодЗавершения, ДЕНЬ) КАК ВсегоКалендарныхДней
ПОМЕСТИТЬ ВТ_ПериодыОтпусков
ИЗ
    РегистрСведений.СостояниеРаботниковОрганизаций КАК Состояния
ГДЕ
    Состояния.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    И Состояния.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.ОтпускЕжегодный)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Отпуска.Сотрудник КАК Сотрудник,
    Отпуска.ДатаНачала КАК ДатаНачала,
    Отпуска.ДатаОкончания КАК ДатаОкончания,
    Отпуска.ВсегоКалендарныхДней КАК ВсегоКалендарныхДней,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Календарь.ДатаКалендаря) КАК КоличествоПраздников,
    Отпуска.ВсегоКалендарныхДней - КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Календарь.ДатаКалендаря) КАК ДнейОтпускаФактически
ИЗ
    ВТ_ПериодыОтпусков КАК Отпуска
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
        ПО Календарь.ДатаКалендаря >= Отпуска.ДатаНачала
        И Календарь.ДатаКалендаря <= Отпуска.ДатаОкончания
        И Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Праздник)
СГРУППИРОВАТЬ ПО
    Отпуска.Сотрудник,
    Отпуска.ДатаНачала,
    Отпуска.ДатаОкончания,
    Отпуска.ВсегоКалендарныхДней

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

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

Выясним особенности настройки учетной политики:

  1. Перейдем в настройки параметров учета и проверим параметр «Остатки отпусков будут уменьшаться...». Если переключить его с варианта Расчетными документами на Кадровыми документами, учет фактических отпусков перейдет на кадровый контур.
  2. При включенном кадровом учете движения фиксируются в специализированных регистрах (например, ФактическиеОтпускаОрганизаций), где реквизит количества дней отпуска уже заполнен без учета праздников.
  3. Также в самом документе ОтпускОрганизаций табличная часть содержит готовое рассчитанное поле КоличествоДней, которое можно напрямую выводить в отчет.

Важные нюансы при работе с интервалами дат

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

  1. Границы интервалов: Функция РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) вычисляет разницу между датами без учета включения начального дня. Если в регистре дата завершения совпадает с последним днем отпуска (а не с днем выхода на работу), к результату необходимо прибавлять 1 день. Всегда проверяйте, какой именно момент времени записан в поле ПериодЗавершения в вашей базе.
  2. Отзывы и прерывания: Регистр состояний не всегда корректно отражает ситуации, когда сотрудник был досрочно отозван из отпуска или отпуск был продлен из-за временной нетрудоспособности. Для получения юридически точных данных об использованных отпусках надежнее опираться на движения документов подсистемы учета отпусков.
← На главную