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

  • Автор темы Nastyusha
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

Nastyusha

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

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

Может кто знает, как исправить эту ошибку
 

vbs

Well-Known Member
18.02.2007
1 708
3
Санкт-Петербург
#2
ШиринаБумаги как определяется ?
Если это деление единственное, пробуй
Если Число(ШиринаБумаги) > 0 Тогда
КолвоБумСПриладкой = КолвоБумаги / Число(ШиринаБумаги);
КонецЕсли;
 
N

Nastyusha

Гость
#3
попробую. спасибо. Но деление- не единственное.
 
N

Nastyusha

Гость
#5
везде, где есть деление добавила Число, но ошибка все равно не пропала.
в начале модуля есть процедура, на которую постоянно в модуле едет ссылка. может из-за нее возникает ошибка деление на 0?

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

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

и из-за чего ошибка деление на 0 возникает толmrj при создании нового документа?
 
M

mazzzay75

Гость
#6
вообще то судя по выражению - Печать.Итог("Колво") - результат сего должен уже иметь тип Число
самый лучший вариант пробегись отладчиком по процедурам, посмотри значения переменных и типы, думаю многое станет ясно
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#7
Так надо все деления проверить на возможный 0 в делителе
Предлагаю пофлудить, по какой причине необходимо это делать...
Или, если перефразировать, по какой причине при делении на нуль компиляторы и трансляторы выдают ошибку?
 
N

Nastyusha

Гость
#9
до открытия темы на форуме я везде в модуле документа сделала проверку, если деление переменную, то условие, чтобы переменная не была равна 0.
Ошибка возникает только на 1 вкладке и когда какие-либо значения равны 0, то тоже выскакивает эта ошибка. И еще при заполнении поля ввода ДатаОтгрузкиПлан.

на др. вкладках не возникает этой ошибки, даже если значения =0
 

vitfil

IT-интегратор
02.04.2004
2 062
0
44
Минск
#10
Andrus
По вашей ссылке говорится, что в принципе, можно! Но не объясняет, почему компиляторы и трансляторы выдают ошибки.
 
A

Andrus

Гость
#11
vitfil
Лично мое мнение то это просто идет так называемая защита от дурака. Потому что если посчитать со стороны математики то 0/0 может равнятся как 1 так и 321 и.т.д. вот я думаю что на уровне компиляторов и трансляторов просто защищают что бы не допускать непонятных расчетов.

Вот более подробно на уровне математики доказано что на 0 делить некорректно.
http://www.science.yoread.ru/news.php?readmore=380
 

evgenyatam

Well-Known Member
07.09.2007
175
0
43
#12
Nastyusha советую посмотреть текстовые метки на форме. там на вкладке дополнительно могут быть формулы.
 

Дайнеко

Well-Known Member
19.11.2009
951
0
53
Минск
#16
Здравствуйте, Nastyusha. Как увидел в материалах знакомое "ДатаОтгрузкиПлан", вспомнил "Факт" так и прослезился.
О вопросе: Я понимаю проблемы две:
- не понятно ГДЕ она возникает?
- ну а потом вторая - ПОЧЕМУ?

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

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

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

vbs

Well-Known Member
18.02.2007
1 708
3
Санкт-Петербург
#17
Классное объяснение. Ибо все от неявного определения типов.
На вопрос от Тургенева дан ответ от Чернышевского, только с восклицательным знаком !
 
Статус
Закрыто для дальнейших ответов.