При выполнении процедуры закрытия месяца в конфигурации 1С:ERP Управление предприятием 2.5 (особенно в релизах ветки 2.5.8) пользователи часто сталкиваются с критической ошибкой SQL-сервера: Microsoft SQL Server Native Client 11.0: Обнаружена ошибка: деление на ноль. HRESULT=80040E14, SQLSrvr: SQLSTATE=22012. Эта ошибка прерывает расчет партий и себестоимости, не позволяя завершить финансовый период.
В этой статье мы подробно разберем причины возникновения данной проблемы, проанализируем структуру запросов системы и рассмотрим пошаговые алгоритмы диагностики и исправления данных.
Прежде всего, проанализируем текст ошибки, который выдает система. В стеке вызовов наиболее часто фигурируют следующие методы:
РасчетСебестоимостиПрикладныеАлгоритмы.Модуль(17897) — точка падения при выполнении запроса.РасчетСебестоимостиПроизводство21.Модуль — указывает на то, что проблема локализована в механизмах распределения материалов и работ (версия производства 2.1).Данные_ПоУказаннымМатериалам — название подзапроса, в котором происходит арифметическая операция деления.Ошибка SQLSTATE=22012 однозначно говорит о том, что в базе данных SQL при выполнении математических вычислений в знаменателе оказался ноль. Поскольку расчет себестоимости — это всегда деление суммы на количество (или базы распределения на коэффициенты), искать причину нужно в некорректных числовых данных в справочниках или регистрах накопления.
Одной из наиболее распространенных причин является наличие нулевого или аномально большого значения в реквизите Знаменатель справочника УпаковкиЕдиницыИзмерения.
Рассмотрим ситуацию подробнее. Даже если в пользовательском интерфейсе вы видите значение «1», в структуре базы данных может храниться «0» из-за ошибок при программном переносе данных или некорректной работе обработок по групповому изменению реквизитов. Также зафиксированы случаи, когда значение знаменателя было установлено в 10 000 000. При сложных вложенных расчетах такие числа могут приводить к переполнению разрядности или округлению промежуточных итогов до нуля, что в итоге вызывает ошибку деления.
Как проверить справочники:
ВЫБРАТЬ
Упаковки.Ссылка КАК Ссылка,
Упаковки.Владелец КАК Номенклатура,
Упаковки.Числитель КАК Числитель,
Упаковки.Знаменатель КАК Знаменатель
ИЗ
Справочник.УпаковкиЕдиницыИзмерения КАК Упаковки
ГДЕ
(Упаковки.Знаменатель = 0 ИЛИ Упаковки.Числитель = 0)
Вторая распространенная причина — наличие «битых» записей в регистре накопления СебестоимостьТоваров. Выясним причину: при расчете партионного учета система обращается к остаткам и оборотам по этому регистру. Если в базе зафиксирована строка, где количество равно нулю, а стоимость (сумма) отлична от нуля, алгоритм расчета средней цены или распределения доп. расходов может попытаться разделить сумму на нулевой остаток количества.
Диагностика через Универсальный отчет или сравнение товаров на складах и товаров организаций:
Количество <> 0 (для поиска аномалий) или, наоборот, проанализируем строки с нулевым количеством.Стоимость. Если мы видим остаток стоимости при нулевом остатке количества — это и есть причина сбоя.Поиск через консоль запросов (рекомендуемый метод):
Проанализируем виртуальную таблицу остатков регистра:
ВЫБРАТЬ
Себестоимость.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
Себестоимость.КоличествоОстаток КАК Количество,
Себестоимость.СтоимостьОстаток КАК Стоимость,
Себестоимость.РазделУчета КАК РазделУчета,
Себестоимость.Организация КАК Организация
ИЗ
РегистрНакопления.СебестоимостьТоваров.Остатки(&Период, ) КАК Себестоимость
ГДЕ
Себестоимость.КоличествоОстаток = 0
И Себестоимость.СтоимостьОстаток <> 0
Найденные документы-регистраторы, породившие такие записи, необходимо перепровести. В некоторых случаях может потребоваться использование документа Корректировка регистров для обнуления «зависших» суммовых остатков, который можно заполнить с помощью внешней обработки на основании движений любого документа.
Обратим внимание на текст ошибки в модуле РасчетСебестоимостиПроизводство21. Это указывает на проблемы при распределении материалов на выпуск продукции. Ошибка возникает, если в настройках распределения (документ Распределение материалов и работ) выбрана база распределения, показатели которой равны нулю для всех строк продукции.
Проанализируем ситуацию:
Система пытается вычислить коэффициент: Затрата / СуммаБаз. Если СуммаБаз равна 0, SQL выдает ошибку деления. Для решения необходимо проверить настройки распределения в документах выпуска или спецификациях и убедиться, что реквизиты продукции заполнены.
Если вышеуказанные способы не помогли выявить виновника, воспользуемся инструментами разработчика.
Использование Технологического журнала (ТЖ):
Настроим сбор ТЖ для события DBMSSQL. В файле конфигурации logcfg.xml добавим отбор по тексту «division by zero». Это позволит получить полный SQL-текст запроса, который отправляется на сервер. В тексте запроса можно будет увидеть временные таблицы (например, #tt1, #tt2). Анализируя состав этих таблиц через профайлер или логи, можно вычислить идентификатор (GUID) номенклатуры или документа, на котором происходит сбой.
Порядок «лечения» информационной базы:
Подведем итог: ошибка «деление на ноль» в 1С:ERP 2.5 — это почти всегда следствие «грязных» данных. Тщательный анализ справочников упаковок и остатков в регистре себестоимости позволяет устранить проблему в 90% случаев без привлечения разработчиков для изменения кода конфигурации.