По ссылке или по значению? Ключевое слово Знач и с чем его едят

В принципе, любой программист 1С знает, зачем нужно ключевое слово "Знач", позволяющее передавать параметры в метод "по значению". Однако часто оказывается, что все не так просто и термины "по значению" и "по ссылке" вызывают путаницу. В данной заметке хотел бы расставить точки в этом вопросе.

В принципе, любой программист 1С знает, зачем нужно ключевое слово "Знач", позволяющее передавать параметры в метод "по значению". Однако часто оказывается, что все не так просто и термины "по значению" и "по ссылке" вызывают путаницу. В данной заметке хотел бы расставить точки в этом вопросе.

Вкратце о чем речь

Все это и так знают, но все же в начале напомню, как в 1С могут передаваться параметры метода. Передаваться они могут "по ссылке" и "по значению". В первом случае, мы передаем в метод то же самое значение, что и в точке вызова, а во втором - его копию.

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

По умолчанию в 1С аргументы передаются по ссылке, и изменение параметра внутри метода будет видно извне метода. Здесь дальнейшее понимание вопроса зависит от того, что именно вы понимаете под словом "изменение параметра". Так вот, имеется в виду повторное присваивание и ничего более. Причем, присваивание может быть неявным, например вызовом метода платформы, который возвращает что-то в выходном параметре.

Но если мы не хотим, чтобы наш параметр передавался по ссылке, то мы можем указать перед параметром ключевое слово Знач.

Процедура ПоЗначению(Знач Параметр) Параметр = 2; КонецПроцедуры Параметр = 1; ПоЗначению(Параметр); Сообщить(Параметр); // выведет 1

Все работает, как обещано - изменение (а правильнее сказать "замена") значения параметра не приводит к изменению значения вне метода.

Ну а в чем прикол-то?

Интересные моменты начинаются, когда мы начинаем передавать в качестве параметров не примитивные типы (строки, числа, даты и т.п.), а объекты. Вот тут-то и всплывают такие понятия, как "мелкая" и "глубокая" копия объекта, а также указатели (не в терминах C++, а как абстрактные дескрипторы (handles)).

При передаче объекта (например, ТаблицыЗначений) по ссылке, мы передаем само значение указателя (некий handle), который в памяти платформы "держит" объект. При передаче по значению платформа сделает копию этого указателя.

Иными словами, если, передавая объект по ссылке, в методе мы присвоим параметру значение "Массив", то в точке вызова получим массив. Повторное присваивание значения, переданного по ссылке, видно из места вызова.

Процедура ОбработатьЗначение(Параметр) Параметр = Новый Массив; КонецПроцедуры Таблица = Новый ТаблицаЗначений; ОбработатьЗначение(Таблица); Сообщить(ТипЗнч(Таблица)); // выведет Массив

Если же, мы передадим объект по значению, то в точке вызова наша ТаблицаЗначений не пропадет.

Содержимое объекта и его состояние

При передаче по значению копируется не весь объект, а только его указатель. Экземпляр объекта остается одним и тем же. Неважно, как вы передаете объект, по ссылке или по значению - очистка таблицы значений приведет к очистке именно таблицы. Эта очистка будет видна везде, т.к. объект был один-единственный и неважно, как именно он передавался в метод.

Процедура ОбработатьЗначение(Параметр) Параметр.Очистить(); КонецПроцедуры Таблица = Новый ТаблицаЗначений; Таблица.Добавить(); ОбработатьЗначение(Таблица); Сообщить(Таблица.Количество()); // выведет 0

При передаче объектов в методы платформа оперирует указателями (условными, не прямыми аналогами из C++). Если объект передается по ссылке, то ячейка памяти виртуальной машины 1С, в которой лежит данный объект, может быть перезаписана другим объектом. Если объект передается по значению, то указатель копируется и перезапись объекта не приводит к перезаписи ячейки памяти с исходным объектом.

В то же время любое изменение состояния объекта (очистка, добавление свойств и т.п.) изменяет сам объект, и вообще никак не связано с тем, как и куда объект передавался. Изменилось состояние экземпляра объекта, на него может быть куча "по-ссылок" и "по-значений", но экземпляр всегда один и тот же. Передавая объект в метод, мы не создаем копию всего объекта.

И это верно всегда, за исключением...

Клиент-серверное взаимодействие

В платформе очень прозрачно реализованы серверные вызовы. Мы просто вызываем метод, а под капотом платформа сериализует (превращает в строку) все параметры метода, передает на сервер, а потом возвращает выходные параметры обратно на клиента, где они десериализуются и живут, как будто ни на какой сервер не ездили.

Как известно, не все объекты платформы являются сериализуемыми. Именно отсюда растет ограничение, что не все объекты можно передать в серверный метод с клиента. Если передать несериализуемый объект, то платформа начнет ругаться нехорошими словами.

В стандартах разработки фирмы 1С рекомендуется всегда в параметрах использовать ключевое слово Знач, если мы не собираемся явно возвращать в параметре некое значение. Это хорошо по нескольким причинам:

  • Явное объявление намерений программиста. Глядя на сигнатуру метода, можно четко сказать, какие параметры входные, а какие выходные. Такой код легче читать и сопровождать
  • Для того, чтобы изменение на сервере параметра "по ссылке" было видно в точке вызова на клиенте, параметры, передаваемые на сервер по ссылке, платформа обязательно будет сама возвращать на клиента, чтобы обеспечить поведение, описанное в начале статьи. Если параметр не нужно возвращать, то будет перерасход трафика. Для оптимизации обмена данными параметры, значения которых нам не нужны на выходе, нужно помечать словом Знач.

Здесь примечателен второй пункт. Для оптимизации трафика платформа не будет возвращать значение параметра на клиент, если параметр помечен словом Знач. Все это замечательно, но приводит к интересному эффекту.

Как я уже говорил, при передаче объекта на сервер происходит сериализация, т.е. выполняется "глубокая" копия объекта. А при наличии слова Знач объект не поедет с сервера обратно на клиента. Складываем эти два факта и получаем следующее:

&НаСервере Процедура ПоСсылке(Параметр) Параметр.Очистить(); КонецПроцедуры &НаСервере Процедура ПоЗначению(Знач Параметр) Параметр.Очистить(); КонецПроцедуры &НаКлиенте Процедура ПоЗначениюКлиент(Знач Параметр) Параметр.Очистить(); КонецПроцедуры &НаКлиенте Процедура ПроверитьЗнач() Список1= Новый СписокЗначений; Список1.Добавить("привет"); Список2 = Список1.Скопировать(); Список3 = Список1.Скопировать(); // объект копируется полностью, // передается на сервер, потом возвращается. // очистка списка видна в точке вызова ПоСсылке(Список1); // объект копируется полностью, // передается на сервер. Назад не возвращается. // Очистка списка НЕ ВИДНА в точке вызова ПоЗначению(Список2); // копируется только указатель объекта // очистка списка видна в точке вызова ПоЗначениюКлиент(Список3); Сообщить(Список1.Количество()); Сообщить(Список2.Количество()); Сообщить(Список3.Количество()); КонецПроцедуры

Резюме

Если вкратце, то резюмировать можно следующим образом:

  • Передача по ссылке позволяет "затереть" объект совсем другим объектом
  • Передача по значению не позволяет "затереть" объект, но изменения внутреннего состояния объекта будут видны, т.к. идет работа с одним и тем же экземпляром объекта
  • При серверном вызове работа идет с РАЗНЫМИ экземлярами объекта, т.к. выполнялось глубокое копирование. Ключевое слово Знач запретит копирование серверного экземпляра обратно в клиентский, и изменение внутреннего состояния объекта на сервере не приведет к аналогичному изменению на клиенте.

Надеюсь, что этот несложный перечень правил позволит вам легче решать споры с коллегами насчет передачи параметров "по значению" и "по ссылке"

Начать дискуссию

Набиуллина: ключевая ставка 16% может держаться до конца года

Сейчас Центробанк не видит устойчивой дезинфляции, при которой возможен пересмотр ключевой ставки. Спрос все еще опережает возможности производства.

Курсы повышения
квалификации

20
Официальное удостоверение с занесением в госреестр Рособрнадзора

Беременная сотрудница может отказаться от работы и продолжить получать зарплату. 🤰«Ночной бухгалтер» № 1673

Для работодателя беременные сотрудницы представляют довольно проблемную часть персонала. Их почти невозможно уволить и нужно все время балансировать на грани соблюдения интересов сотрудницы и своих собственных. Это удается не всегда.

Иллюстрация: Вера Ревина/Клерк.ру
НДФЛ

Минфин не готов освободить от налога дивиденды на ИИС

Инвесторы будут платить НДФЛ с дивидендов, которые они получили от акций на индивидуальном инвестиционном счете.

Лучшие спикеры, новый каждый день
Банки

