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