Имя: Пароль:
1C
1C 7.7
v7: Почему не равно?
,
0 Масянька
 
15.01.14
11:23
Доброе утро!

Чёт мне кажется, что я сошла с ума.....

Процедура Анализ()

    Если СуммаОстаткиТМЦ = СуммаПоПартиямТМЦ Тогда
        Форма.НадписьСуммаОстаткиТМЦ.Цвет(0, 0, 128);
        Форма.НадписьСуммаПоПартиямТМЦ.Цвет(0, 0, 128);
    Иначе
        Форма.НадписьСуммаОстаткиТМЦ.Цвет(255, 0, 0);
        Форма.НадписьСуммаПоПартиямТМЦ.Цвет(255, 0, 0);
    КонецЕсли;
    
КонецПроцедуры // Анализ



Выводит:
ост = 947211.85, парт = 947211.85
ост = Число, парт = Число
не равно
(вставила сообщить).
Почему не равно-то?
Спасибо.
82 Масянька
 
15.01.14
11:57
Ладно, пусть не 2 после запятой.
Почему выводит (без округления) всего 2?

(80) Однозначно!
83 zak555
 
15.01.14
11:57
(80) что это ?
84 Масянька
 
15.01.14
11:57
(75) А не красивой не стал бы помогать :(
85 Bigbro
 
15.01.14
11:57
(82) а вот на этот вопрос кроме разработчиков 1с вряд ли кто то ответит..
86 Wobland
 
15.01.14
11:57
(82) поэтому и растут волосы на руках у тех, кто сообщает
87 VladZ
 
15.01.14
11:58
(82) Нужно смотреть, откуда у тебя взялось это число. Может ты запросом получала (там одна точность), а потом в ТЗ выгружала (там другая точность).
88 Масянька
 
15.01.14
11:59
(85) Феерично :)
(87) Там довольно сложно: запрос, доп. расчеты, остатки.... Не выгружала.
89 Масянька
 
15.01.14
12:00
Ладно, дядьки - СПАСИБО!
Всем чмоки :)))
90 ЧеловекДуши
 
15.01.14
12:02
(88) Запрос покажи :)
91 Масянька
 
15.01.14
12:02
(77) А скрины - жду...
92 zak555
 
15.01.14
12:07
за свою жизнь лично видел только одну девушку, которую можно назвать программист
93 ЧеловекДуши
 
15.01.14
12:11
(92) Ну и как она тебе?
94 zak555
 
15.01.14
12:12
(93) так же был удивлён, что ум и красота на месте
95 Масянька
 
15.01.14
12:13
(77) Так ждать?
96 aka AMIGO
 
15.01.14
12:13
(89) для начала - в конфигураторе ставишь курсор приблизительно туда, где интересное место в коде
далее - нажимаешь на иконку внизу:
http://gyazo.com/17067361f6190f60232231cc7dbd0f81

попадаешь в отладчик, курсор стоит на нужном тебе месте.
далее жмакаешь 2 раза на желтой вертикальной полоске напротив строки, где тебе надо остановить выполнение:
http://gyazo.com/bb4fa1d650782f11e6bd59d88109c2ea

дальше - открываешь табло, жмакнув на иконке вверху:
http://gyazo.com/0c794fb477f98c07902cd07d63b73073

в окне табло печатаешь имя переменной, или копипастишь его из окна кода:
http://gyazo.com/4ae07e302d918eb371d0ecda3be6841f
97 aka AMIGO
 
15.01.14
12:13
(95) торопишь меня :) жди :)
98 Масянька
 
15.01.14
12:14
(97) Окей! Прости :)

PS Люблю. Жду. Лена (С)
99 dedmoroz777
 
15.01.14
12:19
(98) Не мешай! Все ждут)
100 Масянька
 
15.01.14
12:19
Мне?
101 1dvd
 
15.01.14
12:23
Я не понял. Она стукнулась или нет?
102 Simod
 
15.01.14
12:24
Сообщить(?(Цел(СуммаОстаткиТМЦ*100)/100 = СуммаОстаткиТМЦ, "Равно", "Не равно"));
Сообщить(?(Цел(СуммаПоПартиямТМЦ*100)/100 = СуммаПоПартиямТМЦ, "Равно", "Не равно"));
103 aka AMIGO
 
15.01.14
12:25
+96 идешь в 1С-Предприятие, вызываешь на выполнение свой отчет:
http://gyazo.com/7fb44e92d8654d683b06613a02c237b1

автоматом попадаешь в отладчик, в котором видно каретку, - останов в указанной тобой точке:
http://gyazo.com/b6764eef8e8a0e762699879c97c9d428

а в табло видишь значения переменных, как раз на момент в точке останова..

итого - выбирай место останова, ставь точку останова, запускай программку, наслаждайся результатами :)

Для управления выполненим программы - иконки на верхней границе окна отладчика
Для продолжения по шагам - нажимай иконку: http://gyazo.com/c19881be73ea1143b6e9349d7bd0919e
Для завершения - одну из двух:
http://gyazo.com/6c08a6ec9c035aee172f92be4c353574

вроде всё :)
успеха! :)
104 aka AMIGO
 
15.01.14
12:26
(101) "не дождетесь!" © :)
105 Масянька
 
15.01.14
12:28
(103) Огромное СПАСИБО! Персональные чмоки :)))))))))


Щас в ворд сложу, картинки вставлю. Короче, кому надо потом будет - говорите. Автор -  aka AMIGO, редактор - я :))))
106 Torquader
 
15.01.14
12:34
Кстати, для тех, кто хочет понять - в чём дело.
1С к точности дробной части относится очень "сурово"

    // проверка точности 1С
    A=1;
    B=1;
    I=1;
    Пока 1=1 Цикл
        C=A+B;
        Если C=A Тогда
            Сообщить("Обнаружена точность:B="+Строка(B));
            Прервать;
        КонецЕсли;
        Если I>1000 Тогда
            Сообщить("Превысили допустмый предел:С="+Строка(C)+",A="+Строка(A));
            Прервать;
        КонецЕсли;
        B=B*0.1;
        I=I+1;
    КонецЦикла;

Выводит:
Превысили допустмый предел:С=1,A=1

То есть система может отслеживать 1000 знаков ?
107 aka AMIGO
 
15.01.14
12:36
(105) пожалуйста :)

кстати, в табло можно помещать и функции/операторы, чтобы увидеть из результаты:
http://gyazo.com/9c83b3f3e8adb9e4adf826896aad26d6
108 Масянька
 
15.01.14
12:39
(106) За все время - впервые с таким столкнулась. Предупреждать надо :(
109 Torquader
 
15.01.14
12:40
(106) Хотя, в некоторых операциях 1С "ошибается":
    A=2;
    B=3;
    C=A/B;
    D=C*10000000000000000000000000000000000000000000000000;
    Сообщить("D="+Строка(D));

Получаем:
D=6666666666666666666666666660000000000000000000000
То есть точность 27 знаков.
110 Сисой
 
15.01.14
12:40
(0) В Такси! Только в такси!
111 Torquader
 
15.01.14
12:41
(108) Вообще, не знаю как в 1С, но в других системах, если мне нужна точность, то я считают в целых числах, смещённых до нужной точности - тогда гарантированно два числа будут совпадать, если они и на выводе совпали.
112 Torquader
 
15.01.14
12:41
(110) Думаешь, что там движок вычислений сильно переписали ?
113 Масянька
 
15.01.14
12:42
(111) Об том и речь - я получила числа, ничего с ними не делала, пытаюсь сравнить. Даже на экран вывела :(
114 zak555
 
15.01.14
12:44
(110) это ответственная работа
115 1dvd
 
15.01.14
12:45
Если женщина по определению не может быть программистом, думаете, она может быть таксистом?
116 catena
 
15.01.14
12:46
(113), как это ничего не делала, когда (88)?
117 aka AMIGO
 
15.01.14
12:48
забавна работа оператора Окр() с точностью до 2-х знаков после запятой:
http://gyazo.com/7437221f177fc103545cbdf270bfbbbd
118 Torquader
 
15.01.14
12:49
(115) Да быть можем всем, чем угодно, только вот хорошим программистом, как и хорошим таксистом - вряд ли - да и среди мужчин хороших программистов тоже не очень много.
119 aka AMIGO
 
15.01.14
12:49
+117 вроде бы должны быть равны, ан нет! :)
120 Torquader
 
15.01.14
12:50
(117) Нет, а что ты хотел - это же округление, а не отбрасывание дробной части.
Там же ещё параметр есть, как округлять 1.5 в 2 или в 1.
121 Bigbro
 
15.01.14
12:51
117 с чего бы они должны быть равны?
122 Torquader
 
15.01.14
12:51
(119) Меня больше 106 поразило - проверка точности алгоритма, знакомая со времён ассемблера, показала, что в 1С про ассемблер и сопроцессор не слышали.
123 Torquader
 
15.01.14
12:52
(121) С точки зрения программиста 1С, видимо.
124 aka AMIGO
 
15.01.14
12:53
(118) я встретил двух женщин-программисток, обе были программистки искрой божьей ..
работали мы в ВЦ, на ЕС-1020, делали огромадные расчеты, девушки справлялись запросто.
(121) в принципе принимается значение, установленное в окне свойств конфигурации. У меня - типовые настройки
(123) кхм.. :)
125 aka AMIGO
 
