К статье
Практический материал

Разработка и Конфигурация · 12 мин

Ошибка в 1С «Деление на 0»: причины и способы исправления

Разбираем ошибку «Деление на значение 0» в 1С: где возникает, как найти место в коде или отчёте, способы исправления через проверку делителя и настройки.

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

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

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

Где именно возникает ошибка: типичные сценарии

Чаще всего деление на ноль встречается в расчётах цен и себестоимости. Например, документ реализации содержит строку с суммой, но с нулевым количеством, а программа вычисляет цену как Сумма / Количество. Другой типичный случай — расчёт курса валюты: если в договоре или документе не заполнен курс, а код делит сумму в валюте на курс, получаем ошибку.

Вторая большая группа — отчёты и регламентные операции. Отчёты на СКД с вычисляемыми полями вида «процент выполнения плана» (Факт / План * 100) падают, когда план равен нулю. Операция «Закрытие месяца» при расчёте стоимости может делить на объём выпуска, который в текущем месяце отсутствует.

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

Ошибка при проведении документаПроблема в данных документа или коде проведения

Проверьте нулевые количества, суммы, курсы валют в строках

Ошибка при формировании отчётаДеление на ноль в вычисляемом поле СКД или запросе

Ищите поля с операцией деления в настройках отчёта

Ошибка при обмене или загрузкеПустой коэффициент или курс в справочнике

Проверьте заполненность единиц измерения и курсов валют

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

Нужна доработка кода или обновление конфигурации

Как определить точное место ошибки

Текст сообщения об ошибке — главный источник информации. В окне ошибки нажмите «Подробно»: платформа покажет модуль, номер строки и фрагмент кода, где произошло деление. Запишите или сфотографируйте эту информацию — она понадобится вам или программисту.

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

Для программиста самый быстрый способ — конфигуратор с точкой останова. Запустите отладку, поставьте точку на строке из сообщения об ошибке, воспроизведите ситуацию и посмотрите в табло значения делимого и делителя. Сразу станет ясно, какая переменная равна нулю и почему.

Порядок поиска места ошибки
  1. 1
    Воспроизведите ошибку и нажмите «Подробно» в окне сообщения
  2. 2
    Запишите имя модуля и номер строки из текста ошибки
  3. 3
    Откройте журнал регистрации и найдите событие с этой ошибкой
  4. 4
    Если есть доступ к конфигуратору — откройте указанный модуль и строку
  5. 5
    Определите, какое именно значение (количество, сумма, курс) равно нулю
  6. 6
    Проверьте, откуда это значение берётся: документ, справочник, регистр

Исправление на стороне пользователя: заполнение данных

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

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

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

Исправление в коде: защита от нулевого делителя

Классический приём в коде 1С — проверка делителя перед операцией. Вместо прямого деления используется условие: если делитель равен нулю, результат принимается равным нулю (или другому осмысленному значению), иначе выполняется деление. Это самый надёжный способ, потому что он работает всегда, независимо от данных.

Пример безопасного расчёта цены:

Если СтрокаТовары.Количество = 0 Тогда

Цена = 0;

Иначе

Цена = СтрокаТовары.Сумма / СтрокаТовары.Количество;

КонецЕсли;

Альтернатива — короткая форма через условный оператор: Цена = ?(Количество = 0, 0, Сумма / Количество);. Она компактнее и удобна в выражениях, где громоздкое «Если» неуместно. Важно: встроенная функция ОКР() или попытка обернуть деление в Попытка/Исключение — худшие решения: первое не убирает ошибку, второе маскирует любые проблемы и замедляет код.

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

bsl
Цена = ?(Количество = 0, 0, Сумма / Количество);

Исправление в отчётах на СКД и запросах

В схеме компоновки данных деление на ноль чаще всего скрывается в вычисляемых полях и ресурсах. Откройте схему (в типовых отчётах — через «Ещё» → «Изменить вариант» → расширенные настройки, либо в конфигураторе), найдите выражения с операцией «/» и оберните их проверкой. В языке выражений СКД доступен условный оператор: ВЫБОР КОГДА План = 0 ТОГДА 0 ИНАЧЕ Факт / План * 100 КОНЕЦ.

