Если хочется функционального программирования с функциями высшего порядка и map, filter, reduce

Публикация № 1689990 07.07.22

Приемы и методы разработки - Математика и алгоритмы

Функциональное программирование парадигма каррирование функции высшего порядка обработка массивов map filter reduce

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

Одной из основ функционального программирования является тот факт, что функция (сама по себе, а не только результат ее вычисления) рассматривается как объект, с которым можно работать - сохранять, преобразовывать, вычислять. В 1С такого нет - нет указателей на функцию (как в Си), нет ссылок на функции, нельзя создать объект-функцию. Хотя вроде бы есть платформенные функции Выполнить(<Строка>) и Вычислить(<Строка>), с помощью которых можно вызывать функции по имени, но проблем с их использованием столько, что такой подход вряд ли удобен. Так что же, других вариантов нет? Обычно мы вызываем функцию следующим образом <Модуль>.<Имя функции>. Посмотрим на это выражение с другой стороны. Мы не можем использовать <Имя функции> как объект, но ведь <Модуль> - можем! Таким образом, используя в качестве "функций" общие модули 1С и разместив в них алгоритм вычисления, мы можем использовать эти "функции" как объекты.

 

 

В 1С есть фундаментальная проблема - имена общих модулей могут конфликтовать с именами других идентификаторов в программе. Добавление знака "_" в имя общего модуля, хоть это и противоречит стандартам 1С, позволит снизить остроту этой проблемы.

Чтобы избежать путаницы, далее в статье и в примерах под понятием "функция" будет пониматься "функция ФП" (функционального программирования) в отличие от "функция 1С" - элемента языка 1С. Функцию, реализованную в виде общего модуля назовем "оператор" - такие функции послужат "кирпичиками" для построения более сложных функций.

 

1. Функции высшего порядка и каррирование

Рассмотрим обычное сложение Сумма(10, 1). Это функция с двумя переменными, возвращающая при вычислении число 11. А что будет, если мы попытаемся вычислить Сумма(1)? В мире 1С такая конструкция даст ошибку, а в мире ФП - вернет объект - функцию увеличения на 1, т.е. инкремент: Инкремент = Сумма(1). В вызов полученной функции (уже только от одного аргумента) мы можем подставить любое число, или, как принято говорить, применить функцию к любому числу: Инкремент(10) // =11,  Инкремент(27) // =28

Вот так это выглядит в прилагаемой конфигурации:

ФункцияСложения = НоваяФункция(_Сложить,10,1);
Результат = ВыполнитьФункцию(ФункцияСложения);
Сообщить(Результат); // =11
	
// ... или
ФункцияСложения = НоваяФункция(_Сложить);
Инкремент = ПрименитьФункцию(_Сложить,1); // в Инкремент записалась функция
Результат = ПрименитьФункцию(Инкремент, 10); 
Сообщить(Результат); // =11

С технической точки зрения функция здесь - это массив, первым элементом которого выступает операция или другая функция, а остальные элементы - ее фактические аргументы.

Такое преобразование функции от нескольких аргументов в функции от одного аргумента называется каррирование, или карринг, а функции, принимающие или возвращающие другие функции как объекты, - функции высшего порядка.

Продолжаем.

Функция, умножающая аргумент на 3:

Функция3x = НоваяФункция(_Умножить, 3);

Функция, делящая аргумент на 2:

Функция05x = НоваяФункция(_Умножить, 0.5);

Функция, вычисляющая 3*x+1. Здесь нам надо результат умножения подать на "вход" функции инкремента, как на конвейере:

Функция3x1 = НоваяФункция(_Конвейер, Функция3x, Инкремент);

Более сложная функция - проверяет аргумент на четность:

ФункцияЭтоЧетное = НоваяФункция(_Конвейер, НоваяФункция(_Остаток, 2), НоваяФункция(_Равно, 0));

Обратите внимание: все вышеприведенные примеры возвращают функцию, которую потом можно применить к любому аргументу.

А вот функция, возвращающая другую функцию в зависимости от аргумента:

ФункцияПоУсловию = НоваяФункция(_Конвейер, ФункцияЭтоЧетное, НоваяФункция(_Условие, Функция05x, Функция3x1));

Если аргумент четный - то вернется функция деления на 2, если нечетный - функция 3*x+1.

Теперь у нас все готово, чтобы заняться сиракузской проблемой (она, конечно же, не имеет отношение к ФП, а используется только для примера):

	ФункцияСложения = НоваяФункция(_Сложить);
	Инкремент = ПрименитьФункцию(_Сложить, 1);	
	Функция3x = НоваяФункция(_Умножить, 3);
	Функция05x = НоваяФункция(_Умножить, 0.5);	
	Функция3x1 = НоваяФункция(_Конвейер, Функция3x, Инкремент);
	
	ФункцияЭтоЧетное = НоваяФункция(_Конвейер, НоваяФункция(_Остаток, 2), НоваяФункция(_Равно, 0));
	ФункцияПоУсловию = НоваяФункция(_Конвейер, ФункцияЭтоЧетное, НоваяФункция(_Условие, Функция05x, Функция3x1));	
	
	Значение = 27;
	ПрименитьФункцию(_ВывестиЗначение, Значение);
	Пока Значение > 1 Цикл		
		Значение = ПрименитьФункцию(ПрименитьФункцию(ФункцияПоУсловию, Значение), Значение);
		ПрименитьФункцию(_ВывестиЗначение, Значение);		
	КонецЦикла; 

