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

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

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

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

Выясняем причину: почему обнуляется показатель «НормаДней»?

С математической точки зрения ошибка означает, что показатель, находящийся в знаменателе расчетной формулы (в нашем случае это НормаДней или аналогичный ему показатель НормаЧасов), принял значение, равное нулю. Программа 1С не может выполнить деление на ноль и аварийно завершает расчет для конкретного сотрудника.

Давайте проанализируем основные пользовательские причины, из-за которых показатель нормы времени может стать нулевым:

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

Техническая причина ошибки: оптимизированный расчет зарплаты

Что делать, если все календари заполнены идеально, графики работы сотрудников перезаполнены, индивидуальные графики отсутствуют, а программа все равно упорно выдает ошибку «Деление на 0»? С этой проблемой массово столкнулись пользователи версий 1С:ЗУП 3.1.9.107 и 3.1.9.108.

Дело в том, что начиная с версий 3.1.8 и 3.1.9 разработчики фирмы 1С внедрили новый экспериментальный механизм — оптимизированный расчет зарплаты. За его выполнение в коде программы отвечает модуль МенеджерРасчетаЗарплаты. Цель оптимизации — существенно ускорить расчет документов начисления за счет пакетной обработки данных в оперативной памяти компьютера и сокращения количества запросов к базе данных.

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

Решение 1. Временный обход ошибки через отключение оптимизации

Если вам нужно срочно рассчитать и выдать зарплату или премию, а времени на детальные разбирательства и обновление программы нет, вы можете временно отключить оптимизированный алгоритм расчетов. Это заставит программу вернуться к старому, проверенному годами архивному коду (модуль МенеджерРасчетаЗарплатыАрхивный), в котором данной ошибки не существует.

Разберем по шагам, как отключить оптимизацию расчетов в пользовательском интерфейсе:

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

После установки этой настройки вернитесь в документ «Начисление зарплаты и взносов» (или «Премия»), очистите табличную часть и заполните документ заново. Расчет премии по формуле пройдет корректно, и ошибка «Деление на 0» исчезнет.

Решение 2. Корректировка формулы расчета премии (защита от нуля)

Если вы не хотите отключать оптимизированный расчет зарплаты (так как без него на больших базах расчет происходит медленнее), вы можете защитить саму формулу начисления от деления на ноль. Для этого мы внесем изменения в настройки начисления «Премия разовая (от отработанного времени)».

Рассмотрим подробнее два варианта корректировки формулы:

  1. Перейдите в раздел Настройка — Начисления.
  2. Найдите ваше начисление премии в списке и откройте его.
  3. На вкладке «Основное» нажмите на ссылку «Редактировать формулу».
  4. Замените стандартную формулу логическим условием с использованием тернарного оператора ?. Вместо базовой формулы напишите следующий код:

// Проверка нормы дней на значение больше нуля
СуммаРазовойПремии * ВремяВДнях / ?(НормаДней > 0, НормаДней, 1)

Как работает этот код? Программа проверяет показатель НормаДней. Если он больше нуля, то деление происходит на реальную норму дней сотрудника. Если же из-за программного сбоя норма дней определилась как 0, программа подставит вместо нее единицу. Ошибки деления на ноль не возникнет, документ успешно рассчитается и проведется, а итоговую сумму расчетчик сможет скорректировать вручную.

Второй вариант изменения формулы предполагает использование математической функции выбора максимального значения МАКС:


// Выбор максимального значения между нормой и единицей
СуммаРазовойПремии * ВремяВДнях / МАКС(НормаДней, 1)

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

Решение 3. Полноценное устранение проблемы (Обновление программы)

Важно помнить, что отключение оптимизации расчетов или изменение формулы вручную — это лишь временные меры (обходные пути). Фирма 1С позиционирует режим «без оптимизации» как временную меру для экстренных ситуаций. В более поздних версиях программы (начиная с релиза 3.1.11) старый архивный механизм расчетов был полностью удален из конфигурации. Кроме того, при отключенной оптимизации становятся недоступными некоторые современные функции авторасчета документов в реальном времени.

Для полноценного и правильного решения проблемы выполните следующие действия:

  1. Обновите конфигурацию 1С:ЗУП. Ошибки оптимизированного менеджера расчетов в ветке 3.1.9 были официально исправлены разработчиками в релизе 3.1.9.187 и во всех последующих выпусках. Обновите программу до актуального релиза. Для автоматизации регламентного обслуживания нескольких информационных баз применяется программа для тихой установки обновлений и тестирования 1С.
  2. Перезаполните графики работы. После обновления конфигурации и производственного календаря обязательно зайдите в раздел Настройка — Графики работы сотрудников, откройте используемые графики, нажмите кнопку «Заполнить» и запишите изменения. Это гарантирует актуальность нормативных данных в регистрах сведений.
  3. Снимите флаг отключения оптимизации. Перейдите обратно в настройки расчета зарплаты и снимите галочку с пункта «Выполнять расчет зарплаты без оптимизации», чтобы вернуть программе максимальное быстродействие.

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

← На главную