Имя: Пароль:
1C
1C 7.7
v7: Переменной назначается другое значение, не то, которое должно
0 Asya666
 
02.02.21
10:26
Доброго дня!
Есть в одной процедуре вот такая строчка:
глВзаиморасчеты = Сум+СумБО+СумПО-СумРН;

В отладчике получаю странный ответ:
Сум = 2533
СумБО = 0
СумБН = 0
СумРН = 2533
СумПО = 0
глВзаиморасчеты = 2533
Сум-СумРН+СумБО+СумПО = 0

Как такое возможно? Я же явно присваиваю значение, оно ведь даже правильно считается, но записывается не то, из-за этого потом летят все условия.
Каждая цифра кроме глВзаиморасчеты посчитались полностью правильно, считаются отдельной процедурой.
На что обратить внимание? Где ловить ошибку? Пошагово уже все это прошла, но не вижу где система спотыкается.
1 acht
 
02.02.21
10:29
У тебя формулы разные
2 acht
 
02.02.21
10:30
2533 - 2533 + 0 + 0 = 0
3 Asya666
 
02.02.21
10:33
(1) Это уже наслоения в отладчике, но от перемены мест слагаемых результат не изменился, глВзаиморасчеты <> 0, почему то.
4 fisher
 
02.02.21
10:40
(3) "считаются отдельной процедурой"
Вероятно, одна из цифр не точно 2533, а с "хвостиком" в стопяцотом знаке. А отладчик округляет при отображении.
5 Asya666
 
02.02.21
11:03
(4) И получается с точки зрения программы 2533 = 2533+0+0-2533? Разве может округление так повлиять?
6 Bigbro
 
02.02.21
11:05
может если "-2533" - строка
7 mikecool
 
02.02.21
11:06
(0) программа делает только то, что ты ей указала.
8 Bigbro
 
02.02.21
11:08
где то в вычислениях строку с числом складываете скорее всего.
задавайте явно тип
результат = "" + сумма для строки
результат = 0 + сумма для числа.
9 Kigo_Kigo
 
02.02.21
11:22
а если так
глВзаиморасчеты  = 0;
глВзаиморасчеты = Число(Сум)+Число(СумБО)+Число(СумПО)-Число(СумРН);
10 mikecool
 
02.02.21
11:23
(8) строка с числом не сложится, даже в 77
11 Kigo_Kigo
 
02.02.21
11:23
Буратино дали три яблока. Два он съел. Сколько яблок осталось у Буратино? Думаете одно? Ничего подобного. Никто не знает сколько у него уже было яблок до этого. Мораль — всегда обнуляйте переменные!
12 Bigbro
 
02.02.21
11:24
(10) да, ладно? вроде складывалось) строка идет за ноль.
13 fisher
 
02.02.21
11:24
(5) А! У тебя 2533 получается? Я ориентировался на твое высказывание "глВзаиморасчеты <> 0, почему то"
14 Kigo_Kigo
 
02.02.21
11:25
(10) Возможно что глВзаиморасчеты  изначально строка, тогда можем получить подобный результат, и кстати у 7.7 реально иногда проскакивают мат. действия разных типов, сам лично сталкивался
15 El_Duke
 
гуру
02.02.21
11:43
(11)  - Изя, у тебя было 6 яблок, половину ты отдал Сёме, сколько у тебя осталось ?
      - Пять с половиной !
16 Asya666
 
02.02.21
14:19
(13) да, получается 2533, и оно не равно 0))
(8) (10) (14) буду проверять какие типы у меня складываются)
17 Asya666
 
02.02.21
15:38
Отладчик огорчает - получается все полученные значения с типом число...(((
ТипЗначения(Сум) = 1
ТипЗначения(СумБО) = 1
ТипЗначения(СумПО) = 1
ТипЗначения(СумРН) = 1
ТипЗначения(глВзаиморасчеты) = 1

Обнулила как и предлагалось глВзаиморасчеты, но тоже безрезультатно. В чем еще может быть проблема?
18 Kigo_Kigo
 
02.02.21
15:40
(17) из (9) тоже выдает 2533?
19 Asya666
 
02.02.21
15:40
Вот прям чувствую что проблема в какой-нибудь опечатке, мелочи, чем-то что мешает, и не заметно по закону подлости))
20 Asya666
 
02.02.21
15:41
(18) ага
21 Масянька
 
02.02.21
15:43
(20) Разложите свое число в строку и посмотрите знаки после запятой.
22 Масянька
 
02.02.21
15:44
+ (21) Причем, не только 2533, а и 0 (они же тоже получаются вычислением).
23 Kigo_Kigo
 
02.02.21
15:44
(20) тогда давай весь код, где это происходит, что у ж там
Кстати

а вот так что выдаст
глВзаиморасчеты1  = 0;
глВзаиморасчеты1 = Число(Сум)+Число(СумБО)+Число(СумПО)-Число(СумРН);
Сообщить(глВзаиморасчеты1);
что выдаст?
24 ChMikle
 
02.02.21
15:45
Посмотрите Значение Переменной глВзаиморасчеты до начала выполнения глВзаиморасчеты = Сум+СумБО+СумПО-СумРН;
потом отдельно Сум+СумБО+СумПО-СумРН в отладчике и глВзаиморасчеты (м.б.буква в переменной английская) поэтому и результат не меняется
25 Kigo_Kigo
 
02.02.21
15:46
есть подозрение что глВзаиморасчеты это глобальная переменная, которая привязана к глобальной функции вычесления глВзаиморасчеты, и после обсчетов ТС-а, срабатывает и сбрасывает ее
26 Жан Пердежон
 
02.02.21
15:49
скриншот бы лучше показал с кодом в отладчике и таблом
27 Kigo_Kigo
 
02.02.21
15:51
Сча посмотрел в ТиС-е
//******************************************************************************    
// глВзаиморасчеты(Фирма,Договор,Роль)
//
// Параметры:          
//    Фирма - фирма, в рамках которой происходит просмотр
//  Договор - договор контрагента
//    Роль - строка "Поставщик" или "Покупатель"
//
// Возвращаемое значение:
//    Нет
//
// Описание:
//    Формирует отчет по взаиморасчетам с выбранным контрагентом по выбранному
//  договору с выбранной фирмой.
//
Процедура глВзаиморасчеты(Фирма,Договор,Роль) Экспорт
28 Asya666
 
02.02.21
16:04
Процедура глРасчетСумм(Конт) экспорт  //для расчета суммы итога взаиморасчета
    Сум=0;
    СумБО=0;
    СумБН=0;
    СумРН=0;
    СумПО=0;
    КореньДок=глНайтиКорень(Конт);    // находим корень расчитываемого документа
    Док = Конт.ТекущийДокумент();     //записываем в переменную текущий документ
    Если Док=КореньДок Тогда   //проверяем не одинаковы ли они, если да, то считаем сумму по нему, иначе ничего, идем дальше
        ДокВид=Док.Вид();
        Если ДокВид="Расход_Общий" Тогда //там куча проверок по разным типам документов, но в моем случае расчет касается только
            Если Док.Проведен()=1 Тогда  //Расход_Общий
                Если Док.ТолькоРезерв=0 Тогда
                    СумРН=СумРН+Док.Итог("Сумма");
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    Вв=СоздатьОбъект("Документ");
//---------------------------------------
    Если Вв.ВыбратьПодчиненныеДокументы(,,Док)=1 тогда //  смотрим подчиненные документы у текущего
    Пока Вв.ПолучитьДокумент()=1 Цикл //если есть, то проверяем какого вида и считаем сумму по ним и складываем все
        ВвВид=Вв.Вид();
        Если ВвВид="ДругойДок" Тогда
            //...
            глРасчетСумм(Вв);
        ИначеЕсли ВвВид="ДругойДок" Тогда
            //...
            глРасчетСумм(Вв);          
        ИначеЕсли ВвВид="Расход_Общий" Тогда
            Если Вв.Проведен()=1 Тогда
                Если Вв.ТолькоРезерв=0 Тогда
                    СумРН=СумРН+Вв.Итог("Сумма");
                КонецЕсли;
            КонецЕсли;
            глРасчетСумм(Вв);
иначе
    возврат;
КонецЕсли;
КонецПроцедуры      

и далее используется в другой процедуре результат этих вычислений:

    Если Конт.Вид()="Расход_Общий" тогда
            глРасчетСумм(Конт);  
            глВзаиморасчеты = 0;
            глВзаиморасчеты = Сум+СумБО+СумПО-СумРН;
            Если (глВзаиморасчеты = 0) тогда  //проверка на наличие долгов по взаиморасчетам
                Ответ = СокрЛП(Вопрос("Взаиморасчеты равны нулю, создать новый документ?", "Да+Нет"));
                Если Ответ="Да" Тогда    
                          //исполняется дальше
29 Asya666
 
02.02.21
16:17
(23) глВзаиморасчеты1 = 2533
30 Asya666
 
02.02.21
16:24
Очередной эксперимент дал интересный результат:
    глВзаиморасчеты1 = Число(СумРН);

СумРН = 2533
глВзаиморасчеты1 = 0

еще бы понять почему...
31 Arbuz
 
02.02.21
16:26
Опечатка в СумРН, может С английская
32 Kigo_Kigo
 
02.02.21
16:26
после
глВзаиморасчеты = 0;
Вставь
Сообщить("Сум=" + Строка(Сум)+ " " + "СумБО=" + Строка(СумБО) + " " + "СумПО=" + Строка(СумПО) + " " + "СумРН = " + Строка(СумРН));
Что сообщить?
33 Kigo_Kigo
 
02.02.21
16:27
(31) тогда было бы переменная не обнаружена СумРН
34 Arbuz
 
02.02.21
16:27
ТипЗначенияСтр(СумРН) что сообщает?
35 Arbuz
 
02.02.21
16:28
(33) не обязательно, если там вперемешку, то может где-то и объявляется
36 Kigo_Kigo
 
02.02.21
16:33
(32) * что сообЩАЕТ?
37 Asya666
 
02.02.21
16:36
(34) ТипЗначенияСтр(СумРН)
38 Asya666
 
02.02.21
16:36
(34) ТипЗначенияСтр(СумРН)  = "Число"
39 fisher
 
02.02.21
16:37
(31) Бинго!
40 Asya666
 
02.02.21
16:37
(32) Сум=2533 СумБО=0 СумПО=0 СумРН = 0
41 fisher
 
02.02.21
16:41
(39) + Хотя нет, вроде та же...
Вот что бывает, если не писать чистые функции, а колотить коктейль из контекстов. Разбирайся потом с хитрыми сайдэффектами.
42 Kigo_Kigo
 
02.02.21
16:46
(40) ну и?
43 Kigo_Kigo
 
02.02.21
16:47
Где СумРН  = 2533?
44 Arbuz
 
02.02.21
16:47
(40) с какого "СумРН = 0" ?
(39) 100% бинго!
45 Arbuz
 
02.02.21
16:49
Хорошо в OpenConf'е - выделил слово, все совпадения подсвечиваются - очень удобно такие опечатки ловить!
46 Asya666
 
02.02.21
16:51
(43) а вот нету, и кто б сказал еще почему при вычислениях получается корректная сумма 2533, а вот при выводе в условия = 0???
47 fisher
 
02.02.21
16:57
(45) Не поверишь, но в ванильном конфигураторе это тоже есть.
48 fisher
 
02.02.21
16:58
(45) Параметры - Модули - Редактирование - Текущий идентификатор.
Цвет фона - по вкусу.
49 fisher
 
02.02.21
17:03
Если именно для выделенного слова - тогда "Выбранный идентификатор".
Но лично мне удобнее, когда просто курсор ставишь и он сразу все вхождения подсвечивает. Это даже в процессе набора сразу как визуальный контроль работает.
50 Arbuz
 
02.02.21
17:30
(47)(48) в клюшках? Не верю!©
Так-то я в холиваре Статическая_типизация+Предварительное_объявление/Динамическая_типизация+Неявное_объявление болею за первую команду :))
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
54 Bigbro
 
03.02.21
04:37
(53) окей, строка, неприводимая к числу.
иначе левая часть похожая на число будет взята как число.
1 + "0,11" = 1
55 Asya666
 
03.02.21
09:13
(48) вот кстати тоже в 1с77 не нашла, в 1с8 такое и правда есть.
(51) кстати переместила это обнуление из процедуры расчета в ту, в которой вызывается, поставила перед ней и все путем стало))
56 Ёпрст
 
03.02.21
09:45
(55) да уж..
57 Ёпрст
 
03.02.21
09:47
При таком кодинге ошибки неизбежны. Переписывай, чтобы функция возвращала результат и результат вычисления функции используй в своих формулах для значений переменных.
А с глобальными переменными модуля, при отсутствии понимания области видимости имён ты далеко не уедешь.
58 Злопчинский
 
03.02.21
11:11
(54) угу, зпт в 77 это нечисловой знак
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.