Имя: Пароль:
1C
1C 7.7
v7: Фигня какая-то. Машинный ноль?
,
0 ik
 
29.11.17
20:15
"Адаптировал" сейчас внешнюю печатную форму УПД к старенькой-переддоделанной ТиС. Наткнулся на то, что не всегда выполняется условие сравнения с 0. Аж глазам не поверил - проверил даже тип значения в отладчике - всё по честному: число, 0, но условие на <= 0 не выполняется.
Пришлось сравнивать с 0.00001
1 mehfk
 
29.11.17
20:23
А ты подготовь пример, чтобы любой мог проверить.
2 ik
 
29.11.17
20:37
Боюсь, не получится. Из 7 строк "тестовой" накладной, проблема возникала на одной (забавно, но на первой)
Вот здесь условие выполнялось при ОстКолво=0 (по отладчику и по смыслу):
    Если (ОстКолво > 0)
        и (ОстКолво < ВсегоКол)
    Тогда
3 Злопчинский
 
29.11.17
20:38
(2) имхо вы заблуждаетесь
4 ik
 
29.11.17
20:39
И вот здесь
    Если ТаблицаГТД.Количество <= 0 Тогда
5 ik
 
29.11.17
20:40
Как уже говорил, вылечил заменив 0 на 0.00001
6 mishaPH
 
модератор
29.11.17
20:42
(5) бред какой-то. никогда так не делал
7 ik
 
29.11.17
20:42
XEON E5-2620
8 1c-bs
 
29.11.17
20:43
(7) Вирус?
9 ik
 
29.11.17
20:44
(6) А как? В поисках я даже через ПустоеЗначение() прошел. Увы - тоже давало 0.
10 ik
 
29.11.17
20:44
(8) Кхм.. Маловероятно, но.. Сейчас проверю.
11 mishaPH
 
модератор
29.11.17
20:49
(9) всегда сравниваю все с 0 во всех конструкциях.
12 mishaPH
 
модератор
29.11.17
20:50
ВсегоКол или ост может не число?

все значения в Число(ВсегоКол)  сделай проверь
13 mishaPH
 
модератор
29.11.17
20:51
точнее все что с чем сравниваешь приведи к числу
14 ik
 
29.11.17
20:58
KVRT вирусов не нашёл.
(12) - в первом сообщении ч писал
>проверил даже тип значения в отладчике - всё по честному: число, 0
15 ik
 
29.11.17
21:02
Ладно, что есть,то есть. Удивило изрядно.
16 1c-bs
 
29.11.17
21:04
(0) А что в таблицах лежит? 0 или 0,00001?
17 ik
 
29.11.17
21:18
(16) По смыслу - 0 (результат вычитания из 20 штук 20). Отладчик кажет 0. Что "думают" об этом процессор и платформа - не знаю.
18 Злопчинский
 
30.11.17
00:37
Ну проверь на другом сервакн
19 VladZ
 
30.11.17
04:43
(0) Скорей всего в базе где-то лежит именно "0.00001". Либо найди, откуда это "пришло". Либо при проверке округляй до 3го знака.
20 Mr_Rm
 
30.11.17
10:07
Если проблема только на первой строке, то вероятно, что где-то неинициализированная переменная. Имя "ОстКолво" везде одинаково написано, без латинских букв?
Чему равны Строка(ОстКолво) и ОстКолво*100000? Что, если сравнивать с 0.0001, 0.001 и т.д.?
21 skafandr
 
30.11.17
10:15
(0)конь в вакууме? Удивляться можно только в варианте штучного товара.Если же количество в каких-то местах пересчитывается и с полной точностью и не округляется то 0.00001 получается очень легко.
22 Масянька
 
30.11.17
10:19
(17) По смыслу - нужно проверять...
Поясняю: там везде идет пересчет (и кол-ва, и суммы). Опытным путем уже было установлено, что результат пересчета получается безо всяких округлений, а округляется уже потом.
Судя по всему - где-то зависает эта единица (в периоде после запятой), а при перерасчете вылазит (см. (19)).
Ну, и как вариант - допилить пересчеты (проверка кол-ва/суммы на последнее (т. е. остаток = списать) и списывать без перерасчета.
23 Dump
 
02.12.17
09:41
""Адаптировал" сейчас внешнюю печатную форму УПД к старенькой-переддоделанной ТиС."
Имеем 2 неизвестных - переписанную базу и переделанную ВПФ. Что тут можно посоветовать? Это даже не телепат - телепаь в квадрате  ;-)
24 mexanik_96
 
02.12.17
10:10
(0) дефайн 0 0.00001
25 Z1
 
02.12.17
10:18
(0) Типы надо приводить к одному виду
Если 99% интерпритатор это за Вас делает правильно
это не значит что в оставшемся  1% результат тоже будет правильным.
Это касается любых языков программирования а не только 1с

Т.е в 2 надо написать
Если (ОстКолво > 0.0)


Еще возможная  причина если у Вас на форме определен
ОстКолво  как 15.2 то
при занесении в ОстКолво числа 0.000001
в ОстКолво занесется 0.0
26 Otark
 
02.12.17
10:38
(25)>>Т.е в 2 надо написать Если (ОстКолво > 0.0)
можно рекомендацию от 1с где это написано. Я просто не разу не видел в типовых такого сравнения. Я вообще первый раз слышу что в 1с число может быть целым или дробным как в других ЯП. И значит у меня должна быть возможность привести переменную к этому типу?
27 nordbox
 
02.12.17
10:47
в других языках есть Integer и Real
в 1с есть просто Число но у него есть формат числа.
28 Z1
 
02.12.17
10:49
(26) Причем тут 1с в машинных кодах процессора число или целое или вещественное и это число имеет определенную длину (разрядность )

тоже само скажи
Если  ( 10/3) * 3 = 10.0 Тогда
Сообщить("Равно");
Иначе
Сообщить("Не равно");
КонецЕсли;

Какой будет результ. В общем случае результат неопределен
непредсказуем и завист от конкретной РЕАЛИЗАЦИИ языка на машинные коды
29 Dump
 
02.12.17
10:59
Про другие языки не скажу - только 1с 7.7
"Еще возможная  причина если у Вас на форме определен
ОстКолво  как 15.2 то
при занесении в ОстКолво числа 0.000001
в ОстКолво занесется 0.0"
Самая вероятная ошибка - сначала округление, потом сравнение

"Если (ОстКолво > 0.0) " - в 1с не имеет смысла, результат будет тот же, что и Если (ОстКолво > 0)

"Если  ( 10/3) * 3 = 10.0 Тогда
Сообщить("Равно");
Иначе
Сообщить("Не равно");
КонецЕсли;"
Результатом всегда будет "Не равно", ибо левая часть никогда не округлится до целого числа (10.0)
30 73с
 
02.12.17
14:54
0+ОстКолво