Что означает ключевое слово 'знач' при передаче параметров в 1С и как оно влияет на поведение
Что проверяют
Понимаете ли вы, как в 1С передаются параметры по умолчанию и что на самом деле копирует «Знач». Вопрос хорошо отделяет тех, кто читал синтакс-помощник, от тех, кто ловил изменённую снаружи таблицу значений.
Как отвечать
По умолчанию параметр передаётся по ссылке: присваивание параметру внутри процедуры видно в вызывающем коде. Слово «Знач» перед именем параметра включает передачу по значению, и присваивание наружу уже не выходит.
Процедура Увеличить(Знач Первый, Второй)
Первый = Первый + 1;
Второй = Второй + 1;
КонецПроцедурыПосле вызова первый аргумент останется прежним, второй увеличится.
Главный нюанс, ради которого вопрос и задают: копируется значение переменной, а не содержимое объекта. Для примитивов (число, строка, дата, булево) это полноценная копия. Для объектных типов (массив, структура, таблица значений, объект справочника) копируется ссылка, поэтому «Знач» защищает только от переприсваивания самой переменной, а вызов Массив.Добавить(Элемент) внутри процедуры изменит исходный массив вызывающего кода. Нужна независимая коллекция, делайте копию явно функцией Скопировать.
Практический вывод: помечать словом «Знач» входные параметры полезно, это фиксирует контракт процедуры и не даёт случайно вернуть результат через параметр.
Где спотыкаются
Считают, что «Знач» делает данные неизменяемыми. Таблица значений, структура и объект остаются теми же самыми, меняется не переменная, а её содержимое, и снаружи это прекрасно видно.
Боятся «Знач» на больших данных из-за копирования. Для объектных типов содержимое не копируется, накладных расходов почти нет, а осторожность нужна ровно в обратном случае: когда вы рассчитывали на копию, а её не произошло.
Переносят рассуждение на вызовы между клиентом и сервером. Там значения передаются через сериализацию, изменения обратно не приезжают независимо от «Знач», поэтому результат надо возвращать явно или класть в реквизит формы.