Здесь в цикле на основе переменной-аргумента Значение выбирается одна из двух функций: 3*x+1 или x/2, и она же применяется к этому аргументу.

 

2. Массивы и map, filter, reduce.

Так как мы научились работать с функциями высшего порядка, нам ничего не мешает реализовать и обычные для современных языков функции map, filter, reduce. Но поскольку мы пишем все-таки на русском языке, назовем их ПрименитьДляКаждого, Фильтр, Свернуть. Напомню, все эти функции применяются для коллекций (в нашем случае для массива). ПрименитьДляКаждого (map) возвращает массив, к каждому элементу которого применена функция-аргумент. Фильтр (filter) - возвращает массив, в котором содержатся только элементы, удовлетворяющие преданному в аргументе условию. Свернуть (reduce) возвращает значение, полученное обработкой каждого элемента массива с накоплением промежуточного "итога", так можно подсчитать, например, сумму элементов.

Реализация этих функций несложна:

Функция ПрименитьДляКаждого(Знач Массив, Знач ФункцияФП)Экспорт
	Результат = Новый Массив;
	Для каждого Элемент Из Массив Цикл   		
		Результат.Добавить(ПрименитьФункцию(ФункцияФП, Элемент));
	КонецЦикла; 		
	Возврат Результат;
КонецФункции 

Функция Фильтр(Знач Массив, Знач ФункцияФП)Экспорт
	Результат = Новый Массив;
	Для каждого Элемент Из Массив Цикл   
		РезультатСравнения = ПрименитьФункцию(ФункцияФП, Элемент);
		Если ЗначениеЗаполнено(РезультатСравнения) И РезультатСравнения <> Ложь И РезультатСравнения <> 0   Тогда   
			Результат.Добавить(Элемент);	
		КонецЕсли; 		
	КонецЦикла; 		
	Возврат Результат;
КонецФункции 

Функция Свернуть(Знач Массив, Знач ФункцияФП, Знач НачальноеЗначениеИтога=NULL)Экспорт
	Результат = НачальноеЗначениеИтога;
	Для каждого Элемент Из Массив Цикл   
		Результат = ПрименитьФункцию(ВставитьПервыйАргументВФункцию(ФункцияФП, Результат), Элемент);		
	КонецЦикла; 
	Возврат Результат;
КонецФункции 
 

Примеры использования:

	Массив1 = ПримерЧисловогоМассива();
	Сообщить("Исходный массив:"); 
	ПрименитьДляКаждого(Массив1, _ВывестиЗначение);
	
	Сообщить("Массив элементов, увеличенных на 1:"); 
	Инкремент = ПрименитьФункцию(_Сложить, 1);	
	Массив2 = ПрименитьДляКаждого(Массив1, Инкремент);
	ПрименитьДляКаждого(Массив2, _ВывестиЗначение);
	
	Сообщить("Массив элементов, больших 5:"); 
	Условие = НоваяФункция(_Больше, 5);
	Массив2 = Фильтр(Массив1, Условие);
	ПрименитьДляКаждого(Массив2, _ВывестиЗначение);
	
	
	Сообщить("Сумма: " + Свернуть(Массив1, НоваяФункция(_Сложить), 0));
	Сообщить("Минимум: " + Свернуть(Массив1, НоваяФункция(_Минимум), Массив1[0]));
	Сообщить("Максимум: " + Свернуть(Массив1, НоваяФункция(_Максимум), Массив1[0]));

Обращаю ваше внимание, что Свернуть (reduce) может возвращать значение любого типа, а не только простого. В зависимости от переданной функции можно реализовать генерацию сложных структур - массивов, связанных списков, B-tree  и т.п.

 

3. Сортировка

В 1С нет функции сортировки массива. Может быть потому, что элементами массива могут быть значения самых разных типов, например структуры? Используя функции высшего порядка, такую сортировку можно реализовать. Где здесь использовать такие функции? Во-первых, для элементов массива, в зависимости от их типов, нужна функция получения значения, пригодного для сравнения. А во-вторых, нужна функция сравнения.  

Функция Сортировать(Знач Массив, Знач ФункцияПолученияЗначения, Знач ФункцияСравнения)Экспорт
	Результат = Массив;
	// проверим, может массив уже отсортирован, и если нет - найдем элемент, который точно находится не по порядку
	НадоСортировать = Ложь;
	Для Индекс = 0 По Массив.ВГраница() - 1 Цикл  
		Значение1 = ПрименитьФункцию(ФункцияПолученияЗначения, Массив[Индекс]);
		Значение2 = ПрименитьФункцию(ФункцияПолученияЗначения, Массив[Индекс + 1]);		
		Если ВыполнитьФункцию(НоваяФункция(ФункцияСравнения, Значение1, Значение2)) Тогда
			НадоСортировать = Истина;
			Прервать;
		КонецЕсли; 
	КонецЦикла; 
	
	Если НадоСортировать Тогда		
		// делим массив на две части относительно найденного элемента, сортируем эти части отдельно и объединяем их
		
		ФункцияСравненияЗначения = НоваяФункция(_Конвейер, ФункцияПолученияЗначения, НоваяФункция(ФункцияСравнения, Значение2));
		Массив1 = Фильтр(Массив, НоваяФункция(_Конвейер, ФункцияСравненияЗначения,_Не)); // Массив значений не "бОльших" заданного значения
		Массив2 = Фильтр(Массив, ФункцияСравненияЗначения); 				// Массив значений "бОльших" заданного значения
		
		Результат = Объединить(Сортировать(Массив1, ФункцияПолученияЗначения, ФункцияСравнения),
		   			Сортировать(Массив2, ФункцияПолученияЗначения, ФункцияСравнения));
	КонецЕсли; 
	Возврат Результат;
