Имя: Пароль:
1C
1С v8
Ошибка 8..3.5 при использовании Знач в объявлении функций
0 simol
 
11.12.14
12:22
Наткнулся и решил предупредить, что не работает Знач. Даже при его наличии фактический параметр изменяется.



&НаКлиенте
Процедура Проверка(Команда)
    
    Массив = Новый Массив;
    МАссив.Добавить("1");
    МАссив.Добавить("3");
    МАссив.Добавить("5");
    МАссив.Добавить("7");
    
    Сообщить(Массив.Количество()); //тут выведет 4
    
    Возвращенная = ЧтотоСделать(1, Массив);
    
    Сообщить(Массив.Количество()); //тут выведет 3
    
КонецПроцедуры

&НаКлиенте
Функция ЧтотоСделать(Переменная, Знач Массив)
    
    Массив.Удалить(0);
        
КонецФункции    
1 Fragster
 
гуру
11.12.14
12:26
все правильно
2 H A D G E H O G s
 
11.12.14
12:26
(1) ?
3 Fragster
 
гуру
11.12.14
12:26
указатель-то не меняется
4 H A D G E H O G s
 
11.12.14
12:26
Массив  - не глобальная переменная?
5 simol
 
11.12.14
12:27
(3)
СП:
Знач
     Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т.е. изменение значения формального параметра при выполнении функции никак не повлияет на фактический параметр, переданный при вызове функции.
6 simol
 
11.12.14
12:29
(4) Нет, это обработка написанная в пустой базе.
7 Fragster
 
гуру
11.12.14
12:30
(5) массив - указатель на объект. он не изменяется.
8 Maxus43
 
11.12.14
12:31
с переменной обычной проверь
9 Fragster
 
гуру
11.12.14
12:31
с примитивными типами все работает
10 simol
 
11.12.14
12:32
(7)Я в функцию передал не указатель, а значение, там должна была создаться новая переменная, которую я и менял. После окончания функции она уничтожится.

(4)
Даже так ошибка

&НаКлиенте
Процедура Проверка(Команда)
    
    Массив2 = Новый Массив;
    МАссив2.Добавить("1");
    МАссив2.Добавить("3");
    МАссив2.Добавить("5");
    МАссив2.Добавить("7");
    
    Сообщить(Массив2.Количество()); //тут выведет 4
    
    Возвращенная = ЧтотоСделать(1, Массив2);
    
    Сообщить(Массив2.Количество()); //тут выведет 3
    
КонецПроцедуры

&НаКлиенте
Функция ЧтотоСделать(Переменная, Знач Массив3)
    
    Массив3.Удалить(0);
        
КонецФункции
11 Fragster
 
гуру
11.12.14
12:32
(10) "массив" в твоем коде - это на самом деле указатель
12 Fragster
 
гуру
11.12.14
12:32
создался новый указатель
13 Fragster
 
гуру
11.12.14
12:32
он не изменялся, изменялось то, куда он указывался
14 hhhh
 
11.12.14
12:33
(10) то же самое на 8.0, 8.1, 8.2, 8.3.1, 8.3.2, 8.3.3, 8.3.4. Будьте осторожны при работе на этих платформах.
15 Maxus43
 
11.12.14
12:34
(13)(14) не понял, вот в типовых натыкано
Функция СформироватьТаблицуДанныхРазворотаСчетов(СтруктураПараметров, Знач ПравилаВыводаИтогов)

т.е. изменяя в этой функции ТЗ ПравилаВыводаИтогов - оно будет менятся в вызвавшей её?

разницу не уловил, объясните убогим
16 Поpyчик-4
 
11.12.14
12:34
(0) Ещё не было? В случае с массивами передача по значению не работает.
17 Maxus43
 
11.12.14
12:35
а с ТЗ?
18 simol
 
11.12.14
12:37
(16) А с чем, кроме примитивных работает?
19 hhhh
 
11.12.14
12:38
(18) ни с чем. и никогда не работало.
20 Fragster
 
гуру
11.12.14
12:38
Процедура КнопкаВыполнитьНажатие(Кнопка)
    ТЗ = Новый ТаблицаЗначений;
    Тз.Добавить();
    ТЗ.Добавить();
    Ст = ТЗ[0];
    Сообщить("" + Тз.Индекс(Ст));
    Пример(Тз,Ст);
    Сообщить("" + Тз.Индекс(Ст));
КонецПроцедуры



Процедура Пример(ТЗ, Знач Ст)
    Стр = Тз[1];
КонецПроцедуры
21 Maxus43
 
11.12.14
12:39
(20) результат то какой? я не телепат
(19)>(15) пЕсатели типовых не вкурсе?
22 Fragster
 
гуру
11.12.14
12:39
Процедура КнопкаВыполнитьНажатие(Кнопка)
    ТЗ = Новый ТаблицаЗначений;
    Тз.Добавить();
    ТЗ.Добавить();
    Ст = ТЗ[0];
    Сообщить("Снаружи " + Тз.Индекс(Ст));
    Пример(Тз,Ст);
    Сообщить("Снаружи " + Тз.Индекс(Ст));
КонецПроцедуры



Процедура Пример(ТЗ, Знач Ст)
    Ст = Тз[1];
    Сообщить("Внутри " + Тз.Индекс(Ст));
КонецПроцедуры
23 Fragster
 
гуру
11.12.14
12:40
(21) ожидаемо:

