Имя: Пароль:
1C
1С v8
Передача переменных по ссылке с клиента на сервер
,
0 conscious
 
17.11.21
15:59
Просто стало интересно...


&НаКлиенте
Процедура НажатиеКнопки(Элемент)
    а = 1;
    Инкремент(а);
    Сообщить(а);//будет выведено 2
КонецПроцедуры

&НаСервере
Процедура Инкремент(Парам)
    Парам = Парам + 1;
КонецПроцедуры


Вот это все не вызвало бы вопросов, если бы выполнялось на одной машине, с одной кучей, но тут передача с клиента на сервер и обратно, и, как бы, эмуляция передачи переменной по ссылке (по указателю).
Подскажите, где-нибудь в документации написано, что если не указано ЗНАЧ, то переменные всегда передаются по ссылке, даже с клиента на сервер?

Проблемы в этом никакой нет, просто интересно, как это реализовано.
1 ДенисЧ
 
17.11.21
16:03
Вообще-то все переменные передаются по ссылке, если не указано иначе...
2 Ненавижу 1С
 
гуру
17.11.21
16:07
3 Ненавижу 1С
 
гуру
17.11.21
16:08
со ЗНАЧ тоже интересно:

&НаКлиенте
Процедура НажатиеКнопки(Элемент)
    
    М = Новый Массив;
    ДобавитьВМассивСервер(М);
    Сообщить("Количество = "+М.Количество());
    ДобавитьВМассивКлиент(М);
    Сообщить("Количество = "+М.Количество());

КонецПроцедуры

&НаСервере
Процедура ДобавитьВМассивСервер(Знач Парам)
    Парам.Добавить();
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьВМассивКлиент(Знач Парам)
    Парам.Добавить();
КонецПроцедуры
4 Малыш Джон
 
17.11.21
16:09
(3) а что интересного? что в массив элемент таки добавляется?
5 Ненавижу 1С
 
гуру
17.11.21
16:13
(4) но только в одном из двух случаев
6 conscious
 
17.11.21
16:20
(2) Спасибо )

(3) А это нечто загадочное... Как из копии массива значение попадает в исходный массив?
7 Ненавижу 1С
 
гуру
17.11.21
16:21
(6) никак, в параметр передается ссылка с в случае одного клиента или сервера, в случае передачи - копируется объект через сериализацию
8 conscious
 
17.11.21
16:25
(7) "Знач" тут теряет смысл...
9 Ненавижу 1С
 
гуру
17.11.21
17:02
(2) прошу прощения, все-таки по ссылке, вот пример:

&НаКлиенте
Процедура Команда1(Команда)
    А = 42;    
    Тест(А,А);
    Сообщить(А);
КонецПроцедуры

&НаКлиенте
Процедура Тест(А,Б)

    А = А+1;
//изменяются обе переменные
    Сообщить(А);
    Сообщить(Б);
    Б = Б+5;
    Сообщить(А);
    Сообщить(Б);

КонецПроцедуры
10 ДедМорроз
 
17.11.21
17:16
Вы просто поймите,что знач определяет копию переменной,а на объекта,который в ней живет.
А=объект
Б=А
Вот это дает результат,аналогичный использованию ЗНАЧ.
У вас в переменной Б тот же объект,но переменная другая.

Когда мы идем на сервер,то объект сериализуется,то есть превращается в строку,а перед вызовом собирается. А ЗНАЧ определяет,будет ли обратная сериализация.

Для понимания фрагменты:
Наклиенте
Процедура Клиент()
М=Новый Массив()
М Добавить(1);
Сервер1(М,М);
Сервер2(М,М)
КонецПроцедуры

НаСервере
Процедура Сервер1(А,Б)
А.Добавить(2);
КонецПроцедуры

НаСервере
Процедура Сервер2(А,Б)
Б.Добавить(3);
КонецПроцедуры

Или такой фрагмент

НаКлиенте
Процедура Клиент()
С=Новый Структура;
С.Всьавить("А",1);
М=Новый Массив;
М.Добавить(С);
М.Добавить(С);
Сервер1(М);
// Что у нас в М
КонецПроцедуры

Насервере
Процедура Сервер1(М)
М[0].Вставить("А",10);
КонецПроцедуры
11 polosov
 
17.11.21
17:29
12 polosov
 
17.11.21
17:30
13 conscious
 
17.11.21
17:46
(12) В принципе, эта ссылка всё объясняет )
14 pechkin
 
17.11.21
17:46
просто с сервера приходит значение переменной
15 fisher
 
17.11.21
17:48
(12) "Если в качестве формальных параметров указано значение одной и той же переменной, то после возврата управления с сервера значение этой переменной будет установлено в значение самого правого формального параметра (без модификатора Знач), который изменялся в вызываемой функции"
Прикольно.
В общем, кто познал дзен, тот просто использует чистые функции и с недоумением поправляет пенсне, выслушивая чужие проблемы.
16 ДедМорроз
 
17.11.21
21:06
Вторая часть фрагмента еще интереснее - там одна структура превращается в две.