При импорте документов из внешних источников (таких как файлы Excel, XML, JSON или CSV) во внешние обработки «1С:Бухгалтерия 8.3» пользователи часто сталкиваются с аварийным завершением работы программы. Одной из наиболее распространенных и неприятных ошибок является «Деление на 0». Данная проблема полностью блокирует процесс загрузки данных, не позволяя создать или провести документ Отчет о розничных продажах.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем её причины со стороны исходных данных и программного кода, а также рассмотрим несколько эффективных способов её устранения — от простого редактирования файлов до безопасной доработки кода в конфигураторе.
Для того чтобы эффективно решить проблему, сначала проанализируем механизм работы внешней обработки загрузки. Ошибка «Деление на ноль» чаще всего возникает в математических формулах пересчета числовых показателей табличной части документа. Рассмотрим три основные группы причин:
СуммаРегл = СуммаВал * Курс / Кратность. Если в регистре сведений КурсыВалют на дату документа отсутствует запись, или если кратность валюты по какой-то причине равна нулю, программа выдаст критическую ошибку деления на ноль. При этом ручная установка кратности в справочнике на текущую дату может не помочь, если сам загружаемый документ создается прошедшей датой.Цена = Сумма / Количество. Если в файле присутствует строка с количеством равным 0 (например, подарок, акционная позиция, услуга доставки с нулевым количеством, либо техническая «пустая» строка в конце таблицы Excel), обработка пытается разделить сумму на ноль.0, что опять же приведет к ошибке деления в кодовой строке.Далее мы подробно разберем, как исправить эту ошибку программным и административным путем.
Если вам необходимо срочно загрузить данные, а программиста для исправления кода нет рядом, можно применить временный обходной путь («костыль»). Он заключается в том, чтобы заставить обработку записать документ, несмотря на ошибки проведения, чтобы затем исправить его вручную непосредственно в интерфейсе «1С:Бухгалтерия».
Рассмотрим, как это сделать по шагам:
Файл — Открыть найдите и откройте вашу внешнюю обработку (файл с расширением .epf).Модуль объекта) и найдите строку, которая вызывает ошибку (например, строку 3693, где устанавливается флаг отмены проведения).Отказ = Истина;, которая срабатывает при возникновении ошибки проведения документа Отчет о розничных продажах.// в начале строки:
// Отказ = Истина; // Временно комментируем, чтобы документ записался непроведенным
После этого сохраните обработку и запустите загрузку заново. Документ загрузится в базу в непроведенном виде (с пометкой «черновик»). Вы сможете открыть его, зайти в табличную часть, локализовать строку, в которой количество или сумма равны нулю, исправить показатели вручную и успешно провести документ стандартными средствами платформы.
Предыдущий способ удобен как временная мера, но он требует от пользователя ручной работы при каждой последующей загрузке. Чтобы решить проблему раз и навсегда, начинающему разработчику необходимо внедрить в код обработки защитные условия.
Проанализируем строку 3688, где происходит математическое деление. Допустим, исходный код выглядит следующим образом:
СтрокаТаблицы.Цена = СтрокаТаблицы.Сумма / СтрокаТаблицы.Количество;
Если СтрокаТаблицы.Количество окажется равным нулю, выполнение кода мгновенно прервется. Нам необходимо переписать этот участок, предварительно проверив делитель на равенство нулю. Напишем безопасный вариант кода:
Если СтрокаТаблицы.Количество <> 0 Тогда
СтрокаТаблицы.Цена = СтрокаТаблицы.Сумма / СтрокаТаблицы.Количество;
Иначе
СтрокаТаблицы.Цена = 0; // Назначаем нулевую цену, если количество не заполнено
КонецЕсли;
Аналогично следует поступить, если ошибка деления на ноль вызвана расчетом показателей валюты и кратности. Если в кодовой строке выполняется расчет рублевого эквивалента:
СуммаРегл = СуммаВал * КурсДокумента / КратностьДокумента;
Мы должны обезопасить расчет с помощью тернарного (сокращенного) условного оператора ? или стандартной конструкции Если...Тогда. Посмотрим на пример реализации:
БезопаснаяКратность = ?(КратностьДокумента = 0, 1, КратностьДокумента);
СуммаРегл = СуммаВал * КурсДокумента / БезопаснаяКратность;
Этот простой прием гарантирует, что даже если кратность в документе или справочнике окажется незаполненной (равной 0), система подставит в качестве делителя единицу, расчет завершится корректно, и программа не выдаст аварийное сообщение.
Если вы не хотите вносить изменения в конфигурацию и программный код внешней обработки, вам необходимо тщательно подготовить файл-источник данных перед загрузкой. Очень часто проблема кроется в форматировании самого файла Excel или CSV.
Выполните следующие шаги для локализации ошибок в данных:
Количество, Сумма, Цена).0, пусто или содержит текстовые символы (например, пробелы, знаки дефиса или буквы). Удалите такие строки или заполните их корректными числовыми значениями.Справочники — Валюты, откройте используемую валюту и убедитесь, что курс и кратность заполнены именно на ту дату, за которую загружается отчет о розничных продажах.Мы детально изучили проблему деления на ноль при загрузке документов в «1С:Бухгалтерия 8.3». Наиболее надежным и профессиональным решением является программная защита в коде внешней обработки (Способ 2). Она защитит базу данных от некорректно подготовленных файлов пользователей в будущем. Если же вам требуется разовое оперативное решение, воспользуйтесь очисткой файла-источника (Способ 3) или временным отключением жесткого отказа проведения (Способ 1).