Как исправить ошибку «деление на ноль» при расчете себестоимости в 1С:ERP 2.5?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← На главную

При выполнении процедуры закрытия месяца в конфигурации 1С:ERP Управление предприятием 2.5 (особенно в релизах ветки 2.5.8) пользователи часто сталкиваются с критической ошибкой SQL-сервера: Microsoft SQL Server Native Client 11.0: Обнаружена ошибка: деление на ноль. HRESULT=80040E14, SQLSrvr: SQLSTATE=22012. Эта ошибка прерывает расчет партий и себестоимости, не позволяя завершить финансовый период.

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

Анализ технического лога ошибки

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

Ошибка SQLSTATE=22012 однозначно говорит о том, что в базе данных SQL при выполнении математических вычислений в знаменателе оказался ноль. Поскольку расчет себестоимости — это всегда деление суммы на количество (или базы распределения на коэффициенты), искать причину нужно в некорректных числовых данных в справочниках или регистрах накопления.

Причина 1: Некорректные коэффициенты в единицах измерения и упаковках

Одной из наиболее распространенных причин является наличие нулевого или аномально большого значения в реквизите Знаменатель справочника УпаковкиЕдиницыИзмерения.

Рассмотрим ситуацию подробнее. Даже если в пользовательском интерфейсе вы видите значение «1», в структуре базы данных может храниться «0» из-за ошибок при программном переносе данных или некорректной работе обработок по групповому изменению реквизитов. Также зафиксированы случаи, когда значение знаменателя было установлено в 10 000 000. При сложных вложенных расчетах такие числа могут приводить к переполнению разрядности или округлению промежуточных итогов до нуля, что в итоге вызывает ошибку деления.

Как проверить справочники:

  1. Воспользуемся Консолью запросов, чтобы найти проблемные записи. Проанализируем таблицу упаковок:
    
    ВЫБРАТЬ
        Упаковки.Ссылка КАК Ссылка,
        Упаковки.Владелец КАК Номенклатура,
        Упаковки.Числитель КАК Числитель,
        Упаковки.Знаменатель КАК Знаменатель
    ИЗ
        Справочник.УпаковкиЕдиницыИзмерения КАК Упаковки
    ГДЕ
        (Упаковки.Знаменатель = 0 ИЛИ Упаковки.Числитель = 0)
    
  2. Если запрос вернул строки, необходимо вручную исправить значения в карточке номенклатуры (вкладка «Единицы измерения и упаковки»).
  3. Если визуально значения верны (равны 1), попробуйте перевыбрать их или перезаписать элемент справочника.

Причина 2: Ошибки в регистре «Себестоимость товаров»

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

Диагностика через Универсальный отчет или сравнение товаров на складах и товаров организаций:

  1. Перейдем в раздел Отчеты — Администрирование — Универсальный отчет.
  2. Выберем тип объекта Регистр накопления, имя объекта Себестоимость товаров, таблицу Остатки и обороты.
  3. В настройках на закладке «Фильтры» установим условие: Количество <> 0 (для поиска аномалий) или, наоборот, проанализируем строки с нулевым количеством.
  4. Особое внимание уделим колонке Стоимость. Если мы видим остаток стоимости при нулевом остатке количества — это и есть причина сбоя.

Поиск через консоль запросов (рекомендуемый метод):

Проанализируем виртуальную таблицу остатков регистра:


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

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

Причина 3: Нулевая база распределения материальных затрат

Обратим внимание на текст ошибки в модуле РасчетСебестоимостиПроизводство21. Это указывает на проблемы при распределении материалов на выпуск продукции. Ошибка возникает, если в настройках распределения (документ Распределение материалов и работ) выбрана база распределения, показатели которой равны нулю для всех строк продукции.

Проанализируем ситуацию:

Система пытается вычислить коэффициент: Затрата / СуммаБаз. Если СуммаБаз равна 0, SQL выдает ошибку деления. Для решения необходимо проверить настройки распределения в документах выпуска или спецификациях и убедиться, что реквизиты продукции заполнены.

Технические методы глубокой диагностики

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

Использование Технологического журнала (ТЖ):

Настроим сбор ТЖ для события DBMSSQL. В файле конфигурации logcfg.xml добавим отбор по тексту «division by zero». Это позволит получить полный SQL-текст запроса, который отправляется на сервер. В тексте запроса можно будет увидеть временные таблицы (например, #tt1, #tt2). Анализируя состав этих таблиц через профайлер или логи, можно вычислить идентификатор (GUID) номенклатуры или документа, на котором происходит сбой.

Порядок «лечения» информационной базы:

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

Подведем итог: ошибка «деление на ноль» в 1С:ERP 2.5 — это почти всегда следствие «грязных» данных. Тщательный анализ справочников упаковок и остатков в регистре себестоимости позволяет устранить проблему в 90% случаев без привлечения разработчиков для изменения кода конфигурации.

← На главную