1С 8.3 Передача параметров
Данные > Примеры кода 1С > 1С 8.3 Процедуры и Функции
Перейти в раздел примеры кода 1С 8.3:

Как правильно передавать параметры в процедуры и функции. Понимание этого механизма - ключ к написанию эффективного кода.
Что нужно знать о способах передачи параметров? В 1С существуют два основных способа передачи данных:
• По ссылке• По значению (с использованием ключевого слова Знач)
Работа с простыми типами данных. Для базовых типов данных (числа, строки, даты) различия очевидны:
По ссылке:
Процедура ИзменитьПоСсылке(НашПараметр)
НашПараметр = 7;
КонецПроцедуры
Число = 3;
ИзменитьПоСсылке(Число);
// Результат: Число = 7
НашПараметр = 7;
КонецПроцедуры
Число = 3;
ИзменитьПоСсылке(Число);
// Результат: Число = 7
По значению:
Процедура ИзменитьПоЗначению(Знач НашПараметр)
НашПараметр = 7;
КонецПроцедуры
Число = 3;
ИзменитьПоЗначению(Число);
// Результат: Число = 3
НашПараметр = 7;
КонецПроцедуры
Число = 3;
ИзменитьПоЗначению(Число);
// Результат: Число = 3
Особенности работы с объектами. При работе со сложными объектами (массивы, таблицы значений) ситуация немного отличается:
По ссылке:
Таблица = Новый ТаблицаЗначений;
ОбработатьЗначение(Таблица);
Процедура ОбработатьЗначение(НашПараметр)
НашПараметр = Новый Массив;
КонецПроцедуры
// Результат: ТипЗнч(Таблица) = Массив
ОбработатьЗначение(Таблица);
Процедура ОбработатьЗначение(НашПараметр)
НашПараметр = Новый Массив;
КонецПроцедуры
// Результат: ТипЗнч(Таблица) = Массив
По значению:
Процедура ОчиститьТаблицу(Знач НашПараметр)
НашПараметр.Очистить();
КонецПроцедуры
// Объект не заменяется, но его содержимое изменяется!
НашПараметр.Очистить();
КонецПроцедуры
// Объект не заменяется, но его содержимое изменяется!
Важный момент: клиент-серверное взаимодействие. Почему стоит использовать Знач при работе между клиентом и сервером?
✅ Экономия трафика - без Знач платформа будет возвращать объект обратно✅ Безопасность - предотвращаются непредвиденные изменения данных✅ Производительность - снижается нагрузка на сеть
Пример:
&НаКлиенте
Процедура ТестироватьПередачуПараметров()
// Создаем тестовые массивы с одинаковыми начальными данными
массивДляСсылочнойПередачи = Новый Массив;
массивДляСсылочнойПередачи.Добавить("Тест");
массивДляПередачиПоЗначению = Новый Массив;
массивДляПередачиПоЗначению.Добавить("Тест");
массивДляКлиентскойПередачи = Новый Массив;
массивДляКлиентскойПередачи.Добавить("Тест");
// 1. Передача по ссылке на сервер (объект будет возвращен с сервера)
ОчиститьМассивПоСсылке(массивДляСсылочнойПередачи);
// 2. Передача по значению на сервер (объект не возвращается на клиент)
ОчиститьМассивПоЗначению(массивДляПередачиПоЗначению);
// 3. Передача по значению внутри клиента (работает как ссылка)
ОчиститьМассивНаКлиенте(массивДляКлиентскойПередачи);
// Выводим результаты
Сообщить("Элементов после ссылочной передачи: " + массивДляСсылочнойПередачи.Количество()); // 0
Сообщить("Элементов после передачи по значению: " + массивДляПередачиПоЗначению.Количество()); // 1
Сообщить("Элементов после клиентской передачи: " + массивДляКлиентскойПередачи.Количество()); // 0
КонецПроцедуры
&НаСервере
// Очищает переданный массив (передача по ссылке)
// После выполнения измененный объект возвращается на клиент
Процедура ОчиститьМассивПоСсылке(Массив)
Массив.Очистить();
КонецПроцедуры
&НаСервере
// Очищает переданный массив (передача по значению)
// Изменения не возвращаются на клиент
Процедура ОчиститьМассивПоЗначению(Знач Массив)
Массив.Очистить();
КонецПроцедуры
&НаКлиенте
// Очищает переданный массив на клиенте (передача по значению)
// Работает как ссылка, так как нет клиент-серверного взаимодействия
Процедура ОчиститьМассивНаКлиенте(Знач Массив)
Массив.Очистить();
КонецПроцедуры
Процедура ТестироватьПередачуПараметров()
// Создаем тестовые массивы с одинаковыми начальными данными
массивДляСсылочнойПередачи = Новый Массив;
массивДляСсылочнойПередачи.Добавить("Тест");
массивДляПередачиПоЗначению = Новый Массив;
массивДляПередачиПоЗначению.Добавить("Тест");
массивДляКлиентскойПередачи = Новый Массив;
массивДляКлиентскойПередачи.Добавить("Тест");
// 1. Передача по ссылке на сервер (объект будет возвращен с сервера)
ОчиститьМассивПоСсылке(массивДляСсылочнойПередачи);
// 2. Передача по значению на сервер (объект не возвращается на клиент)
ОчиститьМассивПоЗначению(массивДляПередачиПоЗначению);
// 3. Передача по значению внутри клиента (работает как ссылка)
ОчиститьМассивНаКлиенте(массивДляКлиентскойПередачи);
// Выводим результаты
Сообщить("Элементов после ссылочной передачи: " + массивДляСсылочнойПередачи.Количество()); // 0
Сообщить("Элементов после передачи по значению: " + массивДляПередачиПоЗначению.Количество()); // 1
Сообщить("Элементов после клиентской передачи: " + массивДляКлиентскойПередачи.Количество()); // 0
КонецПроцедуры
&НаСервере
// Очищает переданный массив (передача по ссылке)
// После выполнения измененный объект возвращается на клиент
Процедура ОчиститьМассивПоСсылке(Массив)
Массив.Очистить();
КонецПроцедуры
&НаСервере
// Очищает переданный массив (передача по значению)
// Изменения не возвращаются на клиент
Процедура ОчиститьМассивПоЗначению(Знач Массив)
Массив.Очистить();
КонецПроцедуры
&НаКлиенте
// Очищает переданный массив на клиенте (передача по значению)
// Работает как ссылка, так как нет клиент-серверного взаимодействия
Процедура ОчиститьМассивНаКлиенте(Знач Массив)
Массив.Очистить();
КонецПроцедуры
Ключевые выводы:
🎯 Используйте Знач для защиты исходных данных🎯 По ссылке позволяет полностью заменять объекты🎯 При клиент-серверном взаимодействии Знач - обязательное требование🎯 Для изменения содержимого объекта достаточно Знач
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник