«Деление на 0» в ЗУП: где искать ноль и как убрать сбой

· 10 мин

Содержание

Ошибка Деление на 0 в 1С ЗУП почти всегда означает одно: в расчёт попало число, равное нулю, на которое программа делит. Это норма времени по графику, количество дней в расчётном периоде, количество ставок или показатель в формуле начисления. Исправлять код нужно редко. Обычно достаточно найти, у какого сотрудника и в каком месяце появился ноль, и поправить данные.

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

Первые шаги при ошибке деления на ноль

Сначала зафиксируйте, при каком действии появляется сообщение. От этого зависит, где искать.

  • 📄 При проведении документа («Начисление зарплаты», «Отпуск», «Больничный лист») — ноль в данных конкретного сотрудника.
  • 🧮 При нажатии «Заполнить» или «Пересчитать» — чаще ноль в графике работы или в показателях формулы.
  • 📊 При формировании отчёта — ноль в отчёте с вычисляемыми полями (процент, доля, среднее).
  • 🔄 Сразу после обновления — не завершена обработка данных или устарело расширение.

Запишите, на каком документе и у какого сотрудника всё началось. Если в документе 300 человек, определить виновника поможет стек.

Попробуйте провести документ только по одному сотруднику: удалите остальных в копии документа или создайте новый документ на одного человека. Ошибка воспроизводится — сотрудник найден.

Для отладки и экспериментов работайте в копии базы. Выгрузите её через Конфигуратор: Администрирование → Выгрузить информационную базу в файл .dt, затем загрузите этот файл в новую пустую базу. Для выгрузки монопольный доступ не нужен, но на большой базе процедура займёт время.

Как прочитать текст ошибки и стек вызовов

В окне ошибки есть ссылка для подробностей. Там платформа показывает полный текст: в каком модуле и на какой строке случилось деление. Выглядит это примерно так (пример, имена модулей и номера строк будут ваши):

{ОбщийМодуль.РасчетПремийДоработка.Модуль(214)}: Деление на 0
    Результат = СуммаБазы / КоличествоДней;
{Документ.НачислениеЗарплаты.МодульОбъекта(87)}
{ОбщийМодуль.ЗарплатаКадры.Модуль(1532)}

Читается стек сверху вниз:

  1. Первая строка — точное место деления. В фигурных скобках вид объекта, имя модуля и номер строки.
  2. Строка кода под ней — само выражение. Видно, какая переменная оказалась нулём (здесь КоличествоДней).
  3. Нижние строки — цепочка вызовов: откуда пришли в это место.

Если ссылки на подробности нет, текст ошибки можно взять в журнале регистрации: Администрирование → Обслуживание → Журнал регистрации. Поставьте отбор по уровню «Ошибка» и по времени сбоя. В событии будет тот же текст со стеком.

Чей это код: типовой или доработка

От ответа зависит дальнейший план.

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

Список установленных расширений смотрите в Администрирование → Печатные формы, отчеты и обработки → Расширения. Там же можно временно отключить расширение и проверить, уйдёт ли ошибка.

Поиск записей с нулём в регистрах накопления

Когда сбой в типовом коде, ноль почти наверняка лежит в данных. ЗУП хранит отработанное время, начисления и базу для среднего в регистрах накопления. Документ при проведении читает их, и если там нулевая норма или ноль дней при ненулевой сумме — получаем деление на ноль.

Шаг 1. Включите режим «Все функции»

  1. Откройте главное меню (кнопка с тремя полосками в левом верхнем углу).
  2. Выберите Сервис → Параметры.
  3. Отметьте флажок «Отображать команду «Все функции»».
  4. Теперь в главном меню есть пункт Все функции. В нём ветка «Регистры накопления».

Шаг 2. Откройте регистр, о котором говорит стек

Имя регистра часто видно прямо в строке кода или чуть выше: РегистрыНакопления.<Имя>. Откройте его через «Все функции», поставьте отбор по сотруднику и периоду. Ищите строки, где:

  • ⏱ дней или часов «по норме» — 0, а сумма начисления — больше нуля;
  • 📅 запись есть, но период стоит не тот (например, начисление отнесено на будущий месяц);
  • 🔁 есть сторно без исходной записи.

Шаг 3. Найдите документ-регистратор

В каждой строке регистра есть поле «Регистратор» — документ, который сделал запись. Откройте его и исправьте исходные данные: часы в табеле, даты отсутствия, период начисления. Затем перепроведите документ.

Не правьте записи регистров вручную через «Все функции» — при следующем перепроведении документа они вернутся, а движения разойдутся с документами. Исправлять нужно документ-источник.

Если нужен запрос

Для большого объёма данных удобнее консоль запросов (внешняя обработка). Шаблон: замените имя регистра и поля на те, что видите в его форме.

ВЫБРАТЬ
    Рег.Период,
    Рег.Регистратор,
    Рег.Сотрудник
ИЗ
    РегистрНакопления.<ИмяРегистра> КАК Рег
ГДЕ
    Рег.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И Рег.<ПолеНормы> = 0

Отладка в Конфигураторе: остановка на ошибке «Деление на 0»

Если по стеку непонятно, откуда взялся ноль, поймайте ошибку отладчиком и посмотрите значения переменных в момент сбоя. Делайте это в копии базы.

  1. Откройте базу в Конфигураторе.
  2. Запустите отладку: Отладка → Начать отладку → Тонкий клиент.
  3. В Конфигураторе откройте Отладка → Остановка по ошибке.
  4. Включите остановку и укажите текст Деление на 0, чтобы отладчик не останавливался на других исключениях.
  5. В запущенном клиенте повторите действие: проведите документ или нажмите «Пересчитать».
  6. Отладчик остановится на строке с делением. Наведите курсор на переменные или добавьте их в «Табло» и посмотрите, какая из них равна нулю.
  7. По стеку вызовов (окно «Стек вызовов» в меню «Отладка») поднимитесь выше и найдите, откуда пришло значение.

Чтобы быстро открыть строку из текста ошибки, откройте нужный модуль и нажмите Ctrl+G — переход к строке по номеру.

Отладка в клиент-серверной базе

Код проведения документов ЗУП выполняется на сервере. Чтобы отладчик заходил в серверный код, сервер 1С:Предприятия должен быть запущен с ключом -debug. Для этого в параметры службы агента сервера добавляют ключ и перезапускают службу.

Перезапуск службы сервера 1С обрывает сеансы всех пользователей всех баз этого кластера. Делайте это вне рабочего времени или на тестовом сервере с копией базы.

Для файловой базы ничего настраивать не нужно — отладка работает сразу.

Формулы начислений и график работы: откуда берётся ноль

Две самые частые причины деления на 0 в ЗУП — пользовательская формула и пустой график.

Формула вида расчёта

Откройте Настройка → Начисления и найдите вид расчёта, который участвует в ошибке. На вкладке с формулой посмотрите, на что она делит. Опасный шаблон — деление на показатель, который у части сотрудников бывает нулевым: норма дней, количество месяцев, процент выполнения плана.

Формулы в ЗУП записываются как выражения встроенного языка, поэтому защиту от нуля можно встроить через условный оператор ?(). Пример (имена показателей возьмите из списка в редакторе формулы):

?(НормаДней = 0, 0, Оклад * ОтработаноДней / НормаДней)

Если норма нулевая, начисление станет 0, а не сломает проведение. Но это маскировка: лучше выяснить, почему норма пустая, и проверить сотрудника.

Перед правкой формулы откройте один документ, где она уже рассчитана правильно, и запишите сумму. После правки пересчитайте тот же документ в копии базы и сравните.

Пустой или незаполненный график работы

Оклад по дням и часам ЗУП делит на норму времени из графика сотрудника. Если график на нужный год не заполнен, норма за месяц равна нулю.

  1. Откройте Настройка → Графики работы сотрудников.
  2. Откройте график проблемного сотрудника.
  3. Проверьте, что дни и часы заполнены на весь год расчёта. Если нет — заполните график по производственному календарю.
  4. Проверьте, что производственный календарь заполнен на этот год. Он открывается из карточки графика.

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

Средний заработок с нулевыми днями

