Параметры процедур и функций в 1С

Mar 27, 2022 18:14

Передача параметров в процедуры и функции

С помощью параметров можно передавать в процедуру или функцию входные данные. Например:

Процедура Команда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-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

программирование

Previous post Next post
Up