Как исправить ошибку «деление на 0» в обработке «Проверка количества товаров» в 1С:Управление торговлей?

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

При работе в конфигурации 1С:Управление торговлей 11.4 (а также в аналогичных версиях 1С:ERP и 1С:КА 2.4) пользователи часто сталкиваются с критической ошибкой при выполнении операции «Проверка количества и маркировки товаров». В момент сканирования товара или при превышении фактически считанного количества над количеством в документе система выдает сообщение «Деление на 0». Эта проблема парализует работу склада и требует оперативного вмешательства технического специалиста.

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

Анализ технической причины ошибки

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


Если ЗначениеЗаполнено(СтрокаТЧ.Упаковка) Тогда
    КоэффициентУпаковки = СтрокаТЧ.Количество / СтрокаТЧ.КоличествоУпаковок;
Иначе
    КоэффициентУпаковки = 1;
КонецЕсли;

Проблема заключается в том, что в переменной СтрокаТЧ.КоличествоУпаковок содержится значение 0. Согласно правилам математики и логике платформы 1С, операция деления на ноль вызывает исключительную ситуацию, выполнение кода прекращается, и пользователь видит системное сообщение об ошибке.

Почему значение реквизита равно нулю? Рассмотрим основные ситуации:

  1. Особенности версии 11.4.11: В данной линейке релизов был изменен механизм инициализации временных таблиц при открытии формы проверки. В некоторых случаях данные из документа-распоряжения (например, Реализация товаров и услуг) переносятся во внутренние структуры обработки с потерей коэффициентов, если для товара не заданы настройки упаковок по умолчанию.
  2. Некорректная НСИ: В справочнике Упаковки для конкретной позиции числитель или знаменатель могут быть не заполнены или равны нулю. Несмотря на наличие проверок в форме элемента справочника, при программной загрузке или обменах такие данные могут попасть в базу.
  3. Ручное редактирование: Если пользователь в документе сначала выбрал упаковку, а затем программно или через групповое изменение строк очистил количество упаковок, сохранив ссылку на саму упаковку, обработка проверки может некорректно интерпретировать эту строку.

Вариант 1: Программное исправление (самый надежный способ)

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

Рассмотрим, как изменить код функции РазбитьПоНеотгружаемым. Вместо базового условия добавим дополнительную проверку на ЗначениеЗаполнено(СтрокаТЧ.КоличествоУпаковок) и его неравенство нулю.

Рекомендуемый вариант исправления:


Если ЗначениеЗаполнено(СтрокаТЧ.Упаковка) И ЗначениеЗаполнено(СтрокаТЧ.КоличествоУпаковок) И СтрокаТЧ.КоличествоУпаковок <> 0 Тогда
    КоэффициентУпаковки = СтрокаТЧ.Количество / СтрокаТЧ.КоличествоУпаковок;
Иначе
    КоэффициентУпаковки = 1;
КонецЕсли;

В данном примере мы гарантируем, что деление будет произведено только в том случае, если КоличествоУпаковок содержит корректное число. В противном случае система примет КоэффициентУпаковки равным единице, что позволит избежать вылета программы и даст пользователю возможность завершить проверку.

Вариант 2: Проверка и исправление НСИ

Если программная правка невозможна (например, база находится на поддержке без возможности изменения), проанализируем состояние справочников. Нам необходимо убедиться, что реквизиты Числитель и Знаменатель в упаковках заполнены корректно.

Разберем шаги по проверке данных:

  1. Выясним, на каком конкретном товаре происходит сбой. Для этого в отладке посмотрим значение СтрокаТЧ.Номенклатура в момент ошибки.
  2. Перейдем в карточку этой номенклатуры, откроем вкладку «Единицы измерения и упаковки».
  3. Проверим используемый Набор упаковок. Откроем список упаковок и внимательно проанализируем каждую позицию.
  4. Если вы обнаружите упаковку, где коэффициент не указан (пустое поле) или равен нулю, обязательно установите значение 1 (или фактическое количество единиц в упаковке).
  5. Важно: Иногда визуально в форме стоит «1», но в базе данных записано значение NULL или 0. Попробуйте перевыбрать упаковку в документе-распоряжении и заново запустить обработку проверки.

Вариант 3: Анализ процедуры изменения упаковок

Посмотрим на ситуацию шире. Иногда проблема кроется в том, как заполняется табличная часть самого документа перед вызовом формы проверки. Рекомендуем проанализировать процедуру ОтгружаемыеТоварыУпаковкаПриИзменении(Элемент) в модуле формы документа.

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

Дополнительные рекомендации

Рассмотрим еще несколько важных моментов, которые помогут избежать ошибки «деление на 0»:

Использование патчей: Фирма «1С» регулярно выпускает исправления для типовых ошибок (патчи). Проверьте раздел «Администрирование» — «Обслуживание» — «Обновление программы» — «Установленные исправления». Ищите патчи, в описании которых упоминается обработка ПроверкаКоличестваТоваров или ошибка деления на ноль. Велика вероятность, что для вашего релиза 11.4 уже существует официальное мини-исправление.

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

Итог: Проанализировав проблему, мы выяснили, что основной причиной является отсутствие защитного кода «от дурака» (или от некорректных данных) в типовом алгоритме пересчета упаковок. Внедрение условия Если СтрокаТЧ.КоличествоУпаковок <> 0 является наиболее быстрым и эффективным решением, которое позволит складу продолжить работу без ожидания глобального обновления конфигурации.

← На главную