• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

Nastyusha

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

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

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

vbs

ШиринаБумаги как определяется ?
Если это деление единственное, пробуй
Если Число(ШиринаБумаги) > 0 Тогда
КолвоБумСПриладкой = КолвоБумаги / Число(ШиринаБумаги);
КонецЕсли;
 
N

Nastyusha

попробую. спасибо. Но деление- не единственное.
 
V

vbs

Так надо все деления проверить на возможный 0 в делителе
 
N

Nastyusha

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

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

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

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

mazzzay75

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

vitfil

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

Nastyusha

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

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

vitfil

Andrus
По вашей ссылке говорится, что в принципе, можно! Но не объясняет, почему компиляторы и трансляторы выдают ошибки.
 
A

Andrus

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

Вот более подробно на уровне математики доказано что на 0 делить некорректно.
 
E

evgenyatam

Nastyusha советую посмотреть текстовые метки на форме. там на вкладке дополнительно могут быть формулы.
 
U

unknown181538

Ошибка деления на 0 должна выдаваться с номером строки модуля.
 
Д

Дайнеко

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

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

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

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

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

vbs

Классное объяснение. Ибо все от неявного определения типов.
На вопрос от Тургенева дан ответ от Чернышевского, только с восклицательным знаком !
 
P

puh14

Классное объяснение. Ибо все от неявного определения типов.
На вопрос от Тургенева дан ответ от Чернышевского, только с восклицательным знаком !

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!