Процедуры и функции в 1С

Процедуры и функции

Процедуры и функции хранят в себе набор операторов. Если какой-то блок кода используется в нескольких местах, то целесообразно выделить его в отдельную процедуру или функцию. В дальнейшем, это облегчит поддержку программы. Если нужно будет внести изменение в этот блок кода, то достаточно будет сделать это в одном месте (в процедуре или функции). Иначе пришлось бы вносить изменения в нескольких местах.

Пример процедуры и функции:

Процедура Команда1(Команда)
	Сообщение();
	а = ЧислоПи();
КонецПроцедуры
 
Процедура Сообщение()
	Сообщить("Сообщение из процедуры");	
КонецПроцедуры 	
 
Функция ЧислоПи()
	Возврат 3.14;	
КонецФункции

В данном примере объявлена процедура Сообщение(), которое выводит сообщение на экран и функция ЧислоПи(), которая возвращает значение числа Пи. После вызова функции переменная а будет равна 3.14.

При вызове процедуры или функции обязательно нужно указывать круглые скобки «()».

Конец процедуры определяется ключевым словом «КонецПроцедуры». Конец функции соответственно ключевым словом «КонецФункции». Так как данные ключевые слова являются операторными скобками, то после них не ставится точка с запятой.

Возвращаемое значение

Разница между процедурой и функцией только в том, что функция должна возвращать значение. Внутри функции используется ключевое слово «Возврат» после которое указывается возвращаемое значение.

В процедуре тоже можно использовать ключевое слово «Возврат». Это будет означать выход из процедуры, операторы после него не будут выполнены.

Процедура Сообщение()
	Сообщить("Сообщение из процедуры");
	Возврат;
	Сообщить("Это сообщение не будет выведено на экран");
КонецПроцедуры

При этом, функцию можно вызывать как процедуру, то есть возвращаемое значение можно не присваивать никакой переменной:

Процедура Команда1(Команда)
	ЧислоПи();
КонецПроцедуры
 
Функция ЧислоПи()
	Возврат 3.14;	
КонецФункции

Экспорт

Для того, чтобы процедура или функция была доступна из других модулей конфигурации нужно добавить после имени процедуры или функции ключевое слово «Экспорт»:

Функция ЧислоПи() Экспорт
	Возврат 3.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. вызов завершен.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями: