![]() |
|
1С:Предприятие
:: 1С:Предприятие 7.7 и ранее
|
|
| ||
Asya666 02.02.21 - 10:26 | Доброго дня!
Есть в одной процедуре вот такая строчка: глВзаиморасчеты = Сум+СумБО+СумПО-СумРН; В отладчике получаю странный ответ: Сум = 2533 СумБО = 0 СумБН = 0 СумРН = 2533 СумПО = 0 глВзаиморасчеты = 2533 Сум-СумРН+СумБО+СумПО = 0 Как такое возможно? Я же явно присваиваю значение, оно ведь даже правильно считается, но записывается не то, из-за этого потом летят все условия. Каждая цифра кроме глВзаиморасчеты посчитались полностью правильно, считаются отдельной процедурой. На что обратить внимание? Где ловить ошибку? Пошагово уже все это прошла, но не вижу где система спотыкается. | ||
acht 1 - 02.02.21 - 10:29 | У тебя формулы разные | ||
acht 2 - 02.02.21 - 10:30 | 2533 - 2533 + 0 + 0 = 0 | ||
Asya666 3 - 02.02.21 - 10:33 | (1) Это уже наслоения в отладчике, но от перемены мест слагаемых результат не изменился, глВзаиморасчеты <> 0, почему то. | ||
fisher 4 - 02.02.21 - 10:40 | (3) "считаются отдельной процедурой" Вероятно, одна из цифр не точно 2533, а с "хвостиком" в стопяцотом знаке. А отладчик округляет при отображении. | ||
Asya666 5 - 02.02.21 - 11:03 | (4) И получается с точки зрения программы 2533 = 2533+0+0-2533? Разве может округление так повлиять? | ||
Bigbro 6 - 02.02.21 - 11:05 | может если "-2533" - строка | ||
mikecool 7 - 02.02.21 - 11:06 | (0) программа делает только то, что ты ей указала. | ||
Bigbro 8 - 02.02.21 - 11:08 | где то в вычислениях строку с числом складываете скорее всего.
задавайте явно тип результат = "" + сумма для строки результат = 0 + сумма для числа. | ||
Kigo_Kigo 9 - 02.02.21 - 11:22 | а если так глВзаиморасчеты = 0; глВзаиморасчеты = Число(Сум)+Число(СумБО)+Число(СумПО)-Число(СумРН); | ||
mikecool 10 - 02.02.21 - 11:23 | (8) строка с числом не сложится, даже в 77 | ||
Kigo_Kigo 11 - 02.02.21 - 11:23 | Буратино дали три яблока. Два он съел. Сколько яблок осталось у Буратино? Думаете одно? Ничего подобного. Никто не знает сколько у него уже было яблок до этого. Мораль — всегда обнуляйте переменные! | ||
Bigbro 12 - 02.02.21 - 11:24 | (10) да, ладно? вроде складывалось) строка идет за ноль. | ||
fisher 13 - 02.02.21 - 11:24 | (5) А! У тебя 2533 получается? Я ориентировался на твое высказывание "глВзаиморасчеты <> 0, почему то" | ||
Kigo_Kigo 14 - 02.02.21 - 11:25 | (10) Возможно что глВзаиморасчеты изначально строка, тогда можем получить подобный результат, и кстати у 7.7 реально иногда проскакивают мат. действия разных типов, сам лично сталкивался | ||
El_Duke 15 - 02.02.21 - 11:43 | (11) - Изя, у тебя было 6 яблок, половину ты отдал Сёме, сколько у тебя осталось ?
- Пять с половиной ! | ||
Asya666 16 - 02.02.21 - 14:19 | |||
Asya666 17 - 02.02.21 - 15:38 | Отладчик огорчает - получается все полученные значения с типом число...(((
ТипЗначения(Сум) = 1 ТипЗначения(СумБО) = 1 ТипЗначения(СумПО) = 1 ТипЗначения(СумРН) = 1 ТипЗначения(глВзаиморасчеты) = 1Обнулила как и предлагалось глВзаиморасчеты, но тоже безрезультатно. В чем еще может быть проблема? | ||
Kigo_Kigo 18 - 02.02.21 - 15:40 | |||
Asya666 19 - 02.02.21 - 15:40 | Вот прям чувствую что проблема в какой-нибудь опечатке, мелочи, чем-то что мешает, и не заметно по закону подлости)) | ||
Asya666 20 - 02.02.21 - 15:41 | (18) ага | ||
Масянька 21 - 02.02.21 - 15:43 | (20) Разложите свое число в строку и посмотрите знаки после запятой. | ||
Масянька 22 - 02.02.21 - 15:44 | + (21) Причем, не только 2533, а и 0 (они же тоже получаются вычислением). | ||
Kigo_Kigo 23 - 02.02.21 - 15:44 | (20) тогда давай весь код, где это происходит, что у ж там
Кстати а вот так что выдаст глВзаиморасчеты1 = 0; глВзаиморасчеты1 = Число(Сум)+Число(СумБО)+Число(СумПО)-Число(СумРН); Сообщить(глВзаиморасчеты1); что выдаст? | ||
ChMikle 24 - 02.02.21 - 15:45 | Посмотрите Значение Переменной глВзаиморасчеты до начала выполнения глВзаиморасчеты = Сум+СумБО+СумПО-СумРН;
потом отдельно Сум+СумБО+СумПО-СумРН в отладчике и глВзаиморасчеты (м.б.буква в переменной английская) поэтому и результат не меняется | ||
Kigo_Kigo 25 - 02.02.21 - 15:46 | есть подозрение что глВзаиморасчеты это глобальная переменная, которая привязана к глобальной функции вычесления глВзаиморасчеты, и после обсчетов ТС-а, срабатывает и сбрасывает ее | ||
Жан Пердежон 26 - 02.02.21 - 15:49 | скриншот бы лучше показал с кодом в отладчике и таблом | ||
Kigo_Kigo 27 - 02.02.21 - 15:51 | Сча посмотрел в ТиС-е //****************************************************************************** // глВзаиморасчеты(Фирма,Договор,Роль) // // Параметры: // Фирма - фирма, в рамках которой происходит просмотр // Договор - договор контрагента // Роль - строка "Поставщик" или "Покупатель" // // Возвращаемое значение: // Нет // // Описание: // Формирует отчет по взаиморасчетам с выбранным контрагентом по выбранному // договору с выбранной фирмой. // Процедура глВзаиморасчеты(Фирма,Договор,Роль) Экспорт | ||
Asya666 28 - 02.02.21 - 16:04 | Процедура глРасчетСумм(Конт) экспорт  //для расчета суммы итога взаиморасчета Сум=0; СумБО=0; СумБН=0; СумРН=0; СумПО=0; КореньДок=глНайтиКорень(Конт);  // находим корень расчитываемого документа Док = Конт.ТекущийДокумент(); //записываем в переменную текущий документ Если Док=КореньДок Тогда //проверяем не одинаковы ли они, если да, то считаем сумму по нему, иначе ничего, идем дальше ДокВид=Док.Вид(); Если ДокВид="Расход_Общий" Тогда//там куча проверок по разным типам документов, но в моем случае расчет касается только Если Док.Проведен()=1 Тогда  //Расход_Общий Если Док.ТолькоРезерв=0 Тогда СумРН=СумРН+Док.Итог("Сумма"); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Вв=СоздатьОбъект("Документ"); //--------------------------------------- Если Вв.ВыбратьПодчиненныеДокументы(,,Док)=1 тогда// смотрим подчиненные документы у текущего Пока Вв.ПолучитьДокумент()=1 Цикл//если есть, то проверяем какого вида и считаем сумму по ним и складываем все ВвВид=Вв.Вид(); Если ВвВид="ДругойДок" Тогда  //... глРасчетСумм(Вв); ИначеЕсли ВвВид="ДругойДок" Тогда  //... глРасчетСумм(Вв); ИначеЕсли ВвВид="Расход_Общий" Тогда Если Вв.Проведен()=1 Тогда Если Вв.ТолькоРезерв=0 Тогда СумРН=СумРН+Вв.Итог("Сумма"); КонецЕсли; КонецЕсли; глРасчетСумм(Вв); иначе возврат; КонецЕсли; КонецПроцедуры и далее используется в другой процедуре результат этих вычислений: Если Конт.Вид()="Расход_Общий" тогда глРасчетСумм(Конт); глВзаиморасчеты = 0; глВзаиморасчеты = Сум+СумБО+СумПО-СумРН; Если (глВзаиморасчеты = 0) тогда  //проверка на наличие долгов по взаиморасчетам Ответ = СокрЛП(Вопрос("Взаиморасчеты равны нулю, создать новый документ?", "Да+Нет")); Если Ответ="Да" Тогда  //исполняется дальше | ||
Asya666 29 - 02.02.21 - 16:17 | (23) глВзаиморасчеты1 = 2533 | ||
Asya666 30 - 02.02.21 - 16:24 | Очередной эксперимент дал интересный результат:
глВзаиморасчеты1 = Число(СумРН); СумРН = 2533 глВзаиморасчеты1 = 0еще бы понять почему... Рекламное место пустует | ||
Arbuz 31 - 02.02.21 - 16:26 | Опечатка в СумРН, может С английская | ||
Kigo_Kigo 32 - 02.02.21 - 16:26 | после
глВзаиморасчеты = 0;
Вставь
Сообщить("Сум=" + Строка(Сум)+ " " + "СумБО=" + Строка(СумБО) + " " + "СумПО=" + Строка(СумПО) + " " + "СумРН = " + Строка(СумРН));
Что сообщить? | ||
Kigo_Kigo 33 - 02.02.21 - 16:27 | (31) тогда было бы переменная не обнаружена СумРН | ||
Arbuz 34 - 02.02.21 - 16:27 | ТипЗначенияСтр(СумРН) что сообщает? | ||
Arbuz 35 - 02.02.21 - 16:28 | (33) не обязательно, если там вперемешку, то может где-то и объявляется | ||
Kigo_Kigo 36 - 02.02.21 - 16:33 | (32) * что сообЩАЕТ? | ||
Asya666 37 - 02.02.21 - 16:36 | (34) ТипЗначенияСтр(СумРН) | ||
Asya666 38 - 02.02.21 - 16:36 | (34) ТипЗначенияСтр(СумРН) = "Число" | ||
fisher 39 - 02.02.21 - 16:37 | (31) Бинго! | ||
Asya666 40 - 02.02.21 - 16:37 | (32) Сум=2533 СумБО=0 СумПО=0 СумРН = 0 | ||
fisher 41 - 02.02.21 - 16:41 | (39) + Хотя нет, вроде та же...
Вот что бывает, если не писать чистые функции, а колотить коктейль из контекстов. Разбирайся потом с хитрыми сайдэффектами. | ||
Kigo_Kigo 42 - 02.02.21 - 16:46 | (40) ну и? | ||
Kigo_Kigo 43 - 02.02.21 - 16:47 | Где СумРН = 2533? | ||
Arbuz 44 - 02.02.21 - 16:47 | |||
Arbuz 45 - 02.02.21 - 16:49 | Хорошо в OpenConf'е - выделил слово, все совпадения подсвечиваются - очень удобно такие опечатки ловить! | ||
Asya666 46 - 02.02.21 - 16:51 | (43) а вот нету, и кто б сказал еще почему при вычислениях получается корректная сумма 2533, а вот при выводе в условия = 0??? | ||
fisher 47 - 02.02.21 - 16:57 | (45) Не поверишь, но в ванильном конфигураторе это тоже есть. | ||
fisher 48 - 02.02.21 - 16:58 | |||
fisher 49 - 02.02.21 - 17:03 | Если именно для выделенного слова - тогда "Выбранный идентификатор".
Но лично мне удобнее, когда просто курсор ставишь и он сразу все вхождения подсвечивает. Это даже в процессе набора сразу как визуальный контроль работает. | ||
Arbuz 50 - 02.02.21 - 17:30 | |||
Ёпрст 51 - 02.02.21 - 17:36 | (28) и че.. у тя вот это недоразумение:
Сум=0; СумБО=0; СумБН=0; СумРН=0; СумПО=0; - глобальные переменные модуля ?! Мот того, функция будет результат возвращать лучше, а не переменные править. Иначе, у тебя при каждом глРасчетСумм в твоём коде, они обнуляются и по-новой считаются.. На выходя нуль свой и имеешь. | ||
Исновая 52 - 02.02.21 - 18:33 | Меня мама учила нулить переменные | ||
Злопчинский 53 - 02.02.21 - 19:11 | (12) неверно x = "23"+1 - результат x будет "231" x = 1+"23" - результат x будет 24 x = 1+"235'177.88" - результат x будет 236 | ||
Bigbro 54 - 03.02.21 - 04:37 | (53) окей, строка, неприводимая к числу.
иначе левая часть похожая на число будет взята как число. 1 + "0,11" = 1 | ||
Asya666 55 - 03.02.21 - 09:13 | |||
Ёпрст 56 - 03.02.21 - 09:45 | (55) да уж.. | ||
Ёпрст 57 - 03.02.21 - 09:47 | При таком кодинге ошибки неизбежны. Переписывай, чтобы функция возвращала результат и результат вычисления функции используй в своих формулах для значений переменных.
А с глобальными переменными модуля, при отсутствии понимания области видимости имён ты далеко не уедешь. | ||
Злопчинский 58 - 03.02.21 - 11:11 | (54) угу, зпт в 77 это нечисловой знак |
|
Список тем форума |