15.01.14
12:54
(120) точно, друже :)
126 Масянька
 
15.01.14
12:57
Да о чем вы? :))))
Меня в ступор просто вогнало: получила число, вывела на экран - а это не то число...
127 CaMoJleT
 
15.01.14
12:58
(126) Удивительное рядом :)
128 aka AMIGO
 
15.01.14
13:00
(122) да слышали они, конечно..
однозначно сталкивались в Си с точностью и двойной точностью числовых переменных
это и есть ограничение, следствие которого видно как раз в (109)
129 aka AMIGO
 
15.01.14
13:02
+128 я уже не помню, увы, порядок двойной точности.. восьмеричный код там
130 Torquader
 
15.01.14
13:10
(126) Это вы с числами double не работали - я, например, в научной работе их "сравнивал" побайтово - тогда действительно была гарантия, что числа совпадают только тогда, когда их представления совпадают.
А вывод на экран - он никогда правильно не работает.
131 Принт
 
15.01.14
13:12
(130) и то, есть вероятность натолкнуться на +0/-0 )
132 Torquader
 
15.01.14
13:13
(128) В (109) Показано, что результат операции деления просто получают из сопроцесссора, у которого точность где-то 17-18 знаков в дробной части.
А вот сложение, видимо, они отработали, как умели.
133 Torquader
 
15.01.14
13:14
(131) С точки зрения математики - это два разных числа, так что не страшно.
134 aka AMIGO
 
15.01.14
13:15
(132) или "как смогли" :)
135 Принт
 
15.01.14
13:15
(133) впервые слышу
136 Bigbro
 
15.01.14
13:19
(126) у Козьмы Пруткова в практике помнится был аналогичный случай .. ))
137 Масянька
 
15.01.14
13:20
Итак, в отладчике показывает
     СуммаОстаткиТМЦ = 947228.01
СуммаПоПартиямТМЦ = 947228.01
И что же я должна думать?
138 Wobland
 
15.01.14
13:22
(137) перенеси остатки в БП 3.0 и там посчитай
139 Масянька
 
15.01.14
13:22
Кстати, остановка стоит тут -     Если Окр(СуммаОстаткиТМЦ,2) = Окр(СуммаПоПартиямТМЦ,2) Тогда    

А выводит то, что реально или округленное?
140 Torquader
 
15.01.14
13:22
(137) Если тебе хочется, чтобы числа сравнивались, как на экране (что, для некоторых людей вполне логично), то пиши просто: Если Строка(СуммаОстаткиТМЦ)=Строка(СуммаПоПартиямТМЦ)Тогда
Конечно, математики за такое яйца оторвут, но вам это не грозит.
141 Принт
 
15.01.14
13:22
(137) 1С - 3,1421-ы
142 Torquader
 
15.01.14
13:23
(135) При рассмотрении пределов важно +0 или -0.
И при точном сравнении, если А>B, то A-B не может быть -0.
143 Масянька
 