КонецФункции 

Пример для массива чисел:

Массив1 = ПримерЧисловогоМассива();
Массив2 = Сортировать(Массив1, Неопределено,_Больше); 
ПрименитьДляКаждого(Массив2, _ВывестиЗначение);

Здесь второй аргумент для сортировки говорит о том, что нам не нужна дополнительная функция получения значения.

А если в массиве будут не числа, а, например, Структура("Фамилия,Имя,Отчество")? Нет проблем, надо лишь определить функцию, которая из структуры получит значение, пригодное для сравнения и передать ее в функцию сортировки.

Массив1 = ПримерМассиваСтруктур();
Массив2 = Сортировать(Массив1, _ФИОВСтрокуВрег, _Больше); 
ПрименитьДляКаждого(Массив2, _ВывестиСтруктуру);

 

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

И еще, важное замечание: в реальных проектах этот и подобные подходы используйте с большой осторожностью! Не надо этого делать без крайней необходимости, просто чтобы показать "посмотрите, как я могу!". Подумайте о тех, кто будет сопровождать такой проект.

К статье приложена конфигурация с "движком" и примерами. Предполагается, что код в ней - не более чем образец, вопросы оптимизации не рассматривались, "защиты от дурака" почти нет. Проверялась на платформе 8.3.18.1363.

Как всегда, приветствуются замечания / дополнения / комментарии.

Следующие статьи:

 
 Некоторые из прочих моих публикаций

 

Скачать файлы

Наименование Файл Версия Размер
База с примерами ФП

.dt 52,43Kb
2
.dt 52,43Kb 2 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 07.07.22 10:02 Сейчас в теме
А есть пример(ы) решения задачи динамического программирования?
2. Alxby 758 07.07.22 10:14 Сейчас в теме
(1)Можно попробовать, но так как не получается красивой рекурсии, то вряд ли решение будет элегантным. Не уверен, что на это нужно тратить время при отсутствии конкретной задачи, разве что для развлечения :).
3. RustIG 07.07.22 10:31 Сейчас в теме
(2)
конкретной задачи

есть отчеты о розничных продажах с таблицами Товары и Безнал.оплата.
В обеих таблицах есть Суммы S1 - ... - Sn - по товарам
по оплатам (безнал) - Р1 - ... Рm.
Надо проверить оплаты - сложением сумм по товарам. Выявить какие оплаты ошибочно указаны.
Есть ряд допущений: смешанных оплат нет, одинаковые товары не продаются в смену.

Пример: 1, 2, 2, 3, 4 (безнал), 5, 7 (безнал) - без скобок это суммы по товарам, безналом обозначены оплаты.
В данном случае, решением будет 1+3 = безнал 4, 2+5 = 7 безнал
7. Alxby 758 07.07.22 11:13 Сейчас в теме
(3)Не совсем понятно условие. Надо числам 1,2,2,3,5 поставить в соответствие 4 и 7? Причем одна 2 получается лишняя? Т.е. классическая задача упаковки рюкзака?
11. RustIG 07.07.22 11:29 Сейчас в теме
(7) в УТ при закрытии смены сворачиваются продажи по товарам, в том числе оплаты по безналу - но продавцы могут изменить или состав оплат, или состав товаров. Надо проверить как минимум сходятся ли суммы друг с другом. Все оплаты по безналу это дискретные величины сумм товаров. Найти все наборы товаров, чтобы им соответствовали суммы оплат по безналу.
4. RustIG 07.07.22 10:33 Сейчас в теме
(2)
конкретной задачи

