Почему в ЗУП при расчете больничного за прошлый период теряется один календарный день и как формируются КалендарныеДни?

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

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

Как формируются календарные дни на уровне платформы

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

  1. В начале расчета документ формирует предварительный набор записей регистра расчета и записывает его с включенным перерасчетом фактического периода действия.
  2. Платформа 1С на уровне СУБД сопоставляет период действия записи (с даты начала по дату окончания) с записями вытесняющих видов расчета и строит системную таблицу фактических периодов действия.
  3. В процедуре ПолучитьДанныеДляРасчета выполняется обращение к виртуальной таблице ДанныеГрафика регистра расчета. В этот момент платформа «на лету» выполняет соединение полученного фактического периода действия с регистром сведений графика (производственного календаря) и агрегирует числовые ресурсы за интервал.

Посмотрим на типовой фрагмент запроса, получающий эти показатели:


ВЫБРАТЬ
    ЕСТЬNULL(ДанныеГрафика.ПроизводственныйКалендарьКалендарныеДниФактическийПериодДействия, 0) КАК КалендарныеДни,
    ЕСТЬNULL(ДанныеГрафика.ПроизводственныйКалендарьКалендарныеДниСПраздникамиФактическийПериодДействия, 0) КАК КалендарныеДниСПраздниками
ИЗ
    РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК Основной
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ДанныеГрафика(
            ВидРасчета.КатегорияРасчета = &парамКатегорияНачисления
                И Регистратор = &парамРегистратор
                И Авторасчет
                И Сотрудник В (&парамСотрудники)) КАК ДанныеГрафика
    ПО Основной.Регистратор = ДанныеГрафика.Регистратор
        И Основной.НомерСтроки = ДанныеГрафика.НомерСтроки
ГДЕ
    Основной.ВидРасчета.КатегорияРасчета = &парамКатегорияНачисления
    И Основной.Регистратор = &парамРегистратор
    И Основной.Сотрудник В(&парамСотрудники)

Только после выполнения этого запроса полученные суммы дней попадают в переменные алгоритма и записываются в движения документа.

Почему больничный за прошлый период теряет один день

Проанализируем конкретную практическую ситуацию: сотрудник болел с 21 февраля по 2 марта (всего 10 календарных дней). Если рассчитать больничный лист с месяцем начисления Февраль, система корректно определяет 10 дней. Однако если листок нетрудоспособности принесли с опозданием и расчет производится в Апреле, система рассчитывает только 9 дней.

Причина такого поведения кроется в сочетании трех факторов:

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

Ошибки при ручной корректировке сторно-записей

Нередко расчетчики, видя красные строки сторнирования с нулевыми или небольшими суммами («дни неоплачиваемые по табелю»), полностью удаляют эти строки из табличной части документа. Делать это категорически запрещено по следующим причинам:

  1. Удаление сторно-строк физически разрывает интервалы вытеснения в регистрах расчета.
  2. Фактический период действия начислений искажается не только в текущем документе, но и в последующих периодах.
  3. Спустя время (например, при расчете отпуска через полгода) база среднего заработка не сойдется, так как календарные дни расчетного периода будут рассчитаны некорректно.

Важное правило: если необходимо исключить удержание или перерасчет суммы по сторнируемой строке, следует обнулять поле результата (сумму), но ни в коем случае не удалять саму строку движения с периодами.

Способы решения проблемы

Разберем, как правильно действовать в ситуациях с переходящими и опоздавшими больничными листами:

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