При расчете пособий по временной нетрудоспособности в программах зарплатного блока 1С разработчики и расчетчики нередко сталкиваются с ситуацией, когда документ начисляет на один день меньше положенного. При этом в коде процедур расчета число дней берется из запроса, где обращение идет к полям графика, а в физических таблицах движений этих данных изначально нет. Разберем детально, как платформа вычисляет календарные дни на лету и почему возникает ошибка «плавающего дня» при расчете за прошлый период.
Рассмотрим, в какой момент в регистрах расчета появляются значения КалендарныеДни. Поле не хранится в физической таблице движений документа и не заполняется строковым присвоением до момента выполнения запроса. Формирование показателей происходит за счет механизмов вытеснения и виртуальных таблиц:
ПолучитьДанныеДляРасчета выполняется обращение к виртуальной таблице ДанныеГрафика регистра расчета. В этот момент платформа «на лету» выполняет соединение полученного фактического периода действия с регистром сведений графика (производственного календаря) и агрегирует числовые ресурсы за интервал.Посмотрим на типовой фрагмент запроса, получающий эти показатели:
ВЫБРАТЬ
ЕСТЬNULL(ДанныеГрафика.ПроизводственныйКалендарьКалендарныеДниФактическийПериодДействия, 0) КАК КалендарныеДни,
ЕСТЬNULL(ДанныеГрафика.ПроизводственныйКалендарьКалендарныеДниСПраздникамиФактическийПериодДействия, 0) КАК КалендарныеДниСПраздниками
ИЗ
РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК Основной
ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ДанныеГрафика(
ВидРасчета.КатегорияРасчета = &парамКатегорияНачисления
И Регистратор = &парамРегистратор
И Авторасчет
И Сотрудник В (&парамСотрудники)) КАК ДанныеГрафика
ПО Основной.Регистратор = ДанныеГрафика.Регистратор
И Основной.НомерСтроки = ДанныеГрафика.НомерСтроки
ГДЕ
Основной.ВидРасчета.КатегорияРасчета = &парамКатегорияНачисления
И Основной.Регистратор = &парамРегистратор
И Основной.Сотрудник В(&парамСотрудники)
Только после выполнения этого запроса полученные суммы дней попадают в переменные алгоритма и записываются в движения документа.
Проанализируем конкретную практическую ситуацию: сотрудник болел с 21 февраля по 2 марта (всего 10 календарных дней). Если рассчитать больничный лист с месяцем начисления Февраль, система корректно определяет 10 дней. Однако если листок нетрудоспособности принесли с опозданием и расчет производится в Апреле, система рассчитывает только 9 дней.
Причина такого поведения кроется в сочетании трех факторов:
ДанныеГрафика.Нередко расчетчики, видя красные строки сторнирования с нулевыми или небольшими суммами («дни неоплачиваемые по табелю»), полностью удаляют эти строки из табличной части документа. Делать это категорически запрещено по следующим причинам:
Важное правило: если необходимо исключить удержание или перерасчет суммы по сторнируемой строке, следует обнулять поле результата (сумму), но ни в коем случае не удалять саму строку движения с периодами.
Разберем, как правильно действовать в ситуациях с переходящими и опоздавшими больничными листами: