Параметры: отличить изменение переменной от изменения объекта

Учебные задачи

Собственные числовые переменные показывают передачу по ссылке и Знач. Свой массив показывает, почему Знач не равен глубокой копии коллекции.

Где и как запускать

Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.

Подготовка

  1. Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.

  2. Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().

  3. Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.

  4. Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.

Процедура ВыполнитьПример() Экспорт
    Количество = 3;
    ИзменитьКопиюЧисла(Количество);
    Сообщить(Количество = 3);
    ИзменитьСамоЧисло(Количество);
    Сообщить(Количество = 4);
    Книги = Новый Массив;
    Книги.Добавить("Азбука");
    ДобавитьВСобственныйМассив(Книги);
    Сообщить(Книги.Количество() = 2);
    Сообщить(Книги[1] = "Букварь");
    ПодменитьКопиюСсылки(Книги);
    Сообщить(Книги.Количество() = 2);
    Сообщить(Книги[0] = "Азбука");
КонецПроцедуры

Процедура ИзменитьКопиюЧисла(Знач ЧислоКниг)
    ЧислоКниг = ЧислоКниг + 1;
КонецПроцедуры

Процедура ИзменитьСамоЧисло(ЧислоКниг)
    ЧислоКниг = ЧислоКниг + 1;
КонецПроцедуры

Процедура ДобавитьВСобственныйМассив(Знач Данные)
    Данные.Добавить("Букварь");
КонецПроцедуры

Процедура ПодменитьКопиюСсылки(Знач Данные)
    Данные = Новый Массив;
    Данные.Добавить("Другой локальный массив");
КонецПроцедуры

Разбор по шагам

  1. Для числа с Знач передать копию значения 3. Присваивание 4 локальному параметру не меняет переменную вызывающей процедуры.

  2. Без Знач формальный параметр связан с переданной переменной: присваивание внутри изменяет исходное Количество на 4.

  3. Создать собственный массив с Азбука. В параметр Знач передаётся значение ссылки на тот же массив, а не независимая глубокая копия.

  4. Вызов Добавить меняет объект массива, поэтому Букварь виден вызывающему коду несмотря на Знач.

  5. Присваивание параметру другого Нового Массив с Знач заменяет только локальную ссылку. Исходные два элемента остаются в прежнем объекте.

Как проверить результат

  1. Шесть сообщений Истина. После первого вызова число 3, после второго 4; исходный массив по завершении содержит Азбука/Букварь.

  2. Поставьте точку останова перед каждым вызовом и сравните переменную и состав массива после возврата. Не переносите эту проверку на рабочие объекты документов.

Ожидаемый результат

Передача по значению показана отдельно для примитива и собственного изменяемого объекта, без заявления о несуществующей глубокой копии.

На что обратить внимание

  1. Знач защищает от переприсваивания параметра вызывающей переменной, но не делает переданный изменяемый объект неизменяемым.

  2. Отличайте Данные.Добавить от Данные = Новый Массив: первое меняет объект, второе — значение переменной ссылки.

  3. Асинхронные функции имеют свои правила: их параметры всегда передаются по значению. Этот урок использует обычные синхронные процедуры.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.