В период адаптации программы 1С:Зарплата и Управление Персоналом (ЗУП) 3.1 к законодательным изменениям, связанным с введением оплачиваемых нерабочих дней (ОНД), пользователи и разработчики столкнулись со множеством нетипичных сценариев. Один из наиболее распространенных сбоев — некорректная запись рабочих дней в регистры расчета среднего заработка, когда посреди месяца оплачиваемых нерабочих дней у сотрудника был запланирован ежегодный отпуск. Кроме того, серьезные неудобства доставляла системная ошибка платформы при открытии документов начисления зарплаты.
В данной статье мы подробно проанализируем обе технические проблемы, выясним глубинные причины их возникновения на уровне кода программных модулей и баз данных 1С, а также рассмотрим несколько детальных способов их решения.
Проанализируем сначала ситуацию с лишним рабочим днем в расчете среднего заработка, а затем разберем критический сбой при открытии документов начисления.
---
Рассмотрим детально классический сценарий. В апреле у сотрудника оформлен отпуск в середине месяца. До отпуска и после отпуска в календаре сотрудника стоят оплачиваемые нерабочие дни (ОНД). Логическая цепочка состояний сотрудника выглядит следующим образом:
Согласно разъяснениям Министерства труда РФ (в частности, письму № 14-1/В-585), периоды оплачиваемых нерабочих дней и начисленные за них суммы должны полностью исключаться из расчета среднего заработка. В программе 1С:ЗУП 3.1 для выполнения этого требования в настройках расчета зарплаты активируется опция «Учитывать оплачиваемое нерабочее время и суммы в среднем заработке» (флаг должен быть снят).
Поскольку сотрудник весь месяц либо находился в законном отпуске, либо освобождался от работы в связи с ОНД, фактически отработанного времени в апреле у него нет. Соответственно, при расчете среднего заработка в будущем количество учитываемых дней за этот месяц должно быть строго равно 0.
Однако при проведении документа НачислениеЗарплаты программа делает запись в регистр накопления Данные о времени для расчета среднего (общий), в которой для этого сотрудника фигурирует 1 рабочий день. Это грубая ошибка, которая искусственно завышает количество дней в знаменателе формулы расчета среднего и, как следствие, занижает будущие выплаты (отпускные, командировочные).
Проанализируем логику работы конфигурации. При проведении расчетов система обращается к специализированной процедуре ИсключитьОплачиваемыеНерабочиеДни, которая отвечает за фильтрацию и вычитание периодов ОНД из общего фонда рабочего времени для среднего заработка. Алгоритм сопоставляет периоды различных видов начислений и отсутствий.
При переходе границ между вытесняющими периодами в коде запроса (при стыковке интервалов «ОНД $\rightarrow$ Отпуск» и «Отпуск $\rightarrow$ ОНД») возникает логическая ошибка. Программа некорректно обрабатывает границу стыка периодов. Из-за этого первый календарный день оплачиваемых нерабочих дней, следующих сразу за датой окончания отпуска, ошибочно воспринимается системой как обычный рабочий день. Алгоритм просто «теряет» этот стыковой день, в результате чего он записывается в регистр накопления как отработанный.
---
Если вы столкнулись с этой проблемой, ее можно решить несколькими путями, в зависимости от того, есть ли у вас доступ к программированию или необходимо решить задачу оперативно силами расчетчика.
Это самый быстрый и простой способ, если вам нужно срочно рассчитать текущий документ (например, очередной отпуск или командировку в последующих месяцах), не дожидаясь глобального исправления базы данных.
Отпуск).Чтобы ошибка не всплывала при каждом новом расчете среднего заработка для пострадавших сотрудников, правильнее скорректировать записи непосредственно в регистре накопления. Сделать это можно с помощью универсального инструмента корректировки.
ПереносДанных. В качестве номера и даты укажите текущие значения.Данные о времени для расчета среднего (общий), установите напротив него флаг и нажмите «ОК».Иногда сбой в последовательности проведения документов блокирует корректную отработку алгоритмов вытеснения времени. Разберем по шагам, как попытаться решить это стандартными средствами перепроведения:
Отпуск, который приходится на середину проблемного месяца, и временно отмените его проведение.НачислениеЗарплаты за этот же месяц, найдите сотрудника, нажмите кнопку «Пересчитать сотрудника» и проведите документ начисления зарплаты заново.Данные о времени для расчета среднего (общий). Если лишний день пропал и значение стало равно нулю, то последовательность восстановлена.Отпуск.Если в вашей организации есть штатный программист или обслуживающий специалист, оптимальным решением будет создание небольшого расширения. Это позволит исправить некорректное сопоставление периодов в процедуре ИсключитьОплачиваемыеНерабочиеДни общего модуля УчетСреднегоЗаработка.
Разберем пример кода, который можно применить в расширении для перехвата и корректировки таблиц перед записью данных в регистр расчета среднего:
&Вместо("ИсключитьОплачиваемыеНерабочиеДни")
Процедура ИсключитьОплачиваемыеНерабочиеДни(ТаблицаДанных, ПараметрыРасчета)
// Вызываем стандартную обработку заполнения таблиц
ПродолжитьВызов(ТаблицаДанных, ПараметрыРасчета);
// Дополнительный обход коллекции для устранения ошибки стыковки дат
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
Если СтрокаДанных.ОтработаноКалендарныхДней = 1 Тогда
// Проверяем наличие смежных периодов ОНД и отпусков
Если ТребуетсяОбнулениеСтыковогоДня(СтрокаДанных.Сотрудник, СтрокаДанных.ПериодРегистрации) Тогда
СтрокаДанных.ОтработаноКалендарныхДней = 0;
СтрокаДанных.ВРезервеДней = 0;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот подход гарантирует программное устранение дефекта на уровне всей информационной базы без необходимости ручного вмешательства в документы каждого сотрудника.
---
Вторая проблема, которая часто шла рука об руку с расчетами в релизе 3.1.14.97 — это аварийное завершение работы программы при попытке открыть или провести документ НачислениеЗарплаты. Программа вываливалась со следующей ошибкой:
Метод объекта не обнаружен: ОбработкаПолученияДанныхПодразделенийОрганизаций
Данная ошибка представляет собой классический зарегистрированный баг разработчиков платформы и конфигурации 1С. Сбой происходит из-за некорректного вызова экспортного метода получения данных подразделений организаций из модулей менеджера.
Анализ логов технологического журнала показал, что ошибка проявляется исключительно при соблюдении следующих условий:
На тонком клиенте или при использовании 64-битных клиентских приложений данная ошибка компиляции процедур не возникает.
---
Для восстановления стабильной работы пользователей с документами начисления зарплаты выполните одно из следующих действий:
Мы подробно разобрали обе критические ошибки, возникающие при учете оплачиваемых нерабочих дней в программе 1С:ЗУП 3.1. Применяя описанные методики ручной корректировки, изменения последовательности проведения документов и настройки клиентских приложений, вы сможете обеспечить абсолютную точность расчета среднего заработка ваших сотрудников и бесперебойную работу всей системы учета.