Имя: Пароль:
1C
1С v8
Объект по значению.
0 Lama12
 
14.02.19
10:43
Есть две процедуры в модуле формы, хотя не важно где...


&НаСервереБезКонтекста
Процедура ПроверскаСтруктурыНаСервере()
    
    
    Док = Документы.РТС_ЗаявкаНаВходнойКонтроль.СоздатьДокумент();
    Док1 = ОбъектПоЗначению(Док);
    
    Б=Док=Док1;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ОбъектПоЗначению(Знач Док)

    Возврат Док;

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



В конце первой процедуры сравнивая Док и Док1 получаем Истину. Ну ок.  Если после присвоения переменной Док1 значения функции ОбъектПоЗначению, у переменной Док поменять какой-то реквизит, то онже поменяется и у Док1.

Как вообще передача по значению должна работать для сложных типов? В документации не нашел. На ИТС, тоже. Может не так ищу...
1 Мимохожий Однако
 
14.02.19
10:44
Любопытная конструкция
Б=Док=Док1;
2 Lama12
 
14.02.19
10:53
(1) Ну для читаемости обычно пишу так Б = (Док=Док1). Здесь отладочный пример, с форматированием не заморачиваюсь.
3 Василий Алибабаевич
 
14.02.19
11:00
(0) Для объектных данных в переменной хранится ссылка на объект. После Док1 = ОбъектПоЗначению(Док);
В Док и Док1 лежит ссылка на один и тот же объект. Хотя сами переменных хранятся по разным адресам. Но указывают на данные одного и того же объекта.
4 Lama12
 
14.02.19
11:06
(3) Ссылки как-бы еще нет. Объект не сохранен в базе.
5 Lama12
 
14.02.19
11:07
4+ Допускаю, что система "резервирует" ссылку для нового объекта, и с ней работает, но где об этом почитать?
6 VladZ
 
14.02.19
11:08
"Как вообще передача по значению должна работать для сложных типов? " - не врубаюсь, что именно нужно.

Василий Алибабаевич все правильно говорит: переменная - это "поименованная, либо адресуемая иным способом область памяти". В данном случае мы имеем в двух разных "адресах памяти" ссылку на один и тот же элемент.

И речь идет не про ссылку объекта (говоря в понятиях 1с). А ссылку на сущность.
7 Василий Алибабаевич
 
14.02.19
11:11
(4) Птля... "Объект не сохранен в базе." И что? Массивы вообще не хранятся в базе. Существуют только в памяти. И переменная типа массив хранит указатель в памяти на сам массив.
Почитать на ИТС :
"Главная"-"Разработка и администрирование"-"1С:Предприятие 8.3.14. Документация"
4.7.3.2. Вызов с передачей управления с клиента на сервер

Это для примера. Там нет подробного описания почему так. Там просто обращают внимание на передачу переменных объектных типов.
8 Lama12
 
14.02.19
11:14
(6) Спасибо понял.
(7) Читаю. Спасибо.
9 Ёпрст
 
14.02.19
11:15
(0) прочитай про Знач к агрегатным типам
10 DrWatson
 
14.02.19
11:27
В "4.7.3.1. Вызов без передачи управления с клиента на сервер" как раз твой случай.
11 Lama12
 
14.02.19
11:29
(10) Да, уже прочитал. Хорошая статья. Никогда не задумывался что с передачей строк с клиента на сервер могут быть проблемы.
12 Василий Алибабаевич
 
14.02.19
11:38
В этих ваших "сишарпах" для студентов существует хорошая лаба прочищающая мозги в плане объектов, указателей и проТчей ООП. В ней нужно написать код, перегружающий операцию присваивания, когда в новую переменную Вар2 записывается новый объект того же типа, что и в Вар1 и имеющий в свойствах те же значения.
13 Василий Алибабаевич
 
14.02.19
11:40
+ (12) И вот после перегрузки можно писать Вар1=Вар2; и тогда уже иметь в Вар1 и Вар2 разные указатели на разные объекты.
14 Lama12
 
14.02.19
11:45
(13) Эх... давно это было... :-( Еще на C++.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.