Имя: Пароль:
1C
 
Забавно, чем это объясняется?
0 MSensey
 
08.10.08
10:40
Нука, что будет выведено на экран в процедуре2 ?

Процедура Процедура1(Знач Параметр1)
   
   Параметр1.Очистить();
   
КонецПроцедуры //

Процедура Процедура2()
   
   Переменная1 = Новый Массив;
   Переменная1.Добавить(1);
   Переменная1.Добавить(2);
   
   Процедура1(Переменная1);    
   
   Сообщить(Переменная1.Количество());
   
КонецПроцедуры
1 zbv
 
08.10.08
10:43
нуль
2 DeoxyS
 
08.10.08
10:45
(1) эт почему?
3 Adoff
 
08.10.08
10:45
(0) ничего удивительного не вижу,
а что по вашему должно быть?
4 DeoxyS
 
08.10.08
10:46
пля точно нуль
5 Adoff
 
08.10.08
10:46
Параметр1 - это ссылка на массив, она не изменяется
а сам массив естественно очищается
6 DeoxyS
 
08.10.08
10:47
(3) Знач
Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т.е. изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры. Если это ключевое слово не указано, то параметр процедуры передается по ссылке, то есть изменение внутри процедуры значения формального параметра приведет к изменению значения соответствующего фактического параметра.
7 Господин ПЖ
 
08.10.08
10:47
по идее должно быть 2. Т.к. передавалось byval
8 DeoxyS
 
08.10.08
10:47
(5) мы же передаем значение а не ссылку
9 DeoxyS
 
08.10.08
10:48
(7) во во
10 Krom
 
08.10.08
10:48
(0), ответ "2", параметр передается по значению а не по ссылке!
11 MSensey
 
08.10.08
10:48
(7) я тоже так думал, а вот получается не так. Вот думаю, толи я плохо учился, толи у 1С свои "понятия"
12 Adoff
 
08.10.08
10:48
+(5) на любом языке можете проверить (можно на С++), 0 получите
13 DeoxyS
 
08.10.08
10:49
(10) а ты проверь )))
14 Krom
 
08.10.08
10:49
(12), не получим
15 MSensey
 
08.10.08
10:49
(12) не гонии
16 DeoxyS
 
08.10.08
10:50
(12) тут вопрос возникает нах ЗНАЧ нужен
17 Adoff
 
08.10.08
10:50
(14) проверь
18 zbv
 
08.10.08
10:51
передал - массив, получил - массив, в чем проблема то...
19 Adoff
 
08.10.08
10:52
(18) конфигурасты, что с них взять?
20 Господин ПЖ
 
08.10.08
10:53
(18) передал то ты массив... А в Процедура1() работаешь с его копией
21 DeoxyS
 
08.10.08
10:53
(19) через один шоль посты читаешь???? "...т.е. изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры..."
22 Adoff
 
08.10.08
10:53
(20) Процедура1 работает с сылкой на массив
23 Krom
 
08.10.08
10:54
(17), тут и проверять нечего!
24 Adoff
 
08.10.08
10:54
(21) а параметр и не меняется
25 DeoxyS
 
08.10.08
10:55
(22)пля америку открыл ))))) тема и завелась из за этого
26 Господин ПЖ
 
08.10.08
10:57
(22) А как же "Знач" ? "Знач" = byVal
27 DeoxyS
 
08.10.08
10:57
(24) еслиб не менялся выдавал бы "2"
28 Adoff
 
08.10.08
10:58
(26) Знач означает, что сама ссылка не изменится, она и не меняется
29 Adoff
 
08.10.08
10:59
(27) дятел, ты вообще не понимаешь разницу между областью памяти и ссылкой на эту область?
30 DeoxyS
 
08.10.08
10:59
(26) а без Знач она менятется ?
31 DeoxyS
 
08.10.08
11:00
(29) ну так просвети раз башковитый такой
32 Adoff
 
08.10.08
11:01
(31) это в школе проходят на уроках информатики, вот туда и вали
33 Господин ПЖ
 
08.10.08
11:04
(28) странно все это.

Если заменить массив на числа:

Процедура Процедура1(Знач Параметр1)

   Параметр1 = 0;
   
КонецПроцедуры //


Процедура Процедура2()
   
   
   Переменная1 = 2;
   
   Процедура1(Переменная1);
   
   Сообщить("" + Переменная1);
   
КонецПроцедуры

будет "2"
34 MSensey
 
