Почему в 1С:ЗУП 3.1 неверно рассчитываются данные для среднего заработка при наличии оплачиваемых нерабочих дней?

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

В практике работы с программой 1С:Зарплата и Управление Персоналом бухгалтеры и программисты часто сталкиваются с ситуациями, когда суммы, попадающие в регистр «Данные о начислениях для расчета среднего (общий)», не соответствуют ожидаемым значениям. Особенно остро эта проблема проявилась в периоды введения «президентских» оплачиваемых нерабочих дней (ОН), таких как 24 июня и 1 июля 2020 года. В этой статье мы подробно разберем, почему программа может избыточно уменьшать базу для расчета среднего, как на это влияют настройки видов времени и каким образом можно исправить эту техническую ошибку.

Суть проблемы и механизм возникновения ошибки

Рассмотрим типичную ситуацию: сотруднику с окладом 23 000 рублей в июле 2020 года начисляется заработная плата. По графику у него 23 рабочих дня, из которых 22 дня — это «Явка», а 1 день (1 июля) — «Оплачиваемый нерабочий день» (ОН). Согласно законодательству и настройкам программы, день 1 июля не должен включаться в расчет среднего заработка. Логика расчета суммы для среднего должна быть следующей:

23 000 руб. (оклад) / 23 (дней по норме) * 22 (отработанных дня) = 22 000 руб.

Однако на практике в регистр сведений попадает сумма 21 083,33 руб. Проанализируем ситуацию: сумма оказалась меньше расчетной ровно на ту долю, которую программа «потеряла» при распределении оплаты по видам времени. Выясним причину такого поведения системы.

Влияние настроек «Учета времени» на расчет среднего

Одной из ключевых причин некорректного расчета является настройка самого начисления (например, «Оплата по окладу»). Перейдем на вкладку «Учет времени». Часто для того, чтобы дни отсутствия (например, отгулы) не уменьшали сумму оклада, бухгалтеры добавляют в таблицу «Дополнительные виды времени» такие значения, как «Дополнительные выходные дни (неоплачиваемые)».

Проблема заключается в том, что при наличии более чем одного вида времени в этой вкладке (например, «Явка» + «Отгул»), внутренний алгоритм 1С начинает использовать специальные коэффициенты для распределения суммы начисления. Если в месяце присутствуют оплачиваемые нерабочие дни (ОН), программа применяет сложную логику вытеснения, которая из-за программной ошибки 10224869 начинает «зацикливаться» или дважды применять понижающий коэффициент. В результате сумма, предназначенная для среднего заработка, уменьшается избыточно.

Интересно заметить, что если изменить начисление с «Оплаты по окладу» (по дням) на «Оплату по окладу (по часам)», расчет может стать корректным. Это происходит потому, что в коде конфигурации расчеты по дням и часам обрабатываются разными программными блоками, и в «часовом» модуле данная ошибка на определенном этапе отсутствовала.

Технический анализ ошибки в программном коде

Основная проблема кроется в общем модуле РасчетЗарплатыРасширенный, а именно в функции КоэффициентыОплаченногоРабочегоВремениНачислений. Проанализируем ситуацию: функция некорректно обрабатывает массив видов времени, когда их количество превышает стандартный набор.

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


Функция КоэффициентыОплаченногоРабочегоВремениНачислений(МенеджерВременныхТаблиц) Экспорт
    Коэффициенты = Новый ТаблицаЗначений;
    Коэффициенты.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
    Коэффициенты.Колонки.Добавить("ВидРасчета", Новый ОписаниеТипов("ПланВидовРасчетаСсылка.Начисления"));
    Коэффициенты.Колонки.Добавить("Месяц", Новый ОписаниеТипов("Дата"));
    Коэффициенты.Колонки.Добавить("Сторно", Новый ОписаниеТипов("Булево"));
    Коэффициенты.Колонки.Добавить("Коэффициент", Новый ОписаниеТипов("Число"));

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("ВыделятьНерабочиеДниОтдельнымВидомВремени", УчетРабочегоВремениРасширенный.ВыделятьНерабочиеДниОтдельнымВидомВремени);
    Запрос.УстановитьПараметр("ОплачиваемыеНерабочиеДни", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.ОплачиваемыеНерабочиеДни"));
    Запрос.УстановитьПараметр("РабочееВремя", ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РабочееВремя"));

    Запрос.Текст = 
    "ВЫБРАТЬ
    |	НачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
    |	НачисленияФактическийПериодДействия.ПериодДействия КАК Месяц,
    |	НачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
    |	НачисленияФактическийПериодДействия.ОтработаноДней КАК ОтработаноДней,
    |	НачисленияФактическийПериодДействия.ОтработаноЧасов КАК ОтработаноЧасов,
    |	НачисленияФактическийПериодДействия.Сторно КАК Сторно
    |ПОМЕСТИТЬ ВТНачисленияСотрудников
    |ИЗ
    |	РегистрРасчета.Начисления.ФактическийПериодДействия КАК НачисленияФактическийПериодДействия
    |..."; // далее следует логика объединения с графиками
    
    // В данном коде критически важно правильно определить поля ОтработаноДней и ОтработаноЧасов
    // чтобы система не уменьшала их при наложении дополнительных видов времени.
КонецФункции

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

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

  1. Обновление конфигурации. Это самый правильный и безопасный метод. Ошибка 10224869 была официально исправлена компанией 1С. Для исправления необходимо обновить систему до версий 3.1.10.571 или 3.1.14.208 (и выше). После обновления потребуется перепровести документы «Начисление зарплаты и взносов» за проблемные месяцы.
  2. Временное изменение настроек начисления. Если оперативное обновление невозможно, попробуйте временно зайти в настройки начисления «Оплата по окладу» и на вкладке «Учет времени» удалить дополнительные виды времени (отгулы). После этого пересчитайте и проведите документ начисления зарплаты. Сумма в регистре среднего должна стать корректной. Затем настройки можно вернуть обратно (но помните, что при последующих перерасчетах ошибка может вернуться).
  3. Использование расширения или исправление в конфигураторе. Для опытных пользователей и программистов доступен вариант внедрения исправления через расширение конфигурации. Нужно заменить функцию КоэффициентыОплаченногоРабочегоВремениНачислений в модуле РасчетЗарплатыРасширенный на корректную версию (как показано в примере выше). Это позволит избежать изменения типовой конфигурации.
  4. Ручная корректировка. В крайнем случае, если ошибка массовая, а сроки поджимают, можно воспользоваться документом «Перенос данных» по регистру Данные о начислениях для расчета среднего (общий), чтобы вручную поправить суммы. Однако это трудоемкий процесс, который может привести к ошибкам в будущем.

Рекомендации по учету отгулов

Проанализируем методическую сторону вопроса. Использование вкладки «Учет времени» в основном окладе для добавления отгулов — это «обходной путь», который часто используют, чтобы оклад не уменьшался. Правильнее настраивать вид расчета «Отгул» таким образом, чтобы он вытеснял оклад, но при этом в самом начислении оклада использовать формулу, которая учитывает время отгулов как отработанное, либо корректно настраивать приоритеты начислений.

Подведем итог: если вы видите, что сумма в среднем заработке меньше положенной, первым делом проверьте количество видов времени в настройках оклада и наличие оплачиваемых нерабочих дней в этом месяце. Обновление до актуального релиза — лучший способ забыть об этой проблеме навсегда.

← На главную