15.01.14
13:24
(140) Мне надо правильно :(
(141) Пушистая северная лисичка :(
144 Bigbro
 
15.01.14
13:24
выводит то что в отладчике запрошено. можно любые формулы ввести в табло в том числе с округлениями.
145 Масянька
 
15.01.14
13:25
(144) В табло забила:      
СуммаОстаткиТМЦ
СуммаПоПартиямТМЦ
146 Simod
 
15.01.14
13:26
(137) Перезагрузись.
Код из (102) проверяла?
147 Bigbro
 
15.01.14
13:32
хотя с другой стороны отладчик писали те же люди из 1с ... ))
148 alexiv79
 
15.01.14
13:35
(145) Попробуй каждое число умножить допустим на 100 000 и сравнить
149 alexiv79
 
15.01.14
13:36
+(148) СуммаОстаткиТМЦ и СуммаПоПартиямТМЦ - это реквизиты или переменные?
150 Масянька
 
15.01.14
13:37
(149) Уже переменные.
151 Принт
 
15.01.14
13:38
(142) тогда почему операция сравнения в сопроцессоре говорит -0 == +0? )
153 ЧеловекДуши
 
15.01.14
13:38
(150) Уже, в какой именно момент наступило? :)
Покажи весь код :)

Лучше выложи обработку на файло помойку...
154 aka AMIGO
 
15.01.14
13:39
(139) - в окне сообщений - округленные, а в отладчике - реальные
155 Torquader
 
15.01.14
14:13
(151) С точки зрения работы сопроцессора - да - это нули.
С точки зрения стандарта представления чисел - это разные записи.
P.S. там ещё и не число есть, если кому интересно.
156 Torquader
 
15.01.14
14:21
(150) Вот тебе функция, которая показывает, что внутри числа:

Функция ВывестиЧислоКакЕсть(пчЧислоДляВывода)
    лчЦелаяЧасть=Окр(пчЧислоДляВывода,0,1);
    Если лчЦелаяЧасть>пчЧислоДляВывода Тогда лчЦелаяЧасть=лчЦелаяЧасть-1;КонецЕсли;
    лстрСтрокаЧисла=Строка(лчЦелаяЧасть)+".";
    лчДробнаяЧасть=пчЧислоДляВывода-лчЦелаяЧасть;
    Пока лчДробнаяЧасть<>0 Цикл
        лчДробнаяЧасть=лчДробнаяЧасть*10;
        лчЦелаяЧасть=Окр(лчДробнаяЧасть,0,1);
        Если лчЦелаяЧасть>лчДробнаяЧасть Тогда лчЦелаяЧасть=лчЦелаяЧасть-1;КонецЕсли;
        лстрСтрокаЧисла=лстрСтрокаЧисла+Строка(лчЦелаяЧасть);
        лчДробнаяЧасть=лчДробнаяЧасть-лчЦелаяЧасть;
    КонецЦикла;
    Возврат лстрСтрокаЧисла;
КонецФункции

Попробуй вывести свои две переменные через неё - увидишь что-то интересное.
157 Принт
 
15.01.14
14:23
(155) поднял http://ru.math.wikia.com/wiki/Отрицательный_и_положительный_ноль
+
https://ru.wikipedia.org/wiki/Отрицательный_и_положительный_ноль
с этой точки зрения -0, +0, 0 - различные, не смешиваемые в одной куче сущности
158 alexiv79
 
15.01.14
14:27
(150) Могу ошибаться, но по-моему тема такая - в реквизите ставишь формат 15.2. Он подставляет реальное число в реквизит - допустим 15.078000, но показывать будет все равно 15.08
159 Torquader
 
15.01.14
14:32
(158) После того, как "реальное" число было присвоено реквизиту с точностью 15.2, в нём будет лежать число с точностью 15.2 вне зависимости от того, что в него положили.
С ячейками таблицы значений, для которых задан тип и точность, происходит тоже самое.
160 Torquader
 
15.01.14
14:35
(157) Меня больше удивило, что (156) показало сто нулей после запятой и одну единицу в моём примере из (106), правда я I уменьшил до ста.
Вывод - на 1С можно делать математические расчёты ничего не зная про проблемы вычислений с плавающей точкой на компьютерах (в отличие от Excel, которая в трёх знаках уже врёт).
161 Масянька
 
15.01.14
14:35
(156) Спасибо - попробую.
(158) Переменные (в модуле обработки). Формат на них не накладывался.