08.10.08
11:05
(32) Adoff разве ключевое слово рядом с параметром не указывает на то что надо передавать не по ссылке на по значению?
Да, 1С по умолчанию использует ссылки (указатели). Но я думал, что "Знач" указывает что надо передать сам объект.
35 DeoxyS
 
08.10.08
11:05
(32) Способ передачи параметров в подпрограмму
Существует несколько способов передачи параметров в подпрограмму.
Передача параметров по значению. Формальному параметру присваивается значение фактического параметра. В этом случае формальный параметр будет содержать копию значения, имеющегося в фактическом, и никакое воздействие, производимое внутри подпрограммы на формальные параметры, не отражается на параметрах фактических. Так, если в качестве фактического параметра будет использована переменная, и внутри подпрограммы значение соответствующего формального параметра будет изменено, то фактический параметр останется без изменений.
int func1(int x) { x=x+1; return x; }
Передача параметров по ссылке. В формальный параметр может быть помещён сам фактический параметр (обычно это реализуется путём помещения в формальный параметр ссылки на фактический). При этом любое изменение формального параметра в подпрограмме отразится на фактическом параметре — оба параметра во время вызова подпрограммы суть одно и то же. Параметры, передаваемые по ссылке, дают возможность не только передавать параметры внутрь подпрограммы, но и возвращать вычисленные значения в точку вызова. Для этого параметру внутри подпрограммы просто присваивается нужное значение, и после возврата из подпрограммы переменная, использованная в качестве фактического параметра, получает это значение.
void func2(int &x) { x=x+1; }
36 DeoxyS
 
08.10.08
11:06
(32) +1 просветись дитё
37 Krom
 
08.10.08
11:07
(35), вообще на баг похоже
38 Chin
 
08.10.08
11:08
Переменная1 содержит значение в виде ссылки, сама ссылка и не меняется, но меняется объект-массив. Adoff прав на 100%... Эта хрень со всеми ссылочными объектами срабатывает. Если бы в процедуре прописать, например, Переменная1 = Массив2, вот тогда Знач сработало и после выполнения процедуры значение переменной осталось бы равно переданному массиву...
39 Chin
 
08.10.08
11:09
(34) Здесь подменяются понятия. Подразумевается ссылка на переменную, а не на объект содержащийся в ней.
40 MSensey
 
08.10.08
11:09
(36) как я понял Adoff говорит о том, что передается указатель по значению, т.е. создается копия указателя. Но копия указывает на один и тотже объект (класс). Поэтому такая фича
41 DeoxyS
 
08.10.08
11:19
ок, тогда объясните мне пожалуйста след поведение:

Процедура Процедура1(Знач Параметр1)
       
   Параметр1 = 3;
   
КонецПроцедуры //


Процедура КнопкаВыполнитьНажатие(Кнопка)

   
   Переменная1 = Новый Массив;
   Переменная1.Добавить(1);
   Переменная1.Добавить(2);
   
   Процедура1(Переменная1);    
   
   Сообщить(Переменная1.Количество());
   
КонецПроцедуры
42 Chin
 
08.10.08
11:22
Ответ 2
И что не так?
43 DeoxyS
 
08.10.08
11:24
(42) не могу понять почему в (0) и (41) отрабатывает по разному...
44 Chin
 
08.10.08
11:30
в (0) применяют команду "очистить()" к ссылке на массив, соответственно изменяя объект-массив. В (41) ссылка на массив заменяется на число, при этом сам массив остается неизменным. Если не использовать Процедуру1, то тот же код можно написать так:

Процедура КнопкаВыполнитьНажатие(Кнопка)

   
   Переменная1 = Новый Массив;
   Переменная1.Добавить(1);
   Переменная1.Добавить(2);
   
   //Процедура1(Переменная1);    
   Параметр1 = Переменная1;
   Параметр1 = 3; //естественно массив останется невридимым
       
   Сообщить(Переменная1.Количество());
   
КонецПроцедуры
45 DeoxyS
 
08.10.08
11:32
ПППЛЛЯЯЯЯ сылка гришь

Процедура Процедура1(Знач Параметр1)
       
   Параметр1 = Справочники.Номенклатура.НайтиПоКоду("ЦБД00000099") ;
   
КонецПроцедуры //


Процедура КнопкаВыполнитьНажатие(Кнопка)

   
   Переменная1 = Справочники.Номенклатура.НайтиПоКоду("ЦБД00000098");
   //Переменная1.Добавить(1);
   //Переменная1.Добавить(2);
   
   Процедура1(Переменная1);    
   
   Сообщить(Переменная1.Код);
   