Снаружи 0
Внутри 1
Снаружи 0
24 Fragster
 
гуру
11.12.14
12:40
потому что все непримитивные типы - это объекты. А значит все переменные с этими типами - это указатели.
25 Maxus43
 
11.12.14
12:41
(24) пЕсатели типовых не вкурсе? вот я чего не понимаю, сам то не юзаю на колелкциях этого
26 Fragster
 
гуру
11.12.14
12:42
(25) в типовых там все ОК
27 H A D G E H O G s
 
11.12.14
12:42
(25) Это для серверных вызовов наверное.
28 Maxus43
 
11.12.14
12:43
(26) чего ОК? в (15) пример функции, там ТЗ передаётся, нахрена Знач перед ней, если не работает и не должно?
29 H A D G E H O G s
 
11.12.14
12:43
Я правда думал, что копия объекта создается, а вот оно как...

Сегодня я узнал новое :-)
30 Maxus43
 
11.12.14
12:44
(29) и не говори, как полон мир открытий новых...
31 Chai Nic
 
11.12.14
12:44
Да это и в семерке было.. Это не ошибка, а недочет в документации. При передаче объектов они всегда передаются по ссылке.
32 Крошка Ру
 
11.12.14
12:45
(28)Функция СформироватьТаблицуДанныхРазворотаСчетов(СтруктураПараметров, Знач ПравилаВыводаИтогов)

Это имеет смысл, если например в функции встречается код

ПравилаВыводаИтогов = Новый ТаблицаЗначений;



Тогда "снаружи" функции ПравилаВыводаИтогов не обнулятся.
33 Maxus43
 
11.12.14
12:45
(31) и тебе вопрос - пЕсатели типовых не вкурсе?)
34 H A D G E H O G s
 
11.12.14
12:45
(31) Даже для серверных вызовов с клиента?
1С говорит, что это не так. Да и это не может быть так.
35 Fragster
 
гуру
11.12.14
12:46
там для данных управляемой формы с (27) связанная какая-то шляпа была, не смотрел повторно
36 Fragster
 
гуру
11.12.14
12:46
*повторно = подробно.
37 Maxus43
 
11.12.14
12:47
(32) поглядел - нету там этого
(35) это код из УПП 1.2, абсолютно неуправляемый толстый зверь
38 Fragster
 
гуру
11.12.14
12:47
видимо, потому что два объекта - один на клиенте, один на сервере, и чтобы не выпендриваться с обеспечением консистентности - так вот выкрутились
39 Maxus43
 
11.12.14
12:49
ИМХО получается сами не зная от чего поставили, на всякий случай
40 vicof
 
11.12.14
12:50
41 Fragster
 
гуру
11.12.14
12:52
(40) и вроде все правильно, но так написано, что ничего не понятно :)
кому непонятно - см. (22)
42 Fragster
 
гуру
11.12.14
12:53
В процедуре:

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

  Парам = ... // не меняет состояние переменной Парам снаружи

  Парам.ххх = // меняет состояние объекта, на который указывает Парам

КонецПроцедуры
43 Поpyчик-4
 
11.12.14
13:13
(0)  Стаж: 9 лет 4 месяца 29 дней
Тема с передачей массивов, ТЗ, etc перетиралась Over_9000 раз.
44 Kyon8
 
11.12.14
13:29
Вроде бы ещё, если вызов клиент->сервер или наоборот, то "Знач" указывает, что параметр обратно не надо передавать и (42) уже неверно.
45 Kyon8
 
11.12.14
13:35
+(44) управляемый клиент и да, вызов сервер->клиент в 1с ещё не изобрели)
46 simol
 
11.12.14
13:37
(40)Спасибо
47 simol
 
11.12.14
13:39
(43)Заставил почитать свои старые темы - как будто не я их создавал.
48 batman69
 
11.12.14
13:48
(40) Ну, блин и пишут...
49 Garykom
 
гуру
11.12.14
14:00
А зачем вообще использовать "Знач" ?

имхо это как http://www.skalnyy.com/1s-kod-instrukciya-perejti-goto/
50 simol
 
11.12.14
14:02
(49) из функции нужно вернуть видоизмененный массив, не изменив входящий. Приходится руками делать копирование массива.
51 Garykom
 
гуру
11.12.14
14:02
(49)+ лично я в таких случаях (как в ссылке) использую выделение кода в функцию и "Возврат"
52 Garykom
 
гуру
11.12.14
14:02
(50) чем мешает одна строчка кода?
53 simol
 
11.12.14
14:29
(52) можно и умножение сделать складывая в цикле.
54 rozer76
 
11.12.14
15:05
(44) +1
55 hhhh
 
11.12.14
15:11
(53) но ведь нереально сделать такую штуку. Например у вас в массиве 10 элементов, все Таблицы значений. В каждой таблице значений по 10000 строк. Как должно по-вашему работать Знач в этом случае? Всё копировать?
56 simol
 
11.12.14
15:24
(55)Хотелось бы, я же программно это же и делаю за платформу.
57 Chai Nic
 
11.12.14
18:09
(56) Хотеть не вредно.. то есть вы хотите по сути сериализации агрегатного объекта при передаче с последующей десериализацией. Вопрос - как в этом случае быть с возможным зацикливанием? Встроенные функции сериализации в этом случае роняют платформу в дамп. Если же сделать сериализацию с интелектом, с проверкой на циклы - слишком дорого всё обойдется в смысле быстродействия..