Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 мая 2024, 20:48

Не могу понять...

Автор volody87, 30 дек 2011, 20:21

0 Пользователей и 1 гость просматривают эту тему.

volody87

Добрый день, уважаемые специалисты!

Мучаюсь с одной проблемой: уже все мозги на бекрень - перечитал всё, что можно.
Вот код, код простой:


   Перем СуммаОбщая1;
   Перем СуммаОбщая2;
   
   Процедура ВычислениеЗнач()
      СуммаОбщая1 = 50;
      СуммаОбщая2 = 50;
    КонецПроцедуры
   
   Процедура ВыводДляПользователя()
       Сообщить ("СуммаОбщая1 = " + СуммаОбщая1);
      Сообщить ("СуммаОбщая2 = " + СуммаОбщая2);
   КонецПроцедуры
   
   Процедура КнопкаВыполнитьНажатие()
      Перем СуммаОбщая1;
      //Перем СуммаОбщая2;
      ВычислениеЗнач();
      СуммаОбщая1 = 60;
      СуммаОбщая2 = 60;
      ВыводДляПользователя();
       Сообщить ("СуммаОбщая1 = " + СуммаОбщая1);
      Сообщить ("СуммаОбщая2 = " + СуммаОбщая2);
   КонецПроцедуры

При выполнении выдаёт:
СуммаОбщая1 = 50
СуммаОбщая2 = 60
СуммаОбщая1 = 60
СуммаОбщая2 = 60

Больше всего меня интересует, почему СуммаОбщая1 = 50? Ведь мы в процедуре "КнопкаВыполнитьНажатие" присваиваем ей значение 60 ! СуммаОбщая2 - понятно, переменная модуля. С ней всё ясно. СуммаОбщая1 - локальная, объявлена явно...

Помогите, пожалуйста!

sergejK74

В процедуре ВычислениеЗнач() присвоил значение переменной модуля 50, в Процедура ВыводДляПользователя() его получил.
Локальная переменная СуммаОбщая1 видна только внутри процедуры.
Кнопочка Спасибо - слева!

volody87

Спасибо!
Но всё же до меня не доходит: если Локальная переменная СуммаОбщая1 видна только внутри процедуры, то почему ей не присваивается значение 60, ведь функция ВыводДляПользователя() идёт после   
СуммаОбщая1 = 60;
СуммаОбщая2 = 60;

Получается, что переменной модуля присваивается значение 60, потому что она переменная модуля, а СуммаОбщая1 остаётся 50, но только для функции ВыводДляПользователя(), ведь в дальнейшем:

...
    ВыводДляПользователя();
       Сообщить ("СуммаОбщая1 = " + СуммаОбщая1);
      Сообщить ("СуммаОбщая2 = " + СуммаОбщая2);
   КонецПроцедуры

Ей всё же присваивается 60 !
Ответ:
50
60
60
60

Объясните, пожалуйста, почему для СуммаОбщая1 остаётся 50, но только для функции ВыводДляПользователя(), а в дальнейшем выводится 60

sergejK74

Процедура ВыводДляПользователя() не может обращаться к локальным переменным Процедуры КнопкаВыполнитьНажатие(). Они попросту не видны в ней. Единственная доступная в процедуре переменная с именем СуммаОбщая1 является переменной модуля. В других ЯП есть понятия ООП "пространство имен" и "инкапсуляция".
Убери в КнопкаВыполнитьНажатие определение переменной Перем СуммаОбщая1 и посмотри результат. Хотя видно что были эксперименты с Перем СуммаОбщая2;
Кнопочка Спасибо - слева!

volody87

Убери в КнопкаВыполнитьНажатие определение переменной Перем СуммаОбщая1 и посмотри результат.

---

Я делал это. Получается:
60
60
60
60

Если       СуммаОбщая1 и СуммаОбщая2 - локальные, объявлены неявно, то процедура ВычислениеЗнач(); - присваивает значение НЕ ИМ, а переменным модуля 50, а процедура ВыводДляПользователя(); - должна их вывести. Т.е. 50 и 50. Но она выводит 60 и 60.  !!!

Почему при объявлении переменной Перем СуммаОбщая1 в процедуре КнопкаВыполнитьНажатие() она становится равной 50  - я не могу понять, ведь по логике вещей, как раз в этом случае она должна быть 60 (она объявлена с помощью Перем в процедуре), а СуммаОбщая2 не объявлена явно в процедуре и она должна быть не видна, вместо неё должна быть переменная модуля, равная как раз 50 (после выполнения процедуры ВычислениеЗнач() внутри процедуры КнопкаВыполнитьНажатие(). Тогда ответ должен быть 60 и 50, а на самом деле 50 и 60 !!

Моя логика:

   Перем СуммаОбщая1; // Переменная модуля
   Перем СуммаОбщая2; // Переменная модуля
   
   Процедура ВычислениеЗнач()
      СуммаОбщая1 = 50; // работаем с переменной модуля - присваиваем её значение
      СуммаОбщая2 = 50; // работаем с переменной модуля - присваиваем её значение
    КонецПроцедуры
   
   Процедура ВыводДляПользователя()
       Сообщить ("СуммаОбщая1 = " + СуммаОбщая1);// работаем с переменной модуля - выводим на экран
      Сообщить ("СуммаОбщая2 = " + СуммаОбщая2);// работаем с переменной модуля - выводим на экран
   КонецПроцедуры
   
   Процедура КнопкаВыполнитьНажатие()
      Перем СуммаОбщая1; // локальная переменная, объявленная явно, значит она перекрывает переменную модуля внутри процедуры
      //Перем СуммаОбщая2;
      ВычислениеЗнач(); // происходит присваивание значение переменной СуммаОбщая1 (она выступает в качестве переменной процедуры) и СуммаОбщая2 (она выступает в качестве переменной МОДУЛЯ)
      СуммаОбщая1 = 60; // присваиваем новое значение переменной СуммаОбщая1, так как она объявлена явно в процедуре, то она должна принять новое значение
      СуммаОбщая2 = 60; // присваиваем новое значение переменной СуммаОбщая2, так как она объявлена НЕЯВНО в процедуре, то значение новое не принимает
      ВыводДляПользователя(); выводим переменные - результат должен получиться 60 и 50, а получается 50 и 60
       Сообщить ("СуммаОбщая1 = " + СуммаОбщая1);//выводим переменные - результат 60
      Сообщить ("СуммаОбщая2 = " + СуммаОбщая2);//выводим переменные - результат 60
   КонецПроцедуры

____

Я прошу помочь разобраться с этим. Я очень долго тужился своим мозгом в надежде разобраться сам.
Прошу ткнуть носом в моё заблуждение.

sergejK74

Цитировать

   Перем СуммаОбщая1; // Переменная модуля
   Перем СуммаОбщая2; // Переменная модуля
   
   Процедура ВычислениеЗнач()
      СуммаОбщая1 = 50; // работаем с переменной модуля - присваиваем её значение
      СуммаОбщая2 = 50; // работаем с переменной модуля - присваиваем её значение
    КонецПроцедуры
   
   Процедура ВыводДляПользователя()
       Сообщить ("СуммаОбщая1 = " + СуммаОбщая1);// работаем с переменной модуля - выводим на экран
      Сообщить ("СуммаОбщая2 = " + СуммаОбщая2);// работаем с переменной модуля - выводим на экран
   КонецПроцедуры
   
   Процедура КнопкаВыполнитьНажатие()
      Перем СуммаОбщая1; // локальная переменная, объявленная явно, значит она перекрывает переменную модуля внутри процедуры
      //Перем СуммаОбщая2;
Переменные Модуля СуммаОбщая1=0;СуммаОбщая2 = 0;
Локальная переменная СуммаОбщая1=0;
Цитировать
      ВычислениеЗнач(); // происходит присваивание значение переменной СуммаОбщая1 (она выступает в качестве переменной процедуры) и СуммаОбщая2 (она выступает в качестве переменной МОДУЛЯ)
В процедуре ВычислениеЗнач() доступны переменные модуля. Результат
Переменные Модуля СуммаОбщая1=50;СуммаОбщая2 = 50;
Локальная переменная СуммаОбщая1=0;
ЦитироватьСуммаОбщая1 = 60; // присваиваем новое значение переменной СуммаОбщая1, так как она объявлена явно в процедуре, то она должна принять новое значение
      СуммаОбщая2 = 60; // присваиваем новое значение переменной СуммаОбщая2, так как она объявлена НЕЯВНО в процедуре, то значение новое не принимает
Переменная модуля СуммаОбщая1 перекрывается локальной переменной. Переменная модуля СуммаОбщая2 доступна
результат
Переменные Модуля СуммаОбщая1=50;СуммаОбщая2 = 60;
Локальная переменная СуммаОбщая1=60;
ЦитироватьВыводДляПользователя(); выводим переменные - результат должен получиться 60 и 50, а получается 50 и 60
В процедуре ВыводДляПользователя() доступны только переменные модуля
Выводим доступные Переменные Модуля СуммаОбщая1=50;СуммаОбщая2 = 60;
ЦитироватьСообщить ("СуммаОбщая1 = " + СуммаОбщая1);//выводим переменные - результат 60
      Сообщить ("СуммаОбщая2 = " + СуммаОбщая2);//выводим переменные - результат 60
   КонецПроцедуры
Переменная модуля СуммаОбщая1 перекрывается локальной переменной. Переменная модуля СуммаОбщая2 ничем не перекрыта
Выводим Локальная переменная СуммаОбщая1=60;Переменные Модуля СуммаОбщая2 = 60;
Кнопочка Спасибо - слева!

volody87

О! Вот теперь понятно! Я всё понял! Большое спасибо!

Теги:
Рейтинг@Mail.ru

Поиск