Как исправить ошибку «Деление на 0» при расчете разовой премии в 1С:ЗУП 3.1?

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

Каждый расчетчик заработной платы хотя бы раз сталкивался с ситуацией, когда после очередного обновления программы привычные и давно отлаженные формулы начислений внезапно перестают работать. Одной из наиболее ярких и массовых проблем такого рода стала ошибка аварийного завершения расчета с сообщением «Деление на 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.

Рассмотрим, как отключить проблемную оптимизацию и восстановить расчет премии.

Способ 1. Отключение через пользовательский интерфейс настроек

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

  1. Перейдем в раздел меню Настройка.
  2. В открывшемся списке выберем пункт Расчет зарплаты.
  3. В перечне доступных опций найдем флажок «Выполнять расчет зарплаты без оптимизации».
  4. Установим этот флажок (переведем в состояние «Истина»).
  5. Сохраним изменения.

Способ 2. Принудительное изменение через Функции для технического специалиста

Если по какой-то причине в вашем интерфейсе данный флажок скрыт или недоступен, мы можем изменить значение этой константы напрямую через структуру метаданных программы:

  1. Откроем главное меню программы (кнопка со стрелочкой в левом верхнем углу окна).
  2. Перейдем в раздел Функции для технического специалиста (в старых версиях платформы этот пункт назывался Все функции).
  3. В появившемся дереве объектов раскроем ветку Константы.
  4. Найдем в списке константу с наименованием «Выполнять расчет зарплаты без оптимизации» (системное имя может выглядеть как ВыполнятьРасчетЗарплатыБезОптимизации).
  5. Двойным кликом откроем форму константы и установим галочку в положение «Включено» (Истина).
  6. Нажмем кнопку Записать и закрыть.

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

Анализируем последствия и ограничения временного решения

Важно понимать, что установка флага «Выполнять расчет зарплаты без оптимизации» является временной мерой. Возврат к старому алгоритму расчета решает проблему деления на ноль, однако накладывает определенные ограничения на использование новых возможностей системы, появившихся в версии 3.1.9 и старше:

Стратегия долгосрочного решения проблемы

Описанный сбой был признан разработчиками фирмы «1С» официальной ошибкой конфигурации и оперативно устранен в последующих релизах. Если вы столкнулись с подобным поведением системы, мы рекомендуем придерживаться следующего плана действий:

  1. Используйте переключатель «Выполнять расчет зарплаты без оптимизации» как оперативное решение («первую помощь»), чтобы вовремя рассчитать текущую зарплату, выплатить премию и сдать отчетность.
  2. Запланируйте обновление конфигурации 1С:ЗУП на более поздний и стабильный релиз (например, ветки 3.1.10, 3.1.14 или современные долгосрочные релизы 3.1.27 / 3.1.30). В этих версиях ошибки оптимизированного расчета были полностью исправлены.
  3. Обратите внимание, что начиная с версии ЗУП 3.1.18, возможность ручного отключения оптимизации была полностью удалена разработчиками из интерфейса программы. Программа по умолчанию и без альтернатив использует новый быстрый движок расчета, в котором все «детские болезни» (включая ложное деление на ноль при неполном месяце работы) окончательно устранены в типовом коде.

Таким образом, своевременное обновление программы до актуальных релизов позволит вам использовать все преимущества быстрого расчета без необходимости жертвовать функциональностью программы.

← На главную