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

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

В принципе, любой программист 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.Количество()); КонецПроцедуры

Резюме

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

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

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

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

Как сделать возврат или зачет суммы излишне уплаченного налога в 2024: новая форма заявления 

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

Как сделать возврат или зачет суммы излишне уплаченного налога в 2024: новая форма заявления 
23

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

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

Директора подразделения «Росатома» арестовали за взятку

Топ-менеджера структурного подразделения ГК «Росатом» заключили под стражу до 26 мая 2024 года. Его подозревают в получении взятки в особо крупном размере.

22

Фиктивная сотрудница, ничего не делая, за год «заработала» более 500 000 рублей

В Сочи направлено в суд уголовное дело о мошенничестве при трудоустройстве.

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

Какие выплаты положены работнику при увольнении переводом

Если сотрудник увольняется переводом к другому работодателю, то никаких выходных пособий и компенсаций в ТК за это не предусмотрено.

27

😠 Если ИП на УСН «доходы» закроется в январе 2025 года, его вычет на взносы 1% просто сгорит. Бухгалтеры возмущены

Взносы ИП 1% за 2024 год налог по УСН за 2024 год не уменьшают. Они пойдут на уменьшение налога только за 2025 год. Если конечно там будет, что уменьшать.

26

Центробанк снова продлил ограничения на перевод средств за рубеж

Ограничения на денежные переводы за границу будут действовать еще 6 месяцев — до 30 сентября 2024 года.

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

Как бизнесу снизить налоговую нагрузку: 5 законных способов

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

Как бизнесу снизить налоговую нагрузку: 5 законных способов
30

ФАС требует от Ozon объяснений по введению сбора в ПВЗ

Представители рынка электронной торговли направили в ФАС жалобу на Ozon, который установил сервисные сборы для владельцев пунктов выдачи заказов.

52

Тонкое искусство управления дедлайнами

Ежедневники, блокноты, календари, заметки в телефоне, стикеры, бумажечки и даже тыльная сторона ладони… Все это — инструменты, которые многие используют для фиксирования важных событий и дат. При таком управлении дедлайнами постоянная спешка, опоздания по срокам и недовольные клиенты — неизменные компаньоны. Далее расскажем, как от них избавиться.

Тонкое искусство управления дедлайнами
39

Предприниматели оформили рекордное число кредитов с плавающей ставкой

Число кредитов, процентная ставка которых привязана к ключевой, уже выросла почти до 50%. Бизнес уверен, что ЦБ снизит ключевую ставку, а вместе с ней сократятся проценты по займам.

47
УСН

ИП на УСН «доходы» не нужно заявление на зачет взносов 1%

Срок уплаты взносов ИП 1% с дохода свыше 300 тысяч рублей за 2023 год – 01.07.2024. Но можно не тянуть до последнего, а оплатить уже сейчас.

88

Chanel завершает свой бизнес в России

Компания Chanel решила полностью уйти с российского рынка. Ей могут грозить неустойки по договорам аренды, которые оценивают в десятки миллионов рублей.

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

Коротко, для чего нужен финансовый план? Как его создать

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

Коротко, для чего нужен финансовый план? Как его создать
25
НДФЛ

Оплата вынужденного прогула облагается НДФЛ

Если увольнение сотрудника было признано незаконным и через суд он добился восстановления и оплаты вынужденного прогула, то такая оплата – это облагаемый НДФЛ доход.

45

❗ Компания может попасть на штраф, если при переходе на ЕНС переплату по одному налогу ФНС зачла в счет долга по другому

За неумышленную неуплату налога из-за занижения базы или иного неправильного исчисления предусмотрен штраф 20% от суммы налога (по п. 1 ст. 122 НК).

144

Сколько длится дело по субсидиарке? Что приводит к затягиванию суда

Длительность рассмотрения дела связана с разными факторами. Разберем, что приводит к затягиванию рассмотрения дела в суде

27

Объявления об онлайн-продаже табака могут заблокировать без решения суда

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

34

Почему не существует шутки, которая нравится всем? Проведем эксперимент

Маяковский считал, что театр — это не отображающее зеркало, а увеличительное стекло. Если продолжить эту мысль поэта, то юмор — это не отображающее зеркало и даже не увеличительное стекло.

Почему не существует шутки, которая нравится всем? Проведем эксперимент
328

Как обезопасить массовые выплаты внештатникам

Компании, которые сотрудничают с большим числом внештатников, проводят массовые выплаты со своего счета. Такие платежи могут нести риски с точки зрения ИФНС и банков. Рассказываем, в чем причины и как обезопасить переводы.

Как обезопасить массовые выплаты внештатникам
160

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

НДС

Уточнят нормы НК об НДС 0% при экспорте

Торгово-промышленная палата России (ТПП) предложила исключить двойное толкование норм о международной перевозке с точки зрения налогового законодательства.

195