Для отпускных средний дневной заработок считается делением заработка расчётного периода на 12 и на 29,3 (ст. 139 ТК РФ). За неполные месяцы число 29,3 уменьшается пропорционально отработанным календарным дням. Если в расчётном периоде нет ни дня, порядок задаёт Положение № 922: берётся предыдущий период, а при его отсутствии — фактический заработок или тарифная ставка.

ЗУП эти случаи обрабатывает сам. Сбой возникает, когда данные о времени расходятся с суммами: месяц с начислением, но с нулём дней. Откройте в документе форму расчёта среднего заработка (рядом с суммой среднего) и проверьте помесячно колонки дней и начислений.

Диагностика: выберите симптом

Ошибка деления на 0 после обновления ЗУП

Если вчера документ проводился, а после обновления — нет, причин обычно три.

1. Не завершена обработка данных. После обновления часть данных пересчитывается в фоне. Пока это не закончилось, документы могут читать неполные записи. Проверьте состояние в разделе Администрирование → Обслуживание: там есть пункт с результатами обновления и дополнительной обработкой данных. Если обработка завершилась с ошибкой, её текст подскажет проблемный объект.

2. Расширение под старый релиз. Расширение обращается к реквизитам и процедурам типовой конфигурации. После обновления реквизит могли переименовать или поменять его смысл, и в расширение приходит ноль. Отключите расширение в копии базы: ошибка ушла — расширение нужно адаптировать к новому релизу.

3. Ошибка в самом релизе. Такое бывает. Узнайте номер релиза: главное меню → Справка → О программе. Если по стеку сбой в типовом модуле, данные проверены и расширений нет — установите следующий релиз, где ошибку могли исправить.

Версия платформы

Каждый релиз ЗУП требует платформу с номером не ниже указанного в описании обновления. На слишком старой платформе база может не запуститься совсем, но возможны и отдельные сбои. Номер платформы тоже видно в окне «О программе». Если он ниже требуемого — обновите платформу на всех компьютерах и на сервере.

Как не допустить ошибку деления на 0 повторно

Деление на ноль в ЗУП — симптом пробела в данных. Профилактика — регулярно закрывать эти пробелы до расчёта.

  • 📅 В декабре заполняйте графики работы и производственный календарь на следующий год.
  • 🧾 Перед расчётом зарплаты проверяйте, что у всех новых сотрудников назначен график и указано количество ставок больше нуля.
  • 🧮 В своих формулах ставьте защиту ?(Знаменатель = 0, …) и сразу записывайте, почему знаменатель может быть нулём.
  • 🧩 Перед обновлением проверяйте расширения на копии базы и прогоняйте расчёт одного месяца.
  • 💾 Резервная копия — перед обновлением и перед массовым перепроведением документов.

Если база большая и ошибки «плавают», в копии базы запускают Администрирование → Тестирование и исправление в Конфигураторе с пересчётом итогов. Для этой процедуры нужен монопольный доступ, а перед запуском — свежая резервная копия.

Перед расчётом зарплаты за месяц
Выполнено: 0 / 6

Частые вопросы

Можно ли просто отключить ошибку деления на 0?
Нет. Платформа прерывает выполнение кода, и документ не проводится. Можно только убрать ноль из данных или добавить проверку в код или формулу.
Почему ошибка у одного сотрудника, а у других всё считается?
Ноль лежит в данных именно этого человека: график, количество ставок, табель или расчётный период среднего. Проведите документ по нему одному и изучите стек.
Поможет ли «Тестирование и исправление» базы?
Редко. Оно чинит нарушенную структуру и итоги, а нулевая норма в графике — корректные с точки зрения базы данные. Сначала ищите ноль по стеку.
Ошибка в отчёте, а документы проводятся. Это опасно?
Обычно нет: в отчёте есть вычисляемое поле с делением, а в данных за период — ноль в знаменателе. Сузьте период или отбор и найдите строку с нулём.
Надо ли обращаться в поддержку, если ошибка в типовом модуле?
Если данные проверены, расширения отключены, а сбой повторяется на свежем релизе — да. Приложите полный текст ошибки со стеком и номер релиза.

Источники

  • Трудовой кодекс РФ, статья 139
  • Постановление Правительства РФ от 24.12.2007 № 922 «Об особенностях порядка исчисления средней заработной платы»