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