ЦБ повысит надбавки по необеспеченным потребительским кредитам

Чтобы ограничить долговую нагрузку населения, регулятор ужесточает требования к банкам. Они будут больше платить за риски.

Банки

Сбер переведет заблокированные активы на отдельное юрлицо

До 31 декабря 2024 года подсанкционные банки имеют право перевести заблокированные активы и обязательства перед иностранными кредиторами на новую компанию.

Общество

Министр труда: в регионах злоупотребляют материнским капиталом

Власти предлагают устанавливать пригодность для жилой недвижимости, которую покупают получатели материнского капитала.

Опытом делятся эксперты-практики, без воды

В России могут ввести программу «Сельскохозяйственный гектар»

Зампредседателя Госдумы Ирина Яровая предложила сформировать специальную программу «Сельскохозяйственный гектар».

CRM

👩‍💻Популярные CRM для бухгалтерского аутсорсинга. Опрос

Не важно, у вас аутсорсинговая компания или бы бухгалтер-фрилансер с большим количеством клиентов или даже с помощниками. Невозможно держать в голове все сделки, выставленные счета, проведенные переговоры, не говоря уже о сроках сдачи отчетов и выдаче задач подчиненным. На помощь приходят CRM.

1
Банки

Суд начал принудительную ликвидацию банка «Стрела»

В ходе ликвидации вкладчики и кредиторы получат свои средства. Процедуру будет проводить Агентство по страхованию вкладов.

Я руководитель, который никогда не уйдет от микроменеджмента, плохо это или хорошо. Интервью с Мариной Снеговской

Издатель «Клерка» Марина Снеговская рассказала о работе редакции, о том, чем не может пожертвовать «Клерк» и причем тут вечная гонка.

Я руководитель, который никогда не уйдет от микроменеджмента, плохо это или хорошо. Интервью с Мариной Снеговской
12

У ИП личные и предпринимательские налоги идут на одном ЕНС

НК не предусматривает разделение ЕНС на единый налоговый счет индивидуального предпринимателя и на ЕНС его же как физлица, не являющегося ИП.

⚡️ Итоги дня: жительница Великобритании приютила 74 детей, уборку улиц доверят роботам, а в Крым пришли дожди с песком

Подготовили обзор главных событий дня — 26 апреля 2024 года. Все самое интересное, что писали и обсуждали в сети, в одной подборке.

Миникурсы, текстовые и видеоинструкции для бухгалтеров
Экспорт

Росфинмониторинг: экспортеры не нарушают указ о продаже валютной выручки

Крупнейшие экспортеры выполняют требования властей в полном объеме и продают выручку по внешнеторговым контрактам на территории РФ.

Фейковых приложений банков стало на 25% больше

Мошенники пользуются тем, что иностранные магазины мобильных приложений блокируют официальный банковский софт, и предлагают пользователям скачать фейковые приложения.

Налоговикам можно задавать вопросы только про свои налоговые дела, но не про чужие

Абы кому ФНС не дает разъяснения по налогам.

Хочу научиться инвестировать в бизнес. Топ–16 площадок и телеграм–каналов для обучения

Финансовое образование (хотя бы на базовом уровне) — это один из первых шагов, которые стоит сделать перед тем, как вкладывать куда-либо деньги. На каких площадках и телеграм-каналах можно научиться инвестировать в бизнес?

Иллюстрация: создано с помощью ИИ OpenAI © Вера Ревина/Клерк.ру

Губернаторам хотят разрешить продлевать майские праздники

В Госдуме хотят разрешить местным властям давать больше выходных в майские праздники. Но только если большинство жителей поддержит перенос выходных с новогодних праздников.

Применение метода Критического Пути в управлении проектами

Любой проект является многозадачным, и часть задач находится во взаимной зависимости. В результате одни из них оказывают воздействие на решение других. Те из задач, что имеют наибольшее значение, должны находиться под непрерывным контролем.

Применение метода Критического Пути в управлении проектами

Физлицам до 2 мая нужно сдать уведомления о КИК

Если не представить уведомление о контролируемой иностранной компании, придется заплатить штраф в размере 500 000 рублей.

Интересные материалы

Как ваши интернет-бухгалтерии уменьшают налог на взносы? Опрос

Одна из подписчиц рассказала нам о том, как устроен расчет налога по УСН в онлайн-бухгалтерии Тинькофф, и прислала нам скрины переписки с поддержкой. Нас подход удивил и мы решили устроить опрос — а как работают ваши онлайн-бухгалтерии?