Каждый расчетчик заработной платы хотя бы раз сталкивался с ситуацией, когда после очередного обновления программы привычные и давно отлаженные формулы начислений внезапно перестают работать. Одной из наиболее ярких и массовых проблем такого рода стала ошибка аварийного завершения расчета с сообщением «Деление на 0» при вычислении разовых премий у сотрудников с неполным месяцем работы.
В этой статье мы подробно разберем, почему возникает эта ошибка в программе 1С:Зарплата и Управление Персоналом 8 (редакция 3.1), проанализируем внутренние механизмы платформы, приведшие к сбою, и рассмотрим пошаговый алгоритм решения проблемы, который поможет быстро вернуть базу в рабочее состояние.
Давайте проанализируем ситуацию. Ошибка заявляет о себе при заполнении или расчете документа «Начисление зарплаты и взносов». Программа прерывает расчет и выдает предупреждение следующего вида:
«При расчете начисления "Премия разовая (от отработанного времени)" для сотрудника возникла ошибка: Деление на 0»
Чаще всего эта коллизия затрагивает начисления, в которых используется классическая формула пропорционального расчета по времени:
СуммаРазовойПремии * ВремяВДнях / НормаДней
Или аналогичный вариант расчета по часам:
СуммаРазовойПремии * ВремяВЧасах / НормаЧасов
При этом у сотрудников, отработавших месяц полностью, расчет проходит штатно. Ошибка проявляется исключительно на сотрудниках с так называемым неполным периодом работы в текущем месяце. К этой категории относятся:
Давайте разберемся в технической подоплеке данного сбоя. В линейке релизов 1С:ЗУП 3.1.9 (начиная с версий 3.1.9.107 и 3.1.9.108) разработчики фирмы «1С» представили глобальное обновление расчетного движка. Был внедрен так называемый оптимизированный механизм расчета зарплаты и НДФЛ. Цель этого нововведения была благородной — существенно сократить время проведения документов начисления на крупных базах данных за счет переписывания запросов к СУБД и оптимизации алгоритмов в коде.
Однако в первых версиях этого оптимизированного механизма содержался критический программный дефект. При обработке периодов сотрудников, отработавших месяц не полностью, новый алгоритм некорректно сопоставлял данные фактического времени и нормы времени по графику. В результате этого сбоя предопределенные показатели НормаДней (или НормаЧасов) во внутреннем кэше расчета принимали значение 0.
Когда математический процессор программы пытался рассчитать итоговый результат по формуле, он подставлял полученные значения показателей. Происходило следующее арифметическое действие:
Результат = СуммаРазовойПремии * ВремяВДнях / 0
Поскольку деление на ноль является недопустимой операцией в любом языке программирования (включая встроенный язык платформы 1С:Предприятие), система мгновенно прекращала расчет конкретного сотрудника и выдавала аварийное сообщение.
Для оперативного исправления ситуации разработчиками был предусмотрен специальный технический переключатель (константа), позволяющий временно отказаться от использования нового нестабильного движка и вернуться к старому проверенному механизму расчета из ветки ЗУП 3.1.8.
Рассмотрим, как отключить проблемную оптимизацию и восстановить расчет премии.
Это самый простой и безопасный способ, доступный пользователю с правами администратора или старшего расчетчика:
Если по какой-то причине в вашем интерфейсе данный флажок скрыт или недоступен, мы можем изменить значение этой константы напрямую через структуру метаданных программы:
ВыполнятьРасчетЗарплатыБезОптимизации).После того как мы установили данную настройку, нам необходимо вернуться в проблемный документ «Начисление зарплаты и взносов», очистить табличную часть и заново запустить процедуру автоматического заполнения и расчета. Теперь показатели НормаДней определятся корректно, исходя из назначенных сотрудникам графиков работы, и расчет разовой премии пройдет без ошибок.
Важно понимать, что установка флага «Выполнять расчет зарплаты без оптимизации» является временной мерой. Возврат к старому алгоритму расчета решает проблему деления на ноль, однако накладывает определенные ограничения на использование новых возможностей системы, появившихся в версии 3.1.9 и старше:
Описанный сбой был признан разработчиками фирмы «1С» официальной ошибкой конфигурации и оперативно устранен в последующих релизах. Если вы столкнулись с подобным поведением системы, мы рекомендуем придерживаться следующего плана действий:
Таким образом, своевременное обновление программы до актуальных релизов позволит вам использовать все преимущества быстрого расчета без необходимости жертвовать функциональностью программы.