КонецПроцедуры
46 Krom
 
08.10.08
11:34
(45), так уж ответ привел бы
47 DeoxyS
 
08.10.08
11:34
(46) ЦБД00000098
48 DeoxyS
 
08.10.08
11:35
(44) сам себе противоречишь уже )))
49 MSensey
 
08.10.08
11:37
(45) а ты что под ссылкой подразумеваешь?
50 Serg_1960
 
08.10.08
11:37
(0) Совет: <не могу понять...> - тогда остановись и подумай! Поставь на этом точку... останова и в Монитор "думать" :)
51 DeoxyS
 
08.10.08
11:38
я так понял 1С не отрабатывает только Коллекции типов, аля Масси список Тз и тд и тп, со всеми остальными типами работает как положено.
52 Krom
 
08.10.08
11:38
(48), не я понял так, что если в самом объекте произвести изменение, то оно останется в базе! Типа того...

Процедура Процедура1(Знач Параметр1)

   Параметр1.ПолучитьОбъект().Наименование = "123";    
   Параметр1 = Справочники.Номенклатура.НайтиПоКоду("ЦБД00000099") ;
   
КонецПроцедуры //


Процедура КнопкаВыполнитьНажатие(Кнопка)

   
   Переменная1 = Справочники.Номенклатура.НайтиПоКоду("ЦБД00000098");
   //Переменная1.Добавить(1);
   //Переменная1.Добавить(2);
   
   Процедура1(Переменная1);    
   
   Сообщить(Переменная1.Код);
   
КонецПроцедуры
53 MSensey
 
08.10.08
11:38
(50) не учи отцаибаста
54 Krom
 
08.10.08
11:39
(52), то у элемента Справочники.Номенклатура.НайтиПоКоду("ЦБД00000098") изменится наименование
55 Krom
 
08.10.08
11:39
(54), в то же время ссылка не изменится
56 MSensey
 
08.10.08
11:42
(55) какая ссылка?
57 Krom
 
08.10.08
11:46
(56), в процедуре мы меняем значение Параметр1, но на саму ссылку Переменная1 это не влияет! А вот если мы в объекте, полученному по ссылке Переменная1 что нибудь поменяем, то это останется!
58 Adoff
 
08.10.08
11:47
пля, как всё запущено :(
59 Krom
 
08.10.08
11:49
(58), что ругаешься? люди разобраться хотят!
60 ptiz
 
08.10.08
11:49
Уважаемые, специально для вас 1С на ИТС написала статью "Передача параметров по ссылке и по значению при вызове процедур и функций".
Пользуйтесь на здоровье.

p.s. как же сложно было сдержаться от других слов...
61 Господин ПЖ
 
08.10.08
11:49
однако как вам проперло...
62 MSensey
 
08.10.08
11:50
(58) неговори, совсем мозги закостенели от 1С
63 Adoff
 
08.10.08
11:50
загляните наконец в теорию ООП

нужно увидеть разницу между простыми типами, и указателями
64 HEKPOH
 
08.10.08
11:51
все прочитал - все перепробовал :)
(60) теперь иду сюда
Если останутся неясности, буду ругаццо на коллекции :)
65 MSensey
 
08.10.08
11:51
(60) лучше бы нормально в СП написали
66 Adoff
 
08.10.08
11:54
(65) в СП всё правильно написано
67 Chin
 
08.10.08
11:59
(66) Там иногда так мудрено написано, что читать не хочется :)))
68 MSensey
 
08.10.08
11:59
(66) а и не говорю, что не правильно. Я говорю нормально.
69 Torquader
 
08.10.08
12:01
Если взять, например, язык JavaScript, то в нём нет управления передачей параметров. Все обычные переменные передаются по значению, а объекты передаются по ссылке (формально, объект - это адрес в памяти, где находятся данные самого объекта).
При передаче копии объекта надо специально его копировать оператором new.

Поэтому, в 1С стоит запомнить одно - все объектные типы представляют собой указатель.
И чтобы вы с ним не делали (по значению или по ссылке) он всё равно окажется указателям.
70 MSensey
 
08.10.08
12:03
(69) точнее в 1С операции выполняются с указателями
71 bahmet
 
08.10.08
12:03
Вроде многие мистяне в прошлом Сишники и Паскальники...странно что на такой фигне пробуксовали...
72 Serg_1960
 
08.10.08
12:05
Открыватели Америки секрет Полишинеля узнали
73 HEKPOH
 
08.10.08
12:06
(60) респект и уважуха! послал куда надо :)