«Деление на 0» в ЗУП: где искать ноль и как убрать сбой
Содержание
Ошибка Деление на 0 в 1С ЗУП почти всегда означает одно: в расчёт попало число, равное нулю, на которое программа делит. Это норма времени по графику, количество дней в расчётном периоде, количество ставок или показатель в формуле начисления. Исправлять код нужно редко. Обычно достаточно найти, у какого сотрудника и в каком месяце появился ноль, и поправить данные.
Частое заблуждение — сразу «тестировать и исправлять» базу или переустанавливать платформу. Это не помогает: база цела, просто в ней лежит ноль там, где его быть не должно. Начинать нужно с текста ошибки и стека вызовов — они прямо показывают место сбоя.
Первые шаги при ошибке деления на ноль
Сначала зафиксируйте, при каком действии появляется сообщение. От этого зависит, где искать.
- 📄 При проведении документа («Начисление зарплаты», «Отпуск», «Больничный лист») — ноль в данных конкретного сотрудника.
- 🧮 При нажатии «Заполнить» или «Пересчитать» — чаще ноль в графике работы или в показателях формулы.
- 📊 При формировании отчёта — ноль в отчёте с вычисляемыми полями (процент, доля, среднее).
- 🔄 Сразу после обновления — не завершена обработка данных или устарело расширение.
Запишите, на каком документе и у какого сотрудника всё началось. Если в документе 300 человек, определить виновника поможет стек.
Попробуйте провести документ только по одному сотруднику: удалите остальных в копии документа или создайте новый документ на одного человека. Ошибка воспроизводится — сотрудник найден.
Для отладки и экспериментов работайте в копии базы. Выгрузите её через Конфигуратор: Администрирование → Выгрузить информационную базу в файл .dt, затем загрузите этот файл в новую пустую базу. Для выгрузки монопольный доступ не нужен, но на большой базе процедура займёт время.
Как прочитать текст ошибки и стек вызовов
В окне ошибки есть ссылка для подробностей. Там платформа показывает полный текст: в каком модуле и на какой строке случилось деление. Выглядит это примерно так (пример, имена модулей и номера строк будут ваши):
{ОбщийМодуль.РасчетПремийДоработка.Модуль(214)}: Деление на 0
Результат = СуммаБазы / КоличествоДней;
{Документ.НачислениеЗарплаты.МодульОбъекта(87)}
{ОбщийМодуль.ЗарплатаКадры.Модуль(1532)}
Читается стек сверху вниз:
- Первая строка — точное место деления. В фигурных скобках вид объекта, имя модуля и номер строки.
- Строка кода под ней — само выражение. Видно, какая переменная оказалась нулём (здесь
КоличествоДней). - Нижние строки — цепочка вызовов: откуда пришли в это место.
Если ссылки на подробности нет, текст ошибки можно взять в журнале регистрации: Администрирование → Обслуживание → Журнал регистрации. Поставьте отбор по уровню «Ошибка» и по времени сбоя. В событии будет тот же текст со стеком.
Чей это код: типовой или доработка
От ответа зависит дальнейший план.
| Признак в стеке | Что это значит | Что делать |
|---|---|---|
| Имя модуля с префиксом расширения или явно не типовое | Доработка или расширение | Править код или обращаться к автору доработки |
ВнешняяОбработка или ВнешнийОтчет | Подключённая внешняя обработка | Отключить её и проверить без неё |
| Типовой модуль, свежий релиз | Ноль в данных | Искать сотрудника и показатель с нулём |
| Типовой модуль, ошибка после обновления | Не завершена обработка данных или ошибка релиза | См. раздел про обновления |
Список установленных расширений смотрите в Администрирование → Печатные формы, отчеты и обработки → Расширения. Там же можно временно отключить расширение
и проверить, уйдёт ли ошибка.
Поиск записей с нулём в регистрах накопления
Когда сбой в типовом коде, ноль почти наверняка лежит в данных. ЗУП хранит отработанное время, начисления и базу для среднего в регистрах накопления. Документ при проведении читает их, и если там нулевая норма или ноль дней при ненулевой сумме — получаем деление на ноль.
Шаг 1. Включите режим «Все функции»
- Откройте главное меню (кнопка с тремя полосками в левом верхнем углу).
- Выберите
Сервис → Параметры. - Отметьте флажок «Отображать команду «Все функции»».
- Теперь в главном меню есть пункт
Все функции. В нём ветка «Регистры накопления».
Шаг 2. Откройте регистр, о котором говорит стек
Имя регистра часто видно прямо в строке кода или чуть выше: РегистрыНакопления.<Имя>. Откройте его через «Все функции», поставьте отбор по сотруднику и периоду. Ищите строки, где:
- ⏱ дней или часов «по норме» — 0, а сумма начисления — больше нуля;
- 📅 запись есть, но период стоит не тот (например, начисление отнесено на будущий месяц);
- 🔁 есть сторно без исходной записи.
Шаг 3. Найдите документ-регистратор
В каждой строке регистра есть поле «Регистратор» — документ, который сделал запись. Откройте его и исправьте исходные данные: часы в табеле, даты отсутствия, период начисления. Затем перепроведите документ.
Не правьте записи регистров вручную через «Все функции» — при следующем перепроведении документа они вернутся, а движения разойдутся с документами. Исправлять нужно документ-источник.
Если нужен запрос
Для большого объёма данных удобнее консоль запросов (внешняя обработка). Шаблон: замените имя регистра и поля на те, что видите в его форме.
ВЫБРАТЬ
Рег.Период,
Рег.Регистратор,
Рег.Сотрудник
ИЗ
РегистрНакопления.<ИмяРегистра> КАК Рег
ГДЕ
Рег.Период МЕЖДУ &НачалоПериода И &КонецПериода
И Рег.<ПолеНормы> = 0
Отладка в Конфигураторе: остановка на ошибке «Деление на 0»
Если по стеку непонятно, откуда взялся ноль, поймайте ошибку отладчиком и посмотрите значения переменных в момент сбоя. Делайте это в копии базы.
- Откройте базу в Конфигураторе.
- Запустите отладку:
Отладка → Начать отладку → Тонкий клиент. - В Конфигураторе откройте
Отладка → Остановка по ошибке. - Включите остановку и укажите текст
Деление на 0, чтобы отладчик не останавливался на других исключениях. - В запущенном клиенте повторите действие: проведите документ или нажмите «Пересчитать».
- Отладчик остановится на строке с делением. Наведите курсор на переменные или добавьте их в «Табло» и посмотрите, какая из них равна нулю.
- По стеку вызовов (окно «Стек вызовов» в меню «Отладка») поднимитесь выше и найдите, откуда пришло значение.
Чтобы быстро открыть строку из текста ошибки, откройте нужный модуль и нажмите Ctrl+G — переход к строке по номеру.
Отладка в клиент-серверной базе
Код проведения документов ЗУП выполняется на сервере. Чтобы отладчик заходил в серверный код, сервер 1С:Предприятия должен быть запущен с ключом -debug. Для этого в параметры службы агента сервера добавляют ключ и перезапускают службу.
Перезапуск службы сервера 1С обрывает сеансы всех пользователей всех баз этого кластера. Делайте это вне рабочего времени или на тестовом сервере с копией базы.
Для файловой базы ничего настраивать не нужно — отладка работает сразу.
Формулы начислений и график работы: откуда берётся ноль
Две самые частые причины деления на 0 в ЗУП — пользовательская формула и пустой график.
Формула вида расчёта
Откройте Настройка → Начисления и найдите вид расчёта, который участвует в ошибке. На вкладке с формулой посмотрите, на что она делит. Опасный шаблон — деление на показатель, который у части сотрудников бывает нулевым: норма дней, количество месяцев, процент выполнения плана.
Формулы в ЗУП записываются как выражения встроенного языка, поэтому защиту от нуля можно встроить через условный оператор ?(). Пример (имена показателей возьмите из списка в редакторе формулы):
?(НормаДней = 0, 0, Оклад * ОтработаноДней / НормаДней)
Если норма нулевая, начисление станет 0, а не сломает проведение. Но это маскировка: лучше выяснить, почему норма пустая, и проверить сотрудника.
Перед правкой формулы откройте один документ, где она уже рассчитана правильно, и запишите сумму. После правки пересчитайте тот же документ в копии базы и сравните.
Пустой или незаполненный график работы
Оклад по дням и часам ЗУП делит на норму времени из графика сотрудника. Если график на нужный год не заполнен, норма за месяц равна нулю.
- Откройте
Настройка → Графики работы сотрудников. - Откройте график проблемного сотрудника.
- Проверьте, что дни и часы заполнены на весь год расчёта. Если нет — заполните график по производственному календарю.
- Проверьте, что производственный календарь заполнен на этот год. Он открывается из карточки графика.
Тот же эффект дают индивидуальные графики с нулевыми часами за месяц и кадровый документ, где сотруднику назначили график без часов.
Средний заработок с нулевыми днями
Для отпускных средний дневной заработок считается делением заработка расчётного периода на 12 и на 29,3 (ст. 139 ТК РФ). За неполные месяцы число 29,3 уменьшается пропорционально отработанным календарным дням. Если в расчётном периоде нет ни дня, порядок задаёт Положение № 922: берётся предыдущий период, а при его отсутствии — фактический заработок или тарифная ставка.
ЗУП эти случаи обрабатывает сам. Сбой возникает, когда данные о времени расходятся с суммами: месяц с начислением, но с нулём дней. Откройте в документе форму расчёта среднего заработка (рядом с суммой среднего) и проверьте помесячно колонки дней и начислений.
Ошибка деления на 0 после обновления ЗУП
Если вчера документ проводился, а после обновления — нет, причин обычно три.
1. Не завершена обработка данных. После обновления часть данных пересчитывается в фоне. Пока это не закончилось, документы могут читать неполные записи. Проверьте состояние в разделе Администрирование → Обслуживание: там есть пункт с результатами обновления и дополнительной обработкой данных. Если обработка завершилась с ошибкой, её текст подскажет проблемный объект.
2. Расширение под старый релиз. Расширение обращается к реквизитам и процедурам типовой конфигурации. После обновления реквизит могли переименовать или поменять его смысл, и в расширение приходит ноль. Отключите расширение в копии базы: ошибка ушла — расширение нужно адаптировать к новому релизу.
3. Ошибка в самом релизе. Такое бывает. Узнайте номер релиза: главное меню → Справка → О программе. Если по стеку сбой в типовом модуле, данные проверены и расширений нет — установите следующий релиз, где ошибку могли исправить.
Версия платформы
Каждый релиз ЗУП требует платформу с номером не ниже указанного в описании обновления. На слишком старой платформе база может не запуститься совсем, но возможны и отдельные сбои. Номер платформы тоже видно в окне «О программе». Если он ниже требуемого — обновите платформу на всех компьютерах и на сервере.
Как не допустить ошибку деления на 0 повторно
Деление на ноль в ЗУП — симптом пробела в данных. Профилактика — регулярно закрывать эти пробелы до расчёта.
- 📅 В декабре заполняйте графики работы и производственный календарь на следующий год.
- 🧾 Перед расчётом зарплаты проверяйте, что у всех новых сотрудников назначен график и указано количество ставок больше нуля.
- 🧮 В своих формулах ставьте защиту
?(Знаменатель = 0, …)и сразу записывайте, почему знаменатель может быть нулём. - 🧩 Перед обновлением проверяйте расширения на копии базы и прогоняйте расчёт одного месяца.
- 💾 Резервная копия — перед обновлением и перед массовым перепроведением документов.
Если база большая и ошибки «плавают», в копии базы запускают Администрирование → Тестирование и исправление в Конфигураторе с пересчётом итогов. Для этой процедуры нужен монопольный доступ, а перед запуском — свежая резервная копия.
Частые вопросы
Можно ли просто отключить ошибку деления на 0?
Почему ошибка у одного сотрудника, а у других всё считается?
Поможет ли «Тестирование и исправление» базы?
Ошибка в отчёте, а документы проводятся. Это опасно?
Надо ли обращаться в поддержку, если ошибка в типовом модуле?
Источники
- Трудовой кодекс РФ, статья 139
- Постановление Правительства РФ от 24.12.2007 № 922 «Об особенностях порядка исчисления средней заработной платы»