В тексте запроса защита строится аналогично — через конструкцию ВЫБОР. Это предпочтительнее, чем фильтрация нулевых строк, потому что строки с нулевым планом останутся в отчёте, просто процент по ним будет нулевым или пустым. Если такие строки не нужны вовсе, добавьте условие ГДЕ на делитель.

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

Способы защиты от деления на ноль

Проверка в коде (Если / ?)

Универсально и надёжно; требует доступа к конфигуратору и правок модуля

ВЫБОР в запросе или СКД

Подходит для отчётов; не требует изменения модулей, но правится в каждом выражении отдельно

Заполнение данных

Быстрое решение для пользователя; не защищает от повторения ошибки на новых данных

Обновление конфигурации

Помогает, если ошибка исправлена в новом релизе; требует тестирования и резервной копии

Частые ошибки при исправлении

Самая распространённая ошибка — исправить симптом вместо причины. Например, пользователь вписывает количество 0,001 вместо нуля, чтобы документ провёлся. Документ проводится, но цена становится искажённой, и эта ошибка всплывёт в отчётах по марже. Правильнее разобраться, почему количество оказалось нулевым.

Вторая ошибка — оборачивать большие куски кода в Попытка/Исключение с пустым обработчиком. Ошибка деления исчезает, но вместе с ней теряются все остальные ошибки в этом блоке, а результат расчёта становится непредсказуемым. Исключение стоит использовать только для логирования, а не для подавления.

Третья типичная проблема — исправление в одном месте при наличии нескольких одинаковых формул. Один и тот же расчёт процента может дублироваться в модуле документа, в отчёте и в печатной форме. После правки проверьте поиском по конфигурации все места с похожим делением.

Типичные ошибки
01
Подмена нуля маленьким числом в данных — искажает цены и итоги в отчётах
02
Пустой обработчик Попытка/Исключение — скрывает ошибку и все соседние проблемы
03
Правка только одного места — та же формула остаётся в отчёте или печатной форме
04
Возврат нуля без анализа логики — нулевой результат может быть недопустим по смыслу расчёта
05
Исправление на рабочей базе без копии — при ошибке правки откат затруднён

Проверка результата и профилактика

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

Для профилактики в доработках придерживайтесь простого правила: любое деление в коде должно сопровождаться проверкой делителя. Если делитель приходит из данных, введённых пользователем, добавьте контроль заполнения при записи документа — сообщение «не заполнено количество» гораздо понятнее, чем «деление на 0».

Если ошибка повторяется регулярно в типовой конфигурации и мешает работе, зафиксируйте сценарий воспроизведения и передайте его в поддержку или своему специалисту по 1С вместе с текстом из кнопки «Подробно» — это сократит время диагностики в разы.

Контрольные точки

Как проверить результат

Повторное проведение документа
Норма

Документ проводится, суммы и цены корректны

Тревожный признак

Ошибка повторяется или цены стали нулевыми без причины

Формирование отчёта
Норма

Отчёт строится, строки с нулевой базой показывают 0 или пусто

Тревожный признак

Ошибка осталась или строки с данными пропали

Смежные сценарии
Норма

Другие документы и периоды работают без ошибок

Тревожный признак

Ошибка всплывает в похожих местах — правка неполная

Итог

Что важно запомнить

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

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

Может ли ошибка деления на 0 испортить данные в базе?

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

Ошибка появляется только у одного пользователя. Что это значит?

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

Как исправить ошибку в типовой конфигурации без снятия с поддержки?

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

Почему ошибка возникает только в конце месяца при закрытии?

Регламентные операции закрытия месяца выполняют распределение затрат и расчёт себестоимости, где делителями выступают объёмы выпуска, базы распределения, количества. Если в текущем месяце по какому-то подразделению или номенклатурной группе нет базы распределения, деление падает. Проверьте настройки методов распределения и наличие движений за период.

Чем заменить деление, если нулевой результат недопустим по смыслу?

Если ноль в результате искажает отчётность, вместо подстановки нуля выводите NULL (в запросах и СКД) — тогда итоги не будут искажаться нулевыми строками. В коде можно вызвать понятное сообщение пользователю: «Не заполнено количество в строке 3» вместо молчаливого нуля или системной ошибки.

Нужно ли обращаться к программисту, если я простой пользователь?

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