Передача параметров в процедуры и функции
С помощью параметров можно передавать в процедуру или функцию входные данные. Например:
Процедура Команда1(Команда)
Сумма = СуммаЧисел(2 + 3); //Сумма = 5
КонецПроцедуры
Функция СуммаЧисел(Слагаемое1, Слагаемое2)
Сумма = Слагаемое1 + Слагаемое2;
Возврат Сумма;
КонецФункции
Функция СуммаЧисел принимает 2 параметра и возвращает сумму этих параметров. При вызове функции параметры передаются по позиции. Слагаемое1 = 2, Слагаемое2 = 3, что соответствует позиции параметров при вызове функции.
Значения, которые передаются в функцию (в данном примере числа 2 и 3) называются аргументами функции. Часто используют такие понятия, как формальные и фактические параметры. Формальные параметры - это параметры процедуры или функции (в данном примере Слагаемое1 и Слагаемое2). Фактические параметры - это значения, которые передаются в процедуру или функцию (в данном примере это числа 2 и 3). То есть фактические параметры и аргументы это одно и то же.
В качестве параметров можно передавать литералы примитивных типов, переменные, сложные выражения:
Процедура Команда1(Команда)
а = 3;
Сумма = СуммаЧисел(2, а, 1+2); //Сумма = 8
КонецПроцедуры
Функция СуммаЧисел(Слагаемое1, Слагаемое2, Слагаемое3)
//Слагаемое1 = 2
//Слагаемое2 = 3, переменная а
//Слагаемое3 = 3, сумма 1+2
Сумма = Слагаемое1 + Слагаемое2 + Слагаемое3;
Возврат Сумма;
КонецФункции
Значения параметров по умолчанию
Для параметра можно указать значение по умолчанию. Если при вызове функции, параметр не был указан, то берется значение по умолчанию.
Процедура Команда1(Команда)
а = УмножитьЧисло(2, 3); //а = 6
б = УмножитьЧисло(2); //б = 4, так как по умолчанию Множитель = 2
КонецПроцедуры
Функция УмножитьЧисло(Число, Множитель = 2)
Возврат Число * Множитель;
КонецФункции
Пропущенные и опущенные параметры
Пропущенный параметр - когда при вызове процедуры или функции не указывается его значение и нет значения по умолчанию. В этом случае параметр будет равен Неопределено.
Процедура Команда1(Команда)
а = УмножитьЧисло(, 3); //а = 0
//первый параметр является пропущенным
КонецПроцедуры
Функция УмножитьЧисло(Число, Множитель = 2)
Если Число = Неопределено Тогда
Возврат 0;
КонецЕсли;
Возврат Число * Множитель;
КонецФункции
Опущенный параметр - когда явно не указано значение параметра, но для него установлено значение по умолчанию. В этом случае можно не указывать запятую до параметра, если он последний в списке параметров.
Процедура Команда1(Команда)
б = УмножитьЧисло(2);
//б = 4, так как по умолчанию Множитель = 2
//второй параметр является опущенным
КонецПроцедуры
Функция УмножитьЧисло(Число, Множитель = 2)
Возврат Число * Множитель;
КонецФункции
Передача параметров по ссылке и по значению
По умолчанию параметры передаются в процедуру или функцию по ссылке. Это значит, что изменение формального параметра в процедуре или функции повлечет за собой изменение фактического параметра.
Процедура Команда1(Команда)
а = 1;
ПоСсылке(а);
//после вызова процедуры а = 2
КонецПроцедуры
Процедура ПоСсылке(Параметр)
Параметр = 2;
КонецПроцедуры
Чтобы передать параметр по значению в описании процедуры или функции до имени параметра нужно добавить ключевое слово Знач. В этом случае фактический параметр будет скопирован. Изменение формального параметра в процедуре или функции не повлечет за собой изменение фактического параметра.
Процедура Команда1(Команда)
а = 1;
ПоЗначению(а);
//после вызова процедуры а = 1
КонецПроцедуры
Процедура ПоЗначению(Знач Параметр)
//изменяется копия переменной а
Параметр = 2;
КонецПроцедуры
Если по значению передать объект, например массив, то в процедуре или функции его можно будет очистить. При этом изменить само значение параметра нельзя.
Процедура Команда1(Команда)
МассивЗначений = Новый Массив;
МассивЗначений.Добавить(1);
МассивЗначений.Добавить(2);
МассивЗначений.Добавить(3);
// В массиве 3 числа
ПоЗначению(МассивЗначений);
// Массив будет пустой, но это массив, а не число 100
КонецПроцедуры
Процедура ПоЗначению(Знач Массив)
Массив.Очистить();
//массив будет очищен
Массив = 100;
// изменится копия массива
КонецПроцедуры
Так происходит, потому что и переменная МассивЗначений и формальный параметр ссылаются на один массив. Но при изменении формального параметра изменится только его значение. Переменная МассивЗначений по прежнему будет ссылаться на массив.
Если две переменные ссылаются на один массив и обе переменные передать в процедуру по ссылке и изменить там, то они по прежнему будут ссылаться на один и тот же массив.
Процедура Команда1(Команда)
МассивЗначений = Новый Массив;
МассивЗначений.Добавить(1);
МассивЗначений.Добавить(2);
МассивЗначений.Добавить(3);
// В массиве 3 числа
ЕщеМассив = МассивЗначений;
//ЕщеМассив и МассивЗначений ссылаются на один массив
ПоСсылке(МассивЗначений, ЕщеМассив);
Сообщить(МассивЗначений[0]); //1000
Сообщить(ЕщеМассив[0]); //1000
//Обе переменные ссылаются на один массив
//в массиве значения: 1000, 2000, 3000
КонецПроцедуры
Процедура ПоСсылке(Параметр1, Параметр2)
Параметр1[0] = 100;
Параметр1[1] = 200;
Параметр1[2] = 300;
Параметр2[0] = 1000;
Параметр2[1] = 2000;
Параметр2[2] = 3000;
КонецПроцедуры
Если при вызове процедуры или функции выполняется вызов сервера, то всегда будут создаваться копии параметров. При возврате на клиента также будут создаваться копии параметров с сервера. Потому что клиент и сервер могут быть разными компьютерами, и у каждого из них своя оперативная память. Если указано ключевое слово Знач, то при возврате управления с сервера на клиента копии параметров не будут передаваться.
&НаКлиенте
Процедура Команда1(Команда)
МассивЗначений = Новый Массив;
МассивЗначений.Добавить(1);
МассивЗначений.Добавить(2);
МассивЗначений.Добавить(3);
// В массиве 3 числа
ЕщеМассив = МассивЗначений;
//ЕщеМассив и МассивЗначений ссылаются на один массив
ПоСсылкеНаСервере(МассивЗначений, ЕщеМассив);
Сообщить(МассивЗначений[0]); //100
Сообщить(ЕщеМассив[0]); //1000
//МассивЗначений и ЕщеМассив ссылаются на разные массивы,
//которые были скопированы с сервера
//в массиве МассивЗначений значения: 100, 200, 300
//в массиве ЕщеМассив значения: 1000, 2000, 3000
КонецПроцедуры
&НаСервере
Процедура ПоСсылкеНаСервере(Параметр1, Параметр2)
Параметр1[0] = 100;
Параметр1[1] = 200;
Параметр1[2] = 300;
Параметр2[0] = 1000;
Параметр2[1] = 2000;
Параметр2[2] = 3000;
КонецПроцедуры
Если через параметры передать на сервер структуру с массивами, то будет создана копия как структуры, так и массивов.
&НаКлиенте
Процедура Команда1(Команда)
МассивЗначений = Новый Массив;
МассивЗначений.Добавить(1);
МассивЗначений.Добавить(2);
МассивЗначений.Добавить(3);
// В массиве 3 числа
ЕщеМассив = МассивЗначений;
//ЕщеМассив и МассивЗначений ссылаются на один массив
Структура = Новый Структура;
Структура.Вставить("Параметр1", МассивЗначений);
Структура.Вставить("Параметр2", ЕщеМассив);
ПоСсылкеНаСервере(Структура);
МассивЗначений[0] = 11;
МассивЗначений[1] = 22;
МассивЗначений[2] = 33;
ЕщеМассив[0] = 111;
ЕщеМассив[1] = 222;
ЕщеМассив[2] = 333;
Сообщить(МассивЗначений[0]); //111
Сообщить(ЕщеМассив[0]); //111
//МассивЗначений и ЕщеМассив ссылаются один массив,
//так как они не передавались на сервер
//их значения: 111, 222, 333
Сообщить(Структура.Параметр1[0]); //100
Сообщить(Структура.Параметр2[0]); //1000
//В структуре содержатся 2 разных массива,
//которые были скопированы с сервера
//в ключе Параметр1 значения: 100, 200, 300
//в ключе Параметр2 значения: 1000, 2000, 3000
КонецПроцедуры
&НаСервере
Процедура ПоСсылкеНаСервере(Структура)
Структура.Параметр1[0] = 100;
Структура.Параметр1[1] = 200;
Структура.Параметр1[2] = 300;
Структура.Параметр2[0] = 1000;
Структура.Параметр2[1] = 2000;
Структура.Параметр2[2] = 3000;
КонецПроцедуры
Сериализация параметров
Сериализация ‑ это процесс преобразования объекта в поток байтов для сохранения или передачи в память, в базу данных или в файл. Эта операция предназначена для того, чтобы сохранить состояние объекта для последующего воссоздания при необходимости. Обратный процесс называется десериализацией.
Платформа для внутренних нужд всегда использует XDTO-сериализацию в формат XML.
Этапы сериализации параметров при серверном вызове:
1. выполняется сериализация всех параметров вызова серверного метода;
2. выполняется вызов метода с одновременной передачей сериализованного представления параметров на сторону сервера;
3. на сервере выполняется десериализация переданных параметров;
4. выполняется собственно серверный вызов;
5. выполняется сериализация всех возвращаемых параметров и результата вызова (если он есть);
6. выполняется возврат управления на сторону клиентского приложения с одновременной передачей сериализованных данных;
7. на стороне клиентского приложения происходит десериализация результатов вызова;
8. вызов завершен.
Смотрите также:
Электронный учебник по по программированию в 1С Рекомендации по изучению программирования 1С с нуля Программное решение для сдачи и подготовки к экзаменам Программирование в 1С 8.3 с нуля - краткий самоучитель Комплексная подготовка программистов 1С:Предприятие 8.2 Сайты с уроками программирования и со справочниками Youtube-каналы с уроками программирования Сайты для обучения программированию Лекции и уроки