Собственные числовые переменные показывают передачу по ссылке и Знач. Свой массив показывает, почему Знач не равен глубокой копии коллекции.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.
Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().
Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.
Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.
Процедура ВыполнитьПример() Экспорт
Количество = 3;
ИзменитьКопиюЧисла(Количество);
Сообщить(Количество = 3);
ИзменитьСамоЧисло(Количество);
Сообщить(Количество = 4);
Книги = Новый Массив;
Книги.Добавить("Азбука");
ДобавитьВСобственныйМассив(Книги);
Сообщить(Книги.Количество() = 2);
Сообщить(Книги[1] = "Букварь");
ПодменитьКопиюСсылки(Книги);
Сообщить(Книги.Количество() = 2);
Сообщить(Книги[0] = "Азбука");
КонецПроцедуры
Процедура ИзменитьКопиюЧисла(Знач ЧислоКниг)
ЧислоКниг = ЧислоКниг + 1;
КонецПроцедуры
Процедура ИзменитьСамоЧисло(ЧислоКниг)
ЧислоКниг = ЧислоКниг + 1;
КонецПроцедуры
Процедура ДобавитьВСобственныйМассив(Знач Данные)
Данные.Добавить("Букварь");
КонецПроцедуры
Процедура ПодменитьКопиюСсылки(Знач Данные)
Данные = Новый Массив;
Данные.Добавить("Другой локальный массив");
КонецПроцедурыРазбор по шагам
Для числа с Знач передать копию значения 3. Присваивание 4 локальному параметру не меняет переменную вызывающей процедуры.
Без Знач формальный параметр связан с переданной переменной: присваивание внутри изменяет исходное Количество на 4.
Создать собственный массив с Азбука. В параметр Знач передаётся значение ссылки на тот же массив, а не независимая глубокая копия.
Вызов Добавить меняет объект массива, поэтому Букварь виден вызывающему коду несмотря на Знач.
Присваивание параметру другого Нового Массив с Знач заменяет только локальную ссылку. Исходные два элемента остаются в прежнем объекте.
Как проверить результат
Шесть сообщений Истина. После первого вызова число 3, после второго 4; исходный массив по завершении содержит Азбука/Букварь.
Поставьте точку останова перед каждым вызовом и сравните переменную и состав массива после возврата. Не переносите эту проверку на рабочие объекты документов.
Ожидаемый результат
Передача по значению показана отдельно для примитива и собственного изменяемого объекта, без заявления о несуществующей глубокой копии.
На что обратить внимание
Знач защищает от переприсваивания параметра вызывающей переменной, но не делает переданный изменяемый объект неизменяемым.
Отличайте Данные.Добавить от Данные = Новый Массив: первое меняет объект, второе — значение переменной ссылки.
Асинхронные функции имеют свои правила: их параметры всегда передаются по значению. Этот урок использует обычные синхронные процедуры.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.