есть у меня задача - найти оптимальное решение по анализу и поиску подходящего профиля https://infostart.ru/public/1565697/
хотел на других примерах разобрать решения способом динамического программирования, и возможно применить к данной задаче
8. Alxby 758 07.07.22 11:17 Сейчас в теме
(4)Имеется в виду - найти минимальный набор профилей, в которые нужно включить пользователя, чтобы у него был нужный набор прав? Не больше и не меньше, или только не меньше?
9. RustIG 07.07.22 11:26 Сейчас в теме
(8) нет, не надо минимальный набор искать. Надо найти все подходящие наборы. Только у меня алгоритм перебора (обхода дерева) не оптимальный - на больших данных не хватает памяти и время увеличивается гипермного.
32. Alxby 758 07.07.22 17:43 Сейчас в теме
(9)Интересно бы посмотреть на этот алгоритм. По моим прикидкам алгоритм не должен получиться сложным.
5. the1 1105 07.07.22 10:54 Сейчас в теме
6. Alxby 758 07.07.22 11:09 Сейчас в теме
10. ImHunter 247 07.07.22 11:28 Сейчас в теме
(1) Чего-то мне кажется, что с клиента на сервер не прокинется. Или из основного потока в фоновый.
12. RustIG 07.07.22 11:31 Сейчас в теме
(10) не понял вас. можно решить задачу на обычных формах с параллельным вычислением.https://infostart.ru/1c/articles/1257170/
14. Alxby 758 07.07.22 12:01 Сейчас в теме
(12)Преимущество ФП в том, что используются чистые функции без побочных эффектов, а значит часто можно организовать произвольный порядок их выполнения, в том числе параллельный. Причем занимается этим не программист. Но это не относится к настоящей статье, так как здесь всего лишь частичная эмуляция.
13. Alxby 758 07.07.22 11:53 Сейчас в теме
(10)Вы правы, ОбщийМодуль не сериализуется.
15. ImHunter 247 07.07.22 12:03 Сейчас в теме
(13) Может подумать тогда в сторону синтаксиса:
НоваяФункция(_Операции.Сложить(),10,1);
16. Alxby 758 07.07.22 12:38 Сейчас в теме
(15)Такой вариант убивает всю идею статьи - в Вашем примере первым аргументом в НоваяФункция будет результат функции сложения, а нужна сама функция. В статье это либо ОбщийМодуль, либо массив, содержащий ОбщийМодуль, а он не сериализуется.
17. RustIG 07.07.22 12:47 Сейчас в теме
(16) сами 1с-разработчики типовых решений пошли дальше - завели служебные справочники - например идентификаторов любых объектов метаданных в базе - тоже самое и вы заведите справочник "модули ФП", задайте сколько необходимо модулей и пропишите в них функции и алгоритмы. Далее используйте через свои конструкции кода.
19. Alxby 758 07.07.22 12:55 Сейчас в теме
(17)Не пойдет. Как сохранять функции или модули в справочнике, по имени? Тогда для разыменования нужно Вычислить() или очень большой Если ... ИначеЕсли. А это сделает код еще менее наглядным. Вдобавок для чтения данных из справочника нужно базу дергать постоянно.
22. RustIG 07.07.22 13:01 Сейчас в теме
(19) функции храните в модулях, идентификаторы модулей храните в справочнике
24. Alxby 758 07.07.22 13:04 Сейчас в теме
(22)Т.е. пока в справочник не добавить нужный элемент с идентификатором, функционал работать не будет? И вообще, какие преимущества будут у такого решения?
21. Alxby 758 07.07.22 13:01 Сейчас в теме
(17)Вообще, хранение в базе данных каких-то сущностей, нужных только для обеспечения функционирования системы, как-то плохо пахнет с архитектурной точки зрения. Я сейчас не имею в виду настройки.
23. RustIG 07.07.22 13:02 Сейчас в теме
26. Alxby 758 07.07.22 13:05 Сейчас в теме
(23)не согласен. Это плохое архитектурное решение.
39. the1 1105 08.07.22 11:21 Сейчас в теме
(26) Разработчики типовых операций в БГУ напряглись.
40. Alxby 758 08.07.22 13:30 Сейчас в теме
(39)Не знаком с БГУ, но, боюсь, это не единственный продукт в котором такое встречается.
18. ImHunter 247 07.07.22 12:51 Сейчас в теме
(16) Разве _Операции.Сложить() что-то может сложить?... Сложить не может. Но может вернуть некий контекст с описанием предполагаемой операции.
20. Alxby 758 07.07.22 12:57 Сейчас в теме
(18)Я значит не совсем правильно понял, но в любом случае этот контекст-то и не сериализуется (по крайней мере согласно методике, описанной в статье)
25. ImHunter 247 07.07.22 13:04 Сейчас в теме
(20) Так а кто мешает сделать контекст сериализуемым? Например, он будет возвращать структуру из имени модуля и имени метода обработчика.
27. Alxby 758 07.07.22 13:07 Сейчас в теме
(25)Так конечно можно. Но для разыменования придется использовать Выполнить() или Вычислить() или большой Если...ИначеЕсли, а этого хотелось бы избежать - получается не так красиво
28. Alxby 758 07.07.22 13:16 Сейчас в теме
(27)Вообще говоря, для случая передачи между клиентом и сервером, вариант неплохой - разыменование потребуется в одном-двух местах, и все это обернется другими функциями. Кстати Ваш вариант имеет и еще один плюс - при просмотре в отладчике лучше будет видно имя модуля и имя функции. Но он потребует дополнительных средств для описание контекстов каждой функции.
29. starik-2005 2681 07.07.22 15:28 Сейчас в теме
30. Alxby 758 07.07.22 17:00 Сейчас в теме
31. vld1973 67 07.07.22 17:18 Сейчас в теме
33. kalyaka 824 07.07.22 20:04 Сейчас в теме
Хотя вроде бы есть платформенные функции Выполнить(<Строка>) и Вычислить(<Строка>), с помощью которых можно вызывать функции по имени, но проблем с их использованием столько, что такой подход вряд ли удобен
Можете пояснить, про какие проблемы идет речь? Речь идет про безопасность использования? Низкая производительность? Низкая наглядность или невозможность отладки и потенциальные ошибки в коде?

