При расчете оплаты сверхурочной работы в конфигурациях 1С:Зарплата и управление персоналом и 1С:ERP Управление предприятием пользователи сталкиваются с ситуацией, когда программа ошибочно считает, что сотрудник уже превысил годовой предел в 120 часов сверхурочной работы. В результате система начисляет всю текущую сверхурочную работу исключительно в двойном размере, пропуская положенную полуторную оплату первых двух часов смены. Разберем детально, почему возникает эта ошибка и какими способами её исправить.
Проанализируем архитектуру механизма контроля лимита 120 часов. При определении накопленного количества часов с начала календарного года алгоритм собирает данные об отработанных часах за прошлые месяцы. Сбой в расчете обычно вызывается двумя ключевыми факторами:
ФактическийПериодДействия: если в прошлых месяцах у сотрудника были периоды отсутствия (больничный лист, отпуск за свой счет), которые начинались и заканчивались внутри месяца, они разбивали фактически отработанное время на два или более отдельных интервала (до отсутствия и после него). Виртуальная таблица фактического периода действия регистра расчета возвращает несколько записей по каждому такому отрезку, а типовой запрос при сборе часов дублировал показатель отработанного времени по каждой строке интервала. Например, при фактических 22 часах переработки и двух интервалах система ошибочно фиксировала 44 часа.Выясним, как проверить расчет остатка часов до лимита непосредственно в коде конфигурации. Для анализа перейдем в модуль объекта обработки МенеджерДанныхУчетаВремениСотрудников к процедуре или функции РабочееВремяПоИсточникамДанных.
Установим точку останова на строке:
Если Не ПолучатьДетальныеЗаписиПоТерриторияУсловияТруда Тогда
В табло отладчика выполним выгрузку временной таблицы остатка лимита:
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ВТОстатокСверхурочныхЧасовДоПредела").ПолучитьДанные().Выгрузить()
В последней колонке полученной таблицы содержится расчетный остаток до предела в 120 часов. Если там отображается ноль, это не дает точного понимания величины ошибки. Чтобы увидеть реальное накопленное значение, в коде запроса (или в патче EF_60034435) временно заменим константу 120 на число 1000. После этого в табло отобразится остаток, например, 877.2. Это означает, что программа зафиксировала с начала года 1000 - 877.2 = 122.8 часов переработки, и мы сразу сможем сопоставить это значение с расчетными листками сотрудника.
Также проверим список источников сверхурочного времени через табло:
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ВТИсточникиДанныхСверхурочногоВремени").ПолучитьДанные().Выгрузить()
Разберем порядок настройки начислений, чтобы исключить наложение часов:
Для устранения ошибки задвоения часов от разрыва периодов отсутствиями фирма «1С» выпустила патч EF_60034435, а также исправление в релизе конфигурации ЗУП 3.1.38.123 (и соответствующих обновлениях ERP). Если обновление конфигурации еще не выполнено, скорректируем запрос сбора данных по накопленным часам в расширении.
В функции ЗапросРабочееВремяПоИсточникамДанных обработки МенеджерДанныхУчетаВремениСотрудников в тексте запроса к таблице начислений исключим виды расчетов, относящиеся к дополнительным оплатам, добавив условие перед секцией группировки:
И НачисленияФПД.ВидРасчета.ВидВремени <> ЗНАЧЕНИЕ(Перечисление.ВидыРабочегоВремениСотрудников.ДополнительноОплачиваемоеВПределахНормы)
Для гарантированного устранения задвоений от нескольких интервалов действия внутри одного месяца запрос к виртуальной таблице фактического периода действия заменяется на выборку из реальной таблицы движений регистра расчета Начисления с группировкой по регистратору, периоду действия и сотруднику.
Если исправление оформляется через расширение конфигурации, обратим внимание на ошибку выполнения:
{(24, 11)}: Временная таблица уже существует "ВТ_НачисленияФПД_ИсключениеЗадвоений"
Данная ошибка регулярно возникает в документе Увольнение, поскольку при расчете сотрудника механизм формирования рабочего времени по источникам данных вызывается дважды в рамках одного и того же сеанса с одним объектом МенеджерВременныхТаблиц. Чтобы избежать падения, в конце пакета запросов расширения обязательно добавляем команду явного уничтожения созданной временной таблицы:
УНИЧТОЖИТЬ ВТ_НачисленияФПД_ИсключениеЗадвоений;
Рассмотрим, как программа должна распределять часы при приближении к пределу в 120 часов. Проанализируем конкретный пример:
120 - 102.4 = 17.6 часа.17.6 часа.1.6 часа (1.3 + 0.3) сразу оплачиваются в двойном размере, так как превышают 2 часа в пределах своих смен.Таким образом, после корректной настройки видов начислений и исправления запроса выборки данных программа точно отделяет полуторные часы от двойных в строгом соответствии с трудовым законодательством.