Кстати, попробовала (102): СуммаОстаткиТМЦ - не равно, СуммаПоПартиямТМЦ - равно.
162 alexiv79
 
15.01.14
14:35
(159) Понятно - ну так значит так. Вот только вопрос - если это реквизиты - почему сумма не сходится? Если в сообщении выводится "ост = 947211.85, парт = 947211.85"
163 Принт
 
15.01.14
14:37
(160) меня удивляет, почему они при этом заставляют работать с дробями как на сопре
164 Масянька
 
15.01.14
14:39
(156) Вот что вернуло:
остатки = 947211.849999999999999999999999997999994279
партии = 947211.85
165 Масянька
 
15.01.14
14:40
+(164) Но в отладчике - другие цифры (гы-гы-гы).

По-моему, как раз в (156) и есть нормальный отладчик (для данной ситуации).
СПАСИБО!!!!!!!!!
166 Масянька
 
15.01.14
14:47
(156) Вот это - настоящий инженер!

PS На первом курсе универа: по вышке были какие-то расчеты по таблицам Брадисам. Не получается и все тут. Иду к соседу. А он еще не начал это задание делать. А к нему приехал старший брат (2 года назад окончил наш универ по ТММ). Брат - лежит в постели, читает какую-то книжку. Брат говорит: "Давай сюда свое задание." Читает, думает около 2 минут и выдает ответ. Я ошалело говорю соседу: "Вот это - настоящий инженер!".
167 Torquader
 
15.01.14
14:58
(166) Ладно - вы с восьмёркой познакомитесь - будете вывод числа в строку переписывать, чтобы без пробелов было.
Потому как ЧРГ=;нифига не отключает, хотя, вроде бы ЧГ=0; помогает.
168 Масянька
 
15.01.14
15:19
(167) Пройденный этап :) Но я снеговика не люблю....
169 ЧеловекДуши
 
15.01.14
15:21
(167) В 8-ке свои грабли :)
170 ЧеловекДуши
 
15.01.14
15:21
(164) Ну вот, опять чудо не получилось :)
171 Torquader
 
16.01.14
11:22
Кстати, не стоит пробовать вывести через (156) отрицательные числа - для способных предлагается доработать функцию под вывод отрицательных чисел.
172 Масянька
 
16.01.14
12:29
Ну, раз вы не унимаетесь: мне все-таки очень интересно - где хранится реальное число?
Сообщить, в том числе и преобразованное в строку, отладчик - выводят всего 2 цифры. А сравнивает - реальное число. Где оно лежит?!
173 VladZ
 
16.01.14
14:46
(172) Не поверишь - в памяти! :)
174 Torquader
 
16.01.14
14:51
(172) Причём, похоже, что в целом виде с отдельным указанием порядка - скорость работы с такими числами возрастает пропорционально их длине - это я вчера проверял.
Так что, в этом случае, 1С заслуживает уважения - потери точности практически не происходит.
175 Принт
 
16.01.14
14:55
176 Масянька
 
16.01.14
15:00
(173) Ага - не поверю :))))
ИМХО, это и есть моветон: пользователь может увидеть только 2 цифры после запятой, а реально сравнивается 20 цифр после запятой.
(174) Ну, да. Сколько лет работаю - впервые наступила на эти грабли. И не один раз сравнивала суммы.
177 Пятничник
 
16.01.14
16:41
(80) (83) вот и выросло поколение одинэсников, которые не знают, что такое clipper... :-)
178 aka AMIGO
 
16.01.14
16:49
(177) да просто за ненадобностью :)
180 Пятничник
 
16.01.14
16:58
(172) правильный вопрос - не ГДЕ оно хранится, а КАК.
В Клиппере (и ДБФ) были указатели точности хранения (количество десятичных знаков). в 1С решили обойтись без них (хотя вроде в 8.3 экспериментируют с ними).
(176) если б у вас только сумма и произведение были - было бы легче, но если хотя бы 1 раз возникает деление - точность результата не столь очевидна.
181 Torquader
 
16.01.14
21:05
(180) Одно дело - в базе данных - там точность чисел ограничена, а в памяти - каждый может хранить всё, что хочет.
Стандартная ситуация - умножение на количество и деление на другое количество - и чаще всего - ошибка округления.