ОБСУЖДЕНИЕ

ошибка деления на 0 в 1с 7.7

20 ответов 17,7 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Доброго времени суток.
На форме документа есть несколько закладок. При создании нового документа одним пользователем выскакивает ошибка деление на 0.
Везде, где встречается деление я поставила проверку, но ошибка не пропала.
условие типа такого:

Если ШиринаБумаги <>0 Тогда
КолвоБумСПриладкой = КолвоБумаги / ШиринаБумаги;
КонецЕсли; // ШиринаБумаги <>0 Тогда

Может кто знает, как исправить эту ошибку
 
ШиринаБумаги как определяется ?
Если это деление единственное, пробуй
Если Число(ШиринаБумаги) > 0 Тогда
КолвоБумСПриладкой = КолвоБумаги / Число(ШиринаБумаги);
КонецЕсли;
 
попробую. спасибо. Но деление- не единственное.
 
Так надо все деления проверить на возможный 0 в делителе
 
везде, где есть деление добавила Число, но ошибка все равно не пропала.
в начале модуля есть процедура, на которую постоянно в модуле едет ссылка. может из-за нее возникает ошибка деление на 0?

.............
If Trimall(Печать.Процент) <> Trimall(Формат(?(Печать.Итог("Колво")=0,0,Печать.Колво/Печать.Итог("Колво")*100),"Ч6.2, "))+"%" Then
......................

как правильно преобразовать Печать.Итог("Колво") в число.

и из-за чего ошибка деление на 0 возникает толmrj при создании нового документа?
 
вообще то судя по выражению - Печать.Итог("Колво") - результат сего должен уже иметь тип Число
самый лучший вариант пробегись отладчиком по процедурам, посмотри значения переменных и типы, думаю многое станет ясно
 
Так надо все деления проверить на возможный 0 в делителе
Предлагаю пофлудить, по какой причине необходимо это делать...
Или, если перефразировать, по какой причине при делении на нуль компиляторы и трансляторы выдают ошибку?
 
до открытия темы на форуме я везде в модуле документа сделала проверку, если деление переменную, то условие, чтобы переменная не была равна 0.
Ошибка возникает только на 1 вкладке и когда какие-либо значения равны 0, то тоже выскакивает эта ошибка. И еще при заполнении поля ввода ДатаОтгрузкиПлан.

на др. вкладках не возникает этой ошибки, даже если значения =0
 
Andrus
По вашей ссылке говорится, что в принципе, можно! Но не объясняет, почему компиляторы и трансляторы выдают ошибки.
 
vitfil
Лично мое мнение то это просто идет так называемая защита от дурака. Потому что если посчитать со стороны математики то 0/0 может равнятся как 1 так и 321 и.т.д. вот я думаю что на уровне компиляторов и трансляторов просто защищают что бы не допускать непонятных расчетов.

Вот более подробно на уровне математики доказано что на 0 делить некорректно.
http://www.science.yoread.ru/news.php?readmore=380
 
Nastyusha советую посмотреть текстовые метки на форме. там на вкладке дополнительно могут быть формулы.
 
Ошибка деления на 0 должна выдаваться с номером строки модуля.
 
Здравствуйте, Nastyusha. Как увидел в материалах знакомое "ДатаОтгрузкиПлан", вспомнил "Факт" так и прослезился.
О вопросе: Я понимаю проблемы две:
- не понятно ГДЕ она возникает?
- ну а потом вторая - ПОЧЕМУ?

ГДЕ:
Если программа матюкнулась смачно (это значит, как верно пишет unknown181538 выдала сообщение с кусочком текста и номером строки), то тут и искать нечего. А вот когда подленько выскакивают сообщения при каждом нажатии клавиатуры, то однозначно это ФОРМУЛА в выражении на диалоге. А еще так ведут себя выражения в печатной таблице. Нет другого способа кроме как пересмотреть их. Для удобства поиска лучше не ломать над ними голову, а очищать поочередно.

ПОЧЕМУ:
Если ШиринаБумаги <>0 Тогда
КолвоБумСПриладкой = КолвоБумаги / ШиринаБумаги;
КонецЕсли;
Вы спотыкаетесь на пустое значение. Если Перем ШиринаБумаги объвлена, но ей ничего не присваивалось, то программа войдет в условие. Можете не верить - проверьте. В отладчике эта переменная покажется так: "ШиринаБумаги=" (после "=" ничего). И это не равно 0.

ЧТО ДЕЛАЕМ:
Вы навтыкали в текст модуля кучу проверок на 0. Понятно, что красоты тексту это не придало. Я сейчас так не делаю. У меня есть глобальная функция:
Код:
Функция ВзятьЧастное(Кфц_Числитель, Кфц_Знаменатель) Экспорт
Возврат ?(ПустоеЗначение(Кфц_Знаменатель) = 1, 0, Кфц_Числитель / Кфц_Знаменатель);
КонецФункции

И везде любое деление пишу только так: ПроцентПлана = ВзятьЧастное(КолПлан, КолФакт). Компактно и надежно, потому что "ПустоеЗначение(Кфц_Знаменатель)" правильно сработает и на 0 и на пустоту.
 
Классное объяснение. Ибо все от неявного определения типов.
На вопрос от Тургенева дан ответ от Чернышевского, только с восклицательным знаком !
 
Классное объяснение. Ибо все от неявного определения типов.
На вопрос от Тургенева дан ответ от Чернышевского, только с восклицательным знаком !

Не согласен я. С обоими... ;-)
 
Уел ;-)
 
Статус
Закрыто для дальнейших ответов.