Если хочется функционального программирования с функциями высшего порядка и 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
3
.dt 52,43Kb 3 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1651 07.07.22 10:02 Сейчас в теме
А есть пример(ы) решения задачи динамического программирования?
2. Alxby 938 07.07.22 10:14 Сейчас в теме
(1)Можно попробовать, но так как не получается красивой рекурсии, то вряд ли решение будет элегантным. Не уверен, что на это нужно тратить время при отсутствии конкретной задачи, разве что для развлечения :).
3. RustIG 1651 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 938 07.07.22 11:13 Сейчас в теме
(3)Не совсем понятно условие. Надо числам 1,2,2,3,5 поставить в соответствие 4 и 7? Причем одна 2 получается лишняя? Т.е. классическая задача упаковки рюкзака?
11. RustIG 1651 07.07.22 11:29 Сейчас в теме
(7) в УТ при закрытии смены сворачиваются продажи по товарам, в том числе оплаты по безналу - но продавцы могут изменить или состав оплат, или состав товаров. Надо проверить как минимум сходятся ли суммы друг с другом. Все оплаты по безналу это дискретные величины сумм товаров. Найти все наборы товаров, чтобы им соответствовали суммы оплат по безналу.
4. RustIG 1651 07.07.22 10:33 Сейчас в теме
(2)
конкретной задачи

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

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

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

полезно знать альтернативные варианты с их недостатками и преимуществами
- Мы не можем ждать милостей от природы 1С, взять их у нее — наша задача (с).
Obertone; +1 Ответить
37. Alxby 938 07.07.22 22:03 Сейчас в теме
(33)Кстати, при использовании Вычислить() может получиться любопытный результат, если совместить подход по созданию функций высшего порядка, описанный в публикации (с учетом замечаний ImHanter), с Вашей статьей об абстрактных массивах.
Obertone; +1 Ответить
38. kalyaka 870 07.07.22 22:21 Сейчас в теме
(37) Да, Ваш вариант выглядит универсальнее и красивее, чем у меня с передачей в абстрактные алгоритмы контекста с параметрами. Вариант с использованием массива как функции с параметрами и вложенными функциями - мне кажется очень перспективным.
Obertone; +1 Ответить
41. Obertone 66 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 938 01.08.22 12:36 Сейчас в теме
(41)Спасибо за ссылки! К сожалению, на мой взгляд имеется всего три подхода к эмуляции ФП или ООП - через общие модули, функцию Выполнить() и через объекты метаданных, например обработки (как в указанной Вами статье). Но, пока 1С не усовершенствует платформенный язык, все это не более чем эксперименты.
Obertone; +1 Ответить
Оставьте свое сообщение

См. также

АВС-анализ и табличное программирование

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Абонемент ($m)

Представлен простейший алгоритм решения задачи АВС-анализа. На данном примере продемонстрирован метод табличного программирования, описанный в книге "Совершенный код. Мастер-класс", автор Стив Макконнелл.

2 стартмани

16.12.2022    1936    RustIG    6    

15

Если хочется низко-низкоуровневого программирования с битами и байтами

Математика и алгоритмы Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

01.12.2022    735    Alxby    16    

9

Как передать Таблицу Значений в Динамический Список?

Механизмы платформы 1С Универсальные функции Платформа 1С v8.3 Абонемент ($m)

До версии 8.3.9 ответ однозначен - никак. Потом были добавлены временные таблицы для динамических списков, но официальный ответ остался неизменным - никак. Ну а если очень надо?

1 стартмани

17.10.2022    3104    Dementor    9    

20

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

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

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

1 стартмани

07.07.2021    6325    kalyaka    57    

31

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

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

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

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

1 стартмани

01.03.2021    4837    kalyaka    26    

47

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

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

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

2 стартмани

14.12.2020    9102    lastcontra    4    

0

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

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

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

1 стартмани

10.07.2020    2601    Arc    1    

4

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

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

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

1 стартмани

22.06.2020    3439    PeskovOleg    1    

3

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

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

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

1 стартмани

30.12.2019    7742    vik070777    12    

18

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

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

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

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

1 стартмани

03.10.2019    11310    nekit_rdx    26    

36

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

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

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

2 стартмани

24.08.2019    23824    BenGunn    29    

130

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

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

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

1 стартмани

11.07.2019    25044    sam441    36    

54

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

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

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

1 стартмани

04.06.2019    8822    botokash    19    

51

Распознавание и загрузка документов в 1С Промо

Универсальная программа-обработка для распознавания любых сканов или фото первичных документов в 1С (счета-фактуры, УПД, ТТН, акты и тд). Точность распознания до 98%.

от 11 рублей

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

Универсальные функции Оперативный учет Управляемые формы 1С:Управление торговлей 11 Россия Абонемент ($m)

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

1 стартмани

27.05.2019    27385    Povinger    12    

26

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

Универсальные функции Корректировка данных Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

26.05.2019    10986    rutadmeen    1    

5

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

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

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

1 стартмани

17.05.2019    37986    ВикторП    28    

67

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

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

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

1 стартмани

16.05.2019    13531    yku    11    

67

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

Математика и алгоритмы Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

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

1 стартмани

11.04.2019    6819    xan333    12    

5

Видеокурс-практикум: как подготовить и написать ТЗ, ЗНР, ЧТЗ. Промо

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

3 500 рублей

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

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

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

1 стартмани

28.03.2019    11224    alexey.kutya    26    

7

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

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

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

1 стартмани

12.09.2018    4703    albert.goncharov    0    

5

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

Математика и алгоритмы Работа с интерфейсом Управляемые формы Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

03.08.2018    6935    HAMMER_59    13    

14

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

Математика и алгоритмы Работа с интерфейсом Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

30.07.2018    8756    HAMMER_59    39    

25

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

Математика и алгоритмы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

06.07.2018    7144    Eskimos    6    

6

Работа с 1С:Аналитика Промо

Онлайн-курс предусматривает изучение возможностей системы “1С:Аналитика”, которая работает как составная часть платформы “1С:Предприятие” и обеспечивает оперативный просмотр и анализ необходимых данных.

4500 рублей

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

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

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

1 стартмани

28.06.2018    13432    invertex    8    

38

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

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

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

1 стартмани

16.05.2018    10334    kalyaka    10    

9

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

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

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

1 стартмани

04.05.2018    18866    ktb    41    

66

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

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

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

1 стартмани

26.03.2018    9223    Kim1C    0    

2

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

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

Математика и алгоритмы Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

01.02.2018    41025    rpgshnik    60    

136

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

Математика и алгоритмы Игры Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

20.01.2018    56138    Ликреонский    61    

8

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

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

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

1 стартмани

09.01.2018    9686    scientes    7    

8

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

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

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

1 стартмани

28.11.2017    8155    newold2    1    

2

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

Математика и алгоритмы Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

07.11.2017    14536    Arxxximed    15    

11

1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо

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

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

Математика и алгоритмы Платформа 1С v8.3 Абонемент ($m)

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

1 стартмани

26.10.2017    55750    BlizD    61    

275

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

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

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

1 стартмани

22.10.2017    45707    json    5    

51

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

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

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

1 стартмани

08.10.2017    33380    json    10    

112

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

Математика и алгоритмы Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

19.09.2017    15201    pm74    45    

38

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

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

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

26.05.2017    53747    DarkAn    87    

196