Каталог решений - Функциональное программирование в 1С

Функциональное программирование в 1С

Функциональное программирование в 1С

В наличии

Статья о функциональном программировании в 1С. Добавляем новые возможности. Пример передачи функций в качестве аргумента.

Категория:

Описание

В функциональном программировании есть такое понятие как функции первого класса (функции которые можно присваивать переменным, передавать в качестве аргументов и возвращать из функции). В 1С это также можно применять, используя небольшую вспомогательную функцию. Далее демо-пример ее использования.


&НаКлиенте
Процедура запуск(Команда)
	
	ТекстСообщения = "Результат вычисления с функцией delta = ";
	
	//вычислим значение константы с дельтой N*5
	deltaN5 = ВычислитьЗначениеСДельтой(Константа, newFunction("deltaN5", Новый Структура("N", N))); 
	Сообщить(СтрЗаменить(ТекстСообщения,"delta","deltaN5") + Строка(deltaN5)); 
	//Результат вычисления с функцией deltaN5 = 85
	
	//вычислим значение константы с дельтой N*M
	deltaNM = ВычислитьЗначениеСДельтой(Константа, newFunction("deltaNM", Новый Структура("N, M", N, M))); 
	Сообщить(СтрЗаменить(ТекстСообщения,"delta","deltaNM") + Строка(deltaNM));
	//Результат вычисления с функцией deltaNM = 55
	
КонецПроцедуры

//БЛОК ОСНОВНОЙ ПРОГРАММЫ

// Функция принимает в качестве аргументов значение константы и функцию вычисления дельты
//         функция выступает в роли функции высшего порядка
//
&НаКлиенте
Функция ВычислитьЗначениеСДельтой(Константа, functionDelta)

	//вычисление дельты, вызов функции
	Delta = callFunction(functionDelta);
	
	//основное вычисление
	Результат = Константа + Delta;
	
	Возврат Результат;

КонецФункции // ПеремножитьЧисла()

// Функция умножает переданное в аргументе значение на 5
//         функция выступает в роли функции первого класса
//
&НаКлиенте
Функция deltaN5(N)

	возврат N*5;

КонецФункции // ()

// Функция перемножает значения переданные в аргументах
//         функция выступает в роли функции первого класса
//
&НаКлиенте
Функция deltaNM(N, M)

	возврат N*M;

КонецФункции // ()

//БЛОК ВСПОМОГАТЕЛЬНЫХ ФУНКЦИЙ

// вспомогательная функция для инициации новой функции
//
// Параметры:
//  funcName  - Строка - Имя функции
//  arguments  - Структура - структура содержащая аргументы вызываемой функции
//                 аргументы должны быть расположены в том же порядке как в вызываемой функции
//
// Возвращаемое значение:
//   Структура   - набор содержащий имя функции и ее аргументы
//
&НаКлиенте
Функция newFunction(funcName, arguments)

	newFunction = Новый Структура("funcName, arguments", funcName, arguments);
	
	Возврат newFunction;

КонецФункции // newFunction()
 
// вспомогательный модуль вызова функций
//
// Параметры:
//	functionSet - Структура - Структура содержащая набор элементов для вызываемой функции
//		funcName  - Строка - Имя вызываемой функции
//		arguments  - Структура - структура содержащая аргументы вызываемой функции
//					аргументы должны быть расположены в том же порядке как в вызываемой функции 
//
// Возвращаемое значение:
//   Произвольный - возвращаемое значение вызываемой функции
&НаКлиенте
Функция callFunction(functionSet) 

	result = Неопределено;
	
	argumentsString = "";
	Для каждого argument Из functionSet.arguments Цикл
		argumentsString = argumentsString+"functionSet.arguments."+argument.Ключ+","; //раскладываем аргументы в строку
	КонецЦикла;
	
	argumentsString = Лев(argumentsString, СтрДлина(argumentsString)-1);
	
	СтрокаДляВыполнения = СтрЗаменить("result = funcName(arguments)", "funcName", functionSet.funcName);
	СтрокаДляВыполнения = СтрЗаменить(СтрокаДляВыполнения, "arguments", argumentsString);
	
	Выполнить(СтрокаДляВыполнения);
	
	Возврат result;

КонецФункции // func()

Обработка тестировалась на 1С:Предприятие 8.3 (8.3.13.1513)

has been added to your cart:
Оформление заказа