Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Переменной назначается другое значение, не то, которое должно

v7: Переменной назначается другое значение, не то, которое должно
Я
   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
(13) да, получается 2533, и оно не равно 0))
(8) (10) (14) буду проверять какие типы у меня складываются)
   Asya666
 
17 - 02.02.21 - 15:38
Отладчик огорчает - получается все полученные значения с типом число...(((
ТипЗначения(Сум) = 1
ТипЗначения(СумБО) = 1
ТипЗначения(СумПО) = 1
ТипЗначения(СумРН) = 1
ТипЗначения(глВзаиморасчеты) = 1

Обнулила как и предлагалось глВзаиморасчеты, но тоже безрезультатно. В чем еще может быть проблема?
   Kigo_Kigo
 
18 - 02.02.21 - 15:40
(17) из (9) тоже выдает 2533?
   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
(40) с какого "СумРН = 0" ?
(39) 100% бинго!
   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
(45) Параметры - Модули - Редактирование - Текущий идентификатор.
Цвет фона - по вкусу.
   fisher
 
49 - 02.02.21 - 17:03
Если именно для выделенного слова - тогда "Выбранный идентификатор".
Но лично мне удобнее, когда просто курсор ставишь и он сразу все вхождения подсвечивает. Это даже в процессе набора сразу как визуальный контроль работает.
   Arbuz
 
50 - 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
   Bigbro
 
54 - 03.02.21 - 04:37
(53) окей, строка, неприводимая к числу.
иначе левая часть похожая на число будет взята как число.
1 + "0,11" = 1
   Asya666
 
55 - 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 это нечисловой знак


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.