Идея интересная. Непрактично использовать общие модули как функции. Если снять ограничение на использование Вычислить, можно найти удобное применение: лямбды, абстрактные алгоритмы, абстрактные структуры.
34. Alxby 758 07.07.22 20:32 Сейчас в теме
(33) Вы сами эти проблемы и перечислили, причем сделали это довольно лаконично:). Добавлю только ограничения на работу в веб-клиенте и мобильном на iOS. Тема уже много раз обсуждена, не вижу необходимости описывать еще раз каждую из этих проблем. Да, с Вычислить(), вернее с Выполнить(), можно строить анонимные функции, замыкание только полноценно работать не будет. Но, теоретически, можно написать свой безопасный аналог Выполнить() с возможностью вызывать Выполнить() внутри Выполнить(). В каком-то проекте был у меня пример безопасной обертки над "Вычислить", где в вычисляемой строке проверялось и не допускалось наличие вызовов внешних функций. А что до практичности использования общих модулей в качестве функций - так сама тема публикации нестандартная, все в рамках эксперимента, практичность и красоту никто не обещал.
35. kalyaka 824 07.07.22 21:12 Сейчас в теме
(34) Меньше всего ограничений у функции Вычислить() - только в iOS не поддерживается (интересно, БСП работает на iOS?). А по поводу безопасности - это только в случае исполнения кода, введенного пользователем или когда исполняемый код хранится на клиенте и может быть хакнут. В первом случае требуется дополнительная проверка и в БСП есть для этого методы, а второй не нужно допускать: хранить можно для использования на клиенте, но принимать обратно на сервер нельзя.

Тема уже много раз обсуждена, не вижу необходимости описывать еще раз каждую из этих проблем
Ок, больше не продолжаю, просто полезно знать альтернативные варианты с их недостатками и преимуществами :)
36. Alxby 758 07.07.22 21:25 Сейчас в теме
(35)По поводу безопасности - код может лежать и быть подмененным в базе данных (привет, внешние обработки в справочнике). Да даже файл для загрузки КД2 содержит код обработчиков. У кого-то служба СБ проверяет такой файл перед загрузкой? А ведь загрузка обычно проводится с полными правами. В БСП, по-моему, нет методов проверок опасного кода, если имеется в виду безопасный режим - это про другое. Да и безопасность, это не только про хакинг, но и про банальные ошибки, которые не отловит ни синтаксический контроль, ни АПК с СонарКубом.

полезно знать альтернативные варианты с их недостатками и преимуществами
- Мы не можем ждать милостей от природы 1С, взять их у нее — наша задача (с).
Obertone; +1 Ответить
37. Alxby 758 07.07.22 22:03 Сейчас в теме
(33)Кстати, при использовании Вычислить() может получиться любопытный результат, если совместить подход по созданию функций высшего порядка, описанный в публикации (с учетом замечаний ImHanter), с Вашей статьей об абстрактных массивах.
Obertone; +1 Ответить
38. kalyaka 824 07.07.22 22:21 Сейчас в теме
(37) Да, Ваш вариант выглядит универсальнее и красивее, чем у меня с передачей в абстрактные алгоритмы контекста с параметрами. Вариант с использованием массива как функции с параметрами и вложенными функциями - мне кажется очень перспективным.
Obertone; +1 Ответить
41. Obertone 60 01.08.22 11:40 Сейчас в теме
Здравствуйте, Alxby!

Очень вам благодарен, что вы подняли очень интересную тему с функциями map и reduce.
Я знаю, что ранее поднимали тему с ней, и осталась даже статейка в веб-архиве - там, правда, разбирается подсчёт слов только (https://web.archive.org/web/20150326183324///infostart.ru/public/191786/).

Был ещё по этой теме доклад на хакатоне по 1C «iS THiS DESiGN» «Применение MapReduce в обработке данных 1С» Ильгиза Туальбаева, по нему даже конкретный итог на ГитХабе опубликован: https://github.com/ilgizvip/mapreduce
42. Alxby 758 01.08.22 12:36 Сейчас в теме
(41)Спасибо за ссылки! К сожалению, на мой взгляд имеется всего три подхода к эмуляции ФП или ООП - через общие модули, функцию Выполнить() и через объекты метаданных, например обработки (как в указанной Вами статье). Но, пока 1С не усовершенствует платформенный язык, все это не более чем эксперименты.
Obertone; +1 Ответить
Оставьте свое сообщение

См. также

Как нарисовать граф на 1С Промо

Математика и алгоритмы v8 Абонемент ($m)

Описывается реализация на языке запросов 1С метода расположения вершин графа на плоскости, основанного на использовании электромеханической аналогии. При этом вершины графа представляются одноименными электрическими зарядами, дуги - пружинками. Силы взаимодействия вершин в этой системе переводят их из случайного начального в нужное конечное положение. Приведена обработка рисования графов "ГрафОграф", реализующая данный подход, показывающая также динамику процесса. Граф можно задать списком ребер вручную, выбрать из нескольких предопределенных примеров или сформировать по данным информационной базы.

1 стартмани

09.08.2013    75181    ildarovich    117    

Работа с абстрактным массивом

Математика и алгоритмы Универсальные функции v8 Россия Абонемент ($m)

Абстрактные типы данных и алгоритмы уверенно набирают популярность в языках общего назначения. Встроенный язык 1С является предметно-ориентированным и не спешит развиваться в сторону поддержки абстракций. Однако потребность в них существует, т.к. задачи, решаемые на платформе, не уступают разнообразию из других ЯП. Предлагаю рассмотреть вариант реализации абстрактного массива в 1С.

1 стартмани

07.07.2021    5028    kalyaka    57    

Модель запроса

Универсальные функции v8 v8::Запросы 1cv8.cf Россия Абонемент ($m)

Работа с текстом запроса напрямую не позволяет просто обратиться к определенному полю, таблице или условию. Однако, работая со схемой, можно добавить к существующему условию новое или вообще включить его в состав другой группы. Как ни странно, в типовых решениях часто можно встретить код работы с текстом запроса наряду с использование схемы. Возможно появление удобной библиотеки или нового объектного подхода позволит отказаться от работы с текстом совсем, а код построения запроса будет аутентичен исходному запросу, но без избыточности и доступный для простой модификации.

1 стартмани

01.03.2021    3929    kalyaka    25    

Строковые отборы в 1С

Универсальные функции v8 1cv8.cf Абонемент ($m)

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

2 стартмани

14.12.2020    5960    lastcontra    4    

Простой способ индексирования интервалов Промо

Математика и алгоритмы v8 Абонемент ($m)

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

1 стартмани

28.09.2016    43150    ildarovich    22    

Сохранение настроек колонок

Работа с интерфейсом Универсальные функции v8 Абонемент ($m)

Сохранение настроек колонок табличных полей. Получение имени формы из модуля формы. Для обычных форм.

1 стартмани

10.07.2020    2133    Arc    1    

Склонение словочетаний

Универсальные функции v8 1cv8.cf Абонемент ($m)

Рассмотрены возможные инструменты для склонения словосочетаний разных форм: ФИО, произвольные слова, слова с числительными и разными форматами чисел.

1 стартмани

22.06.2020    2701    PeskovOleg    1    

Универсальные функции: разложение произвольной строки адреса в структуру

Универсальные функции v8 1cv8.cf Абонемент ($m)

Процедуры и функции раскладывают произвольную строку адрес в структуру по ключевым словам.

1 стартмани

30.12.2019    6867    vik070777    12    

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов Промо

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    40107    rpgshnik    60    

Полное копирование одной формы в другую

Универсальные функции v8 1cv8.cf Абонемент ($m)

Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде "покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал". Тем не менее, мне стало интересно, как это можно сделать.

1 стартмани

03.10.2019    9992    nekit_rdx    25    

Запуск фонового задания во внешней обработке. Отключение предупреждений защиты от опасных действий в фоновом задании

Универсальные функции v8 1cv8.cf Абонемент ($m)

Как запустить фоновое задание из модуля внешней обработки используя БСП. Как отключить безопасный режим и сообщения защиты от опасных действий независимо от профиля безопасности пользователя в фоновом задании во внешней обработке.

2 стартмани

24.08.2019    21017    BenGunn    26    

10 способов получить модуль числа (а может, и больше)

Математика и алгоритмы Универсальные функции v8 1cv8.cf Абонемент ($m)

Пишем функцию вычисления модуля числа. Сколько способов существует? Давайте посчитаем!

1 стартмани

11.07.2019    19898    sam441    35    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

Универсальные функции HighLoad оптимизация Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    52748    DarkAn    87    

Работа с графической схемой в объектной модели DOM

Универсальные функции v8 v8::УФ Абонемент ($m)

Пример кода для работы с графической схемой в объектной модели DOM, платформа 8.3.12.

1 стартмани

04.06.2019    8660    botokash    19    

Картинки во внешней печатной форме (Шапка и табличная часть)

Универсальные функции v8::ОУ v8::УФ УТ11 Россия Абонемент ($m)

Способы вывести на печать картинку в шапке и в табличной части внешней печатной формы. Управление торговлей, редакция 11 (11.4.7.150).

1 стартмани

27.05.2019    22916    Povinger    6    

Агрегатное суммирование строк в запросе – сложно, но не невозможно Промо

Математика и алгоритмы v8 Абонемент ($m)

Описывается метод соединения строк из одной колонки таблицы в единую результирующую строку в запросе на языке 1С. Метод сложный и по сравнению с внезапросной техникой представляет больше спортивный, чем практический интерес.

1 стартмани

09.09.2013    89387    ildarovich    57    

Корректировка движений документа

Универсальные функции v8 1cv8.cf Абонемент ($m)

Корректировка движений документа после его проведения по типовому алгоритму.

1 стартмани

26.05.2019    8684    rutadmeen    1    

Создание внешней печатной формы в формате документа Word

Адаптация типовых решений Универсальные функции v8 1cv8.cf Абонемент ($m)

В статье написано, как создать внешнюю печатную форму (для конфигураций с БСП) в формате Word.

1 стартмани

17.05.2019    31656    ВикторП    27    

Программное формирование картинки в 1С:Предприятие 8.3.9 (ПотокВПамяти / ЗаписьДанных)

Универсальные функции v8 1cv8.cf Абонемент ($m)

В статье представлен код программного формирования картинки (двоичные данные) без всяких внешних компонент, без формирования строки Base64, используя лишь встроенные механизмы 1С предприятие 8.3.9 (объекты ПотокВПамяти и ЗаписьДанных). Сам по себе код формирования картинки не несёт ничего нового. Всё описано в википедии. Захотелось попробовать новые методы, но никак не доходитили руки. В приложении обработка практически с этим же кодом.

1 стартмани

16.05.2019    12441    yku    11    

Пример преобразования дерева значений в таблицу значений и обратно в 1Cv8 Промо

Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно. Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее в табличных частях документа, а также в интерактивной обработке данных в виде дерева. Отсюда появился небольшой модуль для расширения возможности работы с деревом значений, хотя и с некоторыми оговорками. Основной идеей является использование двух ключевых реквизитов/колонок КлючСтроки и КлючСвязи. Однако они не всегда необходимы. Код, на мой взгляд достаточно "высушен". Цель публикации - поделиться с новичками опытом.

1 стартмани

09.08.2010    99769    Sintson    68    

Собственный алгоритм нумерации документов определенного вида

Математика и алгоритмы v8 БП3.0 Россия Абонемент ($m)

Создание собственного, отличного от платформенного алгоритма нумерации документов определенного вида.

1 стартмани

11.04.2019    5705    xan333    12    

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

Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

28.03.2019    10632    alexey.kutya    26    

Доработка функции ОбщегоНазначения.ЗаменитьСсылки для автоматической чистки или свёртки табличных частей

Универсальные функции v8 Абонемент ($m)

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

1 стартмани

12.09.2018    4580    albert.goncharov    0    

Ускорение для Клиент-Банка Промо

Банковские операции Обмен с банком Универсальные функции v8 1cv8.cf Абонемент ($m)

У вас много платежей и клиент-банк долго их читает? Есть проверенная практикой идея, как это ускорить.

1 стартмани

08.10.2012    24155    Yashazz    15    

Основы компьютерной графики (Часть 2)

Математика и алгоритмы Работа с интерфейсом v8::УФ 1cv8.cf Россия Абонемент ($m)

Статья является продолжением публикации "Основы компьютерной графики". Во второй части будут рассмотрены следующие темы: 1. Преобразования в трехмерном пространстве. 2. Ортографическая проекция трехмерного изображения на экран. 3. Определение, какой поверхностью (лицевой/задней) проецируется грань на экран. 4. Перспективная проекция.

1 стартмани

03.08.2018    6561    HAMMER_59    13    

Основы компьютерной графики

Математика и алгоритмы Работа с интерфейсом v8::УФ 1cv8.cf Абонемент ($m)

Статья предназначена для тех, кто совсем не знаком с компьютерной графикой. В статье даны следующие преобразования: перемещение, поворот, масштабирование, проекцирование, переход между различными системами координат. Пример работы с графикой реализован во внешней 1С обработке.

1 стартмани

30.07.2018    8430    HAMMER_59    39    

Любое число больше 7 можно разложить на сумму троек и пятерок

Математика и алгоритмы v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

Наткнулся в интернете на школьную задачу: "Докажите, что любое число больше 7 можно представить в качестве суммы чисел 3 и 5". Представляю решение на 1С. (есть рекурсия, пример работы с событием ИзменениеТекстаРедактирования).

1 стартмани

06.07.2018    6802    Eskimos    6    

INFOSTART EVENT 2012: разбор решений конкурса разработчиков Промо

Математика и алгоритмы Запросы v8 1cv8.cf Абонемент ($m)

В статье проводится разбор присланных решений на конкурс разработчиков от компании "Первый БИТ". Приводятся планы выполнения запросов и сравниваются показатели быстродействия и оптимизации.

1 стартмани

25.12.2012    15840    krolya    49    

Пропорциональное распределение в запросе

Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

28.06.2018    13112    invertex    8    

Итераторы выборки

Математика и алгоритмы v8 Россия Абонемент ($m)

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

1 стартмани

16.05.2018    9916    kalyaka    10    

Строим "фасады" в 1С

Математика и алгоритмы v8 Россия Абонемент ($m)

Как реализовать функционал, чтобы не было “мучительно больно” при расширении требований.

1 стартмани

04.05.2018    18511    ktb    41    

115 полезностей от Буравова Андрея по курсу СКД Евгения Гилёва Промо

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

Посмотрел 5,5 часовой курс по системе компоновки данных. Нашел невероятное количество не только необходимого, но и примеры не очевидного поведения СКД. У многих не хватает времени и терпения досмотреть курс до конца. Прочитав 115 полезностей, вы сможете понять в каком уроке освещен интересующий вас вопрос и быстро открыть его, чтобы посмотреть видео.

1 стартмани

08.04.2012    43465    Flashill    70    

Заполнение справочника с изображениями элементами по умолчанию

Универсальные функции Файловые протоколы обмена (TXT, XML, DBF), FTP v8 Абонемент ($m)

Пример одного из решений, как можно заполнить справочник с изображениями значениями по умолчанию включая сами изображения. Сами изображения взяты из программы MapSource 6.16.3. Данные для загрузки хранятся в макете в формате XML.

1 стартмани

26.03.2018    9121    Kim1C    0    

Внешняя печатная форма с вводом параметров через дополнительную форму

Инструментарий разработчика Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

Удобный ввод параметров в печатную форму с помощью дополнительной формы

1 стартмани

23.03.2018    34400    Margo462    23    

Случайность, совпадение, закономерность. Генератор случайных чисел

Математика и алгоритмы Игры v8 1cv8.cf Абонемент ($m)

Объект ГенераторСлучайныхЧисел удобно выдает случайные числа в заданном интервале значений. Исследование особенностей, рассуждения на тему случайных чисел, практика применения. Увлекательно в игровой форме можно исследовать работу генератора случайных чисел.

1 стартмани

20.01.2018    49956    Ликреонский    60    

Сохранение реквизитов и табличных частей объектов в XML Промо

Универсальные функции Файловые протоколы обмена (TXT, XML, DBF), FTP v8 1cv8.cf Абонемент ($m)

Пример того, как можно сохранять и загружать объекты 1С методами встроенных объектов ЗаписьXML и ЧтениеXML.

1 стартмани

25.11.2011    24064    saiten    21    

Черпаем простые числа решетом Аткина

Математика и алгоритмы Запросы v8 Абонемент ($m)

Предложен способ увеличения быстродействия запроса поиска простых чисел с помощью "решета Аткина".

1 стартмани

09.01.2018    9513    scientes    7    

Работа с кодами - числами, датами, кодами справочников, номерами документов, идентификаторами в 1С и в других базах данных

Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

Поддерживается преобразование Кодов на основе Алфавитов, в том числе ''блочных" кодов - состоящих из блоков (подстрок) одинаковой длины (например: 8, 16, 32-битные коды, Хэши и т.п.). Функции доступны на Клиенте и на Сервере. Демо-примеры сделаны на управляемых формах. Тестировалось на платформах серии 8.3.10.

1 стартмани

28.11.2017    7991    newold2    1    

Преобразование массива структур в дерево значений. Представление массива подчиненных друг другу "объектов" в иерархическом виде без использования рекурсии

Математика и алгоритмы v8 Абонемент ($m)

Задача преобразовать массив некоторых структур в дерево значений возникла, когда я получил JSON от сервиса о структуре папок пользователя. А именно строка JSON была получена через API Google Drive, когда пользователю предлагается выбрать одну из его папок. При преобразовании JSON у меня получился массив структур, в которых есть некоторый ключ уникальности и ключ родителя-структуры. Предлагаю ознакомиться с алгоритмом не использующую рекурсию, который достаточно быстро создает дерево значений, для последующего показа пользователю.

1 стартмани

07.11.2017    13875    Arxxximed    15    

Github и 1С. Пошаговая инструкция на конкретном примере

Математика и алгоритмы v8 Абонемент ($m)

Статья для тех, у кого есть неудержимое желание программировать и хочется доработать какую-то конфигурацию (или проект на 1С), выложенный на Github, но останавливают незнакомые слова Git, Github, Fork, Commit, Pull request, Merge, Issue.

1 стартмани

26.10.2017    53224    BlizD    55    

Выбор файла и загрузка его на сервер в асинхронном режиме

Универсальные функции v8 1cv8.cf Абонемент ($m)

Несколько библиотечных процедур, упрощающих жизнь разработчика при отключенном режиме модальности.

1 стартмани

22.10.2017    42437    json    5    

Размеры управляемой формы

Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

Как рассчитать ширину и высоту управляемой формы или отдельного элемента, чтобы адаптировать интерфейс программно при их изменении.

1 стартмани

08.10.2017    31801    json    9    

Сборка автомата (с примерами)

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

Посмотрим, нужен ли 1снику автомат, как его собрать и где это может пригодиться.

1 стартмани

19.09.2017    14895    pm74    45    

Читаем *.bmp напрямую в ТабДок двоичными данными

Файловые протоколы обмена (TXT, XML, DBF), FTP Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

После полученного интереса к публикации http://infostart.ru/public/601635/ о одном из способов формирования изображений в 1С я решил продолжить изучать другие возможности "рисования" в 1С. Естественно, самым простым форматом после svg будет старый добрый растр в bmp. Но когда приступил к написанию - понял, что формировать картинку с "0", наверное, будет нечестно по отношению к читателю, и для начала нужно разобрать, что такое bmp как формат, как его читать и, главное, показать примеры работы с новыми механизмами платформы.

1 стартмани

12.04.2017    11215    kot-stas    11    

Функция преобразования промежутка времени в строку

Универсальные функции v8 1cv8.cf Россия Абонемент ($m)

Функция предназначена для преобразования промежутка времени в строку с разбивкой по годам, дням, часам, минутам, секундам.

1 стартмани

23.09.2016    10336    vovant    1    

Степень сходства двух наименований справочника

Математика и алгоритмы v7.7 v8 Абонемент ($m)

Статья посвящена исследованию следующего вопроса: необходимо сравнить 2 наименования справочников с целью вычисления их степени сходства. По задумке, степень сходства должна выражаться в процентах.

1 стартмани

25.02.2015    22724    etmarket    43