При работе в конфигурации 1С:Управление торговлей 11 пользователи часто сталкиваются с критической ошибкой при формировании стандартных отчетов или проведении документов. Текст ошибки обычно выглядит следующим образом: Деление на 0. Логи журнала регистрации указывают на Справочник.УпаковкиЕдиницыИзмерения.МодульМенеджера. Это системная проблема, которая блокирует получение данных по остаткам и движениям товаров. В этой статье мы подробно проанализируем причины возникновения этой ситуации и разберем методы её устранения.
Давайте разберем, что именно происходит в системе в момент возникновения сбоя. Ошибка возникает при выполнении метода СкомпоноватьРезультат. Система пытается рассчитать вес товара или пересчитать одну единицу измерения в другую, используя коэффициенты. В модуле менеджера справочника УпаковкиЕдиницыИзмерения (обычно это строка 314 или близкие к ней в зависимости от релиза) выполняется следующая операция:
КоличествоКгВЕдиницеИзмеренияВеса = СтруктураРезультат.Числитель / СтруктураРезультат.Знаменатель;
Проблема заключается в том, что переменная СтруктураРезультат.Знаменатель оказывается равной нулю. Согласно законам математики и правилам платформы 1С, такая операция недопустима и приводит к немедленной остановке выполнения программного кода. Выясним причину, почему в информационной базе появляются записи с нулевым знаменателем.
Самая распространенная причина — это отсутствие или некорректная настройка основной единицы измерения веса в параметрах системы. Рассмотрим, как это проверить:
Если поле пустое или заполнено неверно, необходимо выбрать правильную единицу (килограммы) из классификатора. Если она уже выбрана, попробуйте перевыбрать её заново, нажав на кнопку выбора и выбрав элемент из справочника Единицы измерения (ОКЕИ).
Вторая по частоте причина — некорректно введенные данные в самой карточке упаковки номенклатуры. Даже если в интерфейсе вы видите, что коэффициент равен 1, в базе данных значение реквизита Знаменатель может быть равно 0. Это часто случается при миграции данных из старых систем (например, из 1С:УТ 10.3) или при программной загрузке товаров из Excel.
Рассмотрим, как найти проблемные записи. Для этого лучше всего воспользоваться консолью запросов. Проанализируем состояние справочника с помощью простого запроса:
ВЫБРАТЬ
Упаковки.Ссылка,
Упаковки.Владелец,
Упаковки.Наименование
ИЗ
Справочник.УпаковкиЕдиницыИзмерения КАК Упаковки
ГДЕ
Упаковки.Знаменатель = 0
Если запрос вернул список записей, значит, именно эти элементы вызывают ошибку Деление на 0. Нам необходимо установить Знаменатель равным 1 для всех таких записей.
Если проблемных товаров много, исправлять их вручную нецелесообразно. Воспользуемся стандартной обработкой Групповое изменение реквизитов:
Упаковки и единицы измерения.Знаменатель, вид сравнения «Равно», значение «0».Знаменатель и установим новое значение «1».Важно: Перед выполнением групповых операций всегда создавайте архивную копию информационной базы.
Если вы хотите застраховать систему от появления подобных ошибок в будущем и у вас есть возможность вносить изменения в конфигурацию (или создавать расширения), рекомендуется добавить проверку на ноль непосредственно в код модуля. Рассмотрим пример модификации кода в процедуре пересчета:
// Вместо прямой операции:
// КоличествоКгВЕдиницеИзмеренияВеса = СтруктураРезультат.Числитель / СтруктураРезультат.Знаменатель;
// Используем безопасное условие:
Если СтруктураРезультат.Знаменатель <> 0 Тогда
КоличествоКгВЕдиницеИзмеренияВеса = СтруктураРезультат.Числитель / СтруктураРезультат.Знаменатель;
Иначе
КоличествоКгВЕдиницеИзмеренияВеса = 0;
// Дополнительно можно вывести сообщение в журнал регистрации для диагностики
ЗаписьЖурналаРегистрации("Ошибка.ЕдиницыИзмерения", УровеньЖурналаРегистрации.Предупреждение, , , "Нулевой знаменатель для единицы!");
КонецЕсли;
Использование тернарного оператора также допустимо для сокращения записи:
КоличествоКгВЕдиницеИзмеренияВеса = ?(СтруктураРезультат.Знаменатель = 0, 0, СтруктураРезультат.Числитель / СтруктураРезультат.Знаменатель);
Для того чтобы избежать повторения ситуации, следует придерживаться следующих правил при ведении учета в 1С:Управление торговлей 11:
Проанализировав все вышеперечисленные шаги, мы можем сделать вывод: ошибка «Деление на 0» в 1С:УТ 11 почти всегда связана с «грязными» данными в справочнике единиц измерения или невыполненными базовыми настройками НСИ. Исправление констант или массовая корректировка знаменателей полностью решает проблему без необходимости сложного программирования.