Имя: Пароль:
1C
 
v8: Что дает объявление переменных внутри функции, процедуры
0 php5
 
24.01.10
16:54
Что дает объявление переменных внутри функции, процедуры:

Функция Сумма()

Перем Сумма, А1, Б1;

// код процедуры...

КонецФункции()

В некоторых типовым решениях объявляют переменнные внутри функции, а в некоторых нет. В чем разница?

ИМХО объявление переменных внутри функций и процедур бессмысленно (из справки -> "...Не имеет смысла при объявлении переменных отдельных процедур или функций"), но тем не менее такие процедуры и функции встречаются...
1 Волшебник
 
24.01.10
16:55
Хороший стиль программирования
2 ERWINS
 
24.01.10
16:57
если бы еще можно было бы тип сразу указать......
3 dk
 
24.01.10
16:58
(0) чтобы точно не нарваться на объявленную глобальную переменную
4 ДенисЧ
 
24.01.10
16:58
Если составной тип, то сразу очистка памяти при выходе из процедуры. Кроме того, инкапсуляция переменных внутри одной процедуры. Полезно.
5 dk
 
24.01.10
16:58
(0) учишься на кого? )
6 php5
 
24.01.10
17:00
(5) я уже работаю...
Сам никогда не объявлял, не видел смысла...теперь буду стараться...
7 sidalexsandr
 
24.01.10
17:12
php5 если хочеш просветиться, то почитай на тему: область видимости и время действия.

P.S.  Если кратко переменные бывают локальные, глобальные.
Нужно для следующего

1) В глобальном модуле объявленна переменная например: Перем а
2) Есть две функции Функция ФункияОдин и ФункцияДва

Дальше самое интересное: Ты в функцииОдин пишеш а=10;  

Вот здесь варианты: Если переменная а описанна в ФункцииОдин то при обращении к ней в ФункцииДва ты получиш значение =10.
Если а не описанна в ФункцииОдин то при обращении в ФункцииДва ты получиш не известное значение переменной а


Подробней читай: область видимости и время действия
8 Jolly Roger
 
24.01.10
17:30
(0) >из справки -> "...Не имеет смысла при объявлении переменных отдельных процедур или функций")

бугага! смысл появляется после того как добавишь общий неглобальный модуль, например, "Номенклатура" и вся конфига становится раком...

зы: доступно и всерьез...
9 Aleksey_3
 
24.01.10
17:51
(9) А не наоборот. Мне всегда казалась, что если "а" НЕ описана в функцииОдин, то изменяя ее в любой из функции, мы меняем глобальную переменную, т.е. присваивая ей в ФункцииОдин значение 10, в ФункцииДва тоже будет "а" равняться 10.
10 los_hooliganos
 
24.01.10
18:15
Лучше нормальные имена присваивать, чем инициализацию делать.
11 Snovy
 
24.01.10
18:23
Не туда копаете. На самом деле все проще. В типовых внутри функций переменные объявляются в основном тогда (точнее только тогда), когда нужно эту пустую неопределенную переменную перегнать в другую процедуру, вызываемую из этой функции и та процедура чем либо полезным эту переменную заполнит. Другие случаи мне не попадались.
12 dk
 
24.01.10
18:27
(11) а теперь внимательно перечитай (0)
13 failed state
 
24.01.10
18:31
(0)

1) защита от глобальной переменной
2) если в эту переменную нужно вернуть значение в вызове

Перем Сум;
Функ(1,1, Сум)
14 failed state
 
24.01.10
18:32
(2) - где?
15 Snovy
 
24.01.10
18:33
(12) Даю 100% гарантию, что там, где "// код процедуры..." далее будет следовать вызов процедуры   ПосчитатьСумму(Сумма,А1,Б1);
16 dk
 
24.01.10
18:35
(15) я для таких случаев просто пишу
мояперем = "";
Функ(МояПерем);
17 Sakura
 
24.01.10
18:40
(2) да... давняя мечта - нормальная типизация переменных и отслеживание новых имен :)
(6) а в ЛК стоит "студент"... )
а вообще, в (7) сказано главное - область видимости и время действия. Нужна тебе эта переменная за пределами функции/модуля или нет.
18 МихаилМ
 
24.01.10
18:44
обявление переменных - защита от ошибок.

простой пример
Если не объявлять переменные с частовстречаемым названием (например: "Котнтрагент","товар"... ).

то могут быть объявлены  до и или после переменные с более глобальной
областью видимости:
глобальные, переменные модулей, имена свойств объектов, в контексте
которых обращение не требует разименования.

соответственно в локальных методах будут использоваться более глобальные объекты.

Как правило это трудно находимые ошибки (плавающие)

Учитывая, что 1с не поддерживает типизацию, переменные будут получать значения без сообщений об ошибках.

один раз икал ошибку 3 дня из-за не обявления переменных.
19 Snovy
 
24.01.10
18:45
(16) В (0) был вопрос "почему в типовых...". Я тоже сначала задумался над этим, а потом заметил эту одну единственную особенность, которая сказана в (13) под номером 2), в (15), других случаев объявления переменных в типовых я не встречал
(17),(18) - все верно, но это теория, и в типовых она не встречается...
20 Sakura
 
24.01.10
18:49
(19) ну да, вызов из процедуры функции с переменными, объявленными внутри процедуры, в свою очередь вызывающей еще функцию с теми же переменными...
21 МихаилМ
 
24.01.10
18:51
(19)
типовые - не плохой пример для подрожания.
они разрабатывались с нарушением большинства правил разработки ПО.
22 dk
 
24.01.10
18:55
(21) чего такое сказал? )))
23 Jolly Roger
 
24.01.10
19:53
(22) видимо, имел ввиду "хороший пример плохого стиля"... :-)
24 Михаил Козлов
 
24.01.10
20:37
Иногда требуется для возвращаемых параметров процедур. Можно неявно присвоением.
25 МихаилМ
 
24.01.10
20:58
в (21) очепятка.
хотел написать "плохой".
26 Torquader
 
24.01.10
21:00
Чтобы избежать конфликтов областей видимости советуют использовать префиксы имён переменных, чтобы гТовар - была глобальная, мТовар - в модуле, а лТовар - локальная, тогда никакого объявления переменных не потребуется.

(16) Разница в том, что код МояПерем="" исполняет присвоение, то есть занимает какое-то время, а объявление переменной в начале функции занимает время только в момент компиляции модуля.
27 dk
 
24.01.10
21:13
(26) думаешь открыл Америку? ))