Функциональное программирование на 1С - миф или реальность?

25.02.17

Разработка - Рефакторинг и качество кода

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

Скачать исходный код

Наименование Файл Версия Размер
Donat (1) 1Cv8_OOP_FuncProgramming.rar
.rar 13,89Kb
103
.rar 13,89Kb 103 Скачать бесплатно

Идея реализовать подобную возможность пришла ко мне в ходе освоения замечательного языка Pythоn.. и изначально я думал написать транслятор 1С <=> Python, но бесшовного способа вызывать код Python'а из 1С и получать результаты вычислений обратно - никак не находилось (кстати, если кто видел удачную интеграцию 1С и Python - поделитесь наработками или ссылками, может быть тоже получится что интересное)..

Несколько позже я поближе познакомился на githab'е  1C_Script и его расширениями языка - что позволяло импортировать внешние библиотеки.. и вроде бы всё замечательно, но всё же меня никак не покидала мысль - что 1С'у всё же было-бы гораздо больше пользы, если добавить в язык "удобностей", дабы писать в ООП- и функциональной парадигме .. 

Я стал экспериментировать и искать способ, как бы приспособить то, что есть в платформе под ООП подход и обнаружил, что в качестве классов удобнее всего использовать обычные формы (не открывая их). Через некоторое время обнаруженные приёмы помогли мне отрефакторить сложную обработку.. Потом заказчик захотел запускать алгоритм в фоновом задании - а формы в таком контексте недоступны :((

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

После я несколько раз пытался сделать заметку о том, что у меня получилось - но конец года порадовал кучей проблем и полным отсутствием свободного времени.. однако, я  продолжал использовать найденный подход - и он мне всё больше нравился.. Наконец, достаточно освоившись с эмуляцией ООП, захотелось попробовать сделать собственные функции-объекты..ведь если бы функции были бы объектами - т.е. их можно было бы присваивать переменным - и умели бы принимать в качестве аргуметов - другие функции - то было бы совсем интересно (до этого меня совершенно очаровал python - замечательный мультипарадигменный язык, попробовав который - хочеться делать подобные безобразия постоянно)..

Ну и - долго ли, коротко ли - на этих праздниках выпало время, которое я потратил на реализацию своих грязных фантазий :))

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

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

PS  Конечно, написанное за 2 дня приложение с такими извращениями - глюкавый прототип.. но он работает, судя по примерам..

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

Жду отзывов и надеюсь на интерес. Что думаете, коллеги?

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

ООП функциональное программирование парадигма

См. также

Результаты ревью кода 1500+ решений каталога Инфостарт: наиболее частые ошибки разработчиков в коде

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поделюсь своим опытом аудита кода авторских продуктов с Infostart.ru как одним из элементов применения DevOps-практик внутри Инфостарт. Будет настоящий код, боевые скриншоты, внутренние мемы от команды ИТ-лаборатории Инфостарт и прочее мясо – все, что любят разработчики.

10.04.2024    5342    artbear    77    

74

Ниндзя-код

Рефакторинг и качество кода Платформа 1С v8.3 Россия Бесплатно (free)

Предлагаю вашему вниманию советы мастеров древности. Программисты прошлого использовали их, чтобы заострить разум тех, кто после них будет поддерживать код. Гуру разработки при найме старательно ищут их применение в тестовых заданиях. Новички иногда используют их ещё лучше, чем матёрые ниндзя. Прочитайте их и решите, кто вы: ниндзя, новичок или, может быть, гуру? (Адаптация статьи "Ниндзя-код" из учебника JavaScript)

01.04.2024    2305    DrAku1a    15    

33

Практическое программирование: когда скорость важнее совершенства

Рефакторинг и качество кода Бесплатно (free)

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

01.04.2024    596    Prepod2003    6    

2

Когда понадобился новый оператор

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда понадобился новый оператор, но его нет в синтакс-помощнике, что делать?

18.03.2024    1352    ZhokhovM    4    

4

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

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда разработчик платформы решил пойти на кухню за кофе, а проверку препроцессоров не добавил, и вот тут-то и началось: "Что, опять все сломалось? Ну и кофе же я забыл сделать!".😅

18.03.2024    3002    ZhokhovM    4    

9

Реструктуризация - бесконечная история

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

При разработке программ требуемый функционал ставят на первое место, но есть еще и архитектура программы. На горизонте 5-10 лет она становится важнее функционала, который должен работать при масштабировании и росте данных. Реструктуризация 5 терабайтной базы 1С 8.2 в формат 1С 8.3, складывает весь пазл архитектурных просчетов, которые сделали ради функционала. Как это исправить? - для разработки правильной архитектуры, нужно всего лишь сместить фокус с функционала и подумать о «вечном».

29.09.2023    2077    1CUnlimited    15    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. capone 24 25.02.17 10:59 Сейчас в теме
хм... я тоже люблю python, но субъективно - все это извращение ради извращения
+
3. kote 536 25.02.17 11:57 Сейчас в теме
(1) может быть.. но тема препроцессоров и трансляторов в современном Computer Science - одна из самых востребованных.. особенно это в сообществе JS заметно.. количество языков и диалектов транслирующихся в JS - уже перевалило за полсотни, то же и с CSS..

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


+
18. Aphanas 92 26.02.17 00:53 Сейчас в теме
(3) Автор, опиши принцип действия. Скачивать и ковыряться в коде нет никакого желания.
for_sale; +1
118. pvlunegov 157 15.04.20 07:35 Сейчас в теме
(3) Это не извращение а попытка улучшить инструмент которым программист пользуется каждый день.
Поддерживаю автора.
В прошлом так же пытался реализовать концепцию ООП в 1с но не смог дойти до этого.
+
116. nicxxx 254 30.06.17 14:16 Сейчас в теме
что-то не работает.
добавил функцию
Функция УмножитьНа2(чтоУмножаем)

	Рез = чтоУмножаем*2;
	Возврат Рез;
	
КонецФункции


и получаю ошибку "Ошибка компиляции при вычислении выражения или выполнении фрагмента кода: {(51,10)}: Тип не определен (С)"

и код неправильно отрегэкспился:

Степень = ЭтотОбъект.Параметры["Степень"];
Мап = ЭтотОбъект.Параметры["Мап"];
УмножитьНа2 = ЭтотОбъект.Параметры["УмножитьНа2"];

// Первая функция - берет Число и возводит его в Степень..

// Функция Степень(мЧисло, мСтепень = 3)
// 	Рез = мЧисло;
// 	Для НН=1 По мСтепень Цикл
// 		Рез = Рез * мЧисло;
// 	КонецЦикла;
// 	Возврат Рез;
// КонецФункции

// Вторая функция - берет Список и к каждому его элементу применяет ОбъектФункцию

// Функция Мап(ОбъектФункция, Список)
// 	МассивРезультат = Новый Массив;
// 	Для Каждого Эл Из Список Цикл
// 		Отображение = ОбъектФункция(Эл); // степень будет 3-я
// 		МассивРезультат.Добавить(Отображение);
// 	КонецЦикла;
// 	Возврат МассивРезультат;
// КонецФункции


// Функция УмножитьНа2(чтоУмножаем)
// 
// 	Рез = чтоУмножаем*2;
// 	Возврат Рез;
// 	
// КонецФункции

// Собственно, сама программа выглядит следующим образом..

мМассив = Новый Массив;

мМассив.Добавить(1);
мМассив.Добавить(2);
мМассив.Добавить(3);
мМассив.Добавить(5);
мМассив.Добавить(10);
мМассив.Добавить(100);
мМассив.Добавить(1000);

// .. а тут нам возвращается новый массив, после возведения каждого его элемента в степень..
мРезультаты =  

// ОбъектнаяФункция / подмена {
		Мап.__Вызвать__(
			Новый С 

// ОбъектнаяФункция / подмена {
		УмножитьНа2.__Вызвать__(
			Новый Структура("чтоУмножаем", Эл),  // список параметров
			ЭтотОбъект.Параметры // передача контекста
		)
// }
тФункция, Список", Степень, мМассив),  // список параметров
			ЭтотОб 

// ОбъектнаяФункция / подмена {
		УмножитьНа2.__Вызвать__(
			Новый Структура("чтоУмножаем", Эл),  // список параметров
			ЭтотОбъект.Параметры // передача контекста
		)
// }
// передача контекста
		)
// }
;	

Для Каждого Эл Из мРезультаты Цикл
	Эл=УмножитьНа2(Эл);
КонецЦикла;

Для Каждого Эл Из мРезультаты Цикл
	Сообщить(Эл);
	Эл=УмножитьНа2(Эл);
	Сообщить(Эл);
КонецЦикла;


~___МеткаВозврат____:
Показать
+
2. пользователь 25.02.17 11:46
Сообщение было скрыто модератором.
...
4. kote 536 25.02.17 12:05 Сейчас в теме
(2) эта тема программистам интересна. Так что можете не качать.
pvlunegov; +1
5. DenisCh 25.02.17 12:08 Сейчас в теме
(4) Это не тема. Это извращение.
Попытки эмулировать функциональщину на процедурных языках - просто смешны.

И да, лямбды в 1с не нужны. И ООП тоже.
6. vcv 89 25.02.17 12:29 Сейчас в теме
Надо же! ООП на восьмёрке! Ну трудитесь, трудитесь. Глядишь, лет через десять до уровня 7.7 с 1С++ разовьётесь :) :) :)
+
35. O-Planet 6432 26.02.17 22:57 Сейчас в теме
(6) 1C++ - шедевр. Нужно большинству теперешних обитателей инфостарта стоя произносить эту аббревиатуру.

По теме - зачот. Нужное.
pvlunegov; +1
7. vcv 89 25.02.17 12:35 Сейчас в теме
Подобная попытка расширить язык 1С давно не первая. И все они страдают еще большими, чем штатный язык 1С, проблемами с контролем и валидацией кода. Лучше бы вместе собраться и продавить 1С, что бы сделали опциональную жесткую типизацию, выдачу ошибок при использовании неинициализированной переменной, изменении типа значения переменной и т.п.
CyberCerber; Yashazz; Brawler; neikist; +4
8. webester 26 25.02.17 13:29 Сейчас в теме
>>Один из способов заявить о такой потребности - это использовать такие вот "извращения"...
Использование извращений ради извращений, это не заявление. Это вообще не о чем. Вы на этих извращениях торговлю напишите или зарплату и когда окажется, что с помощью ваших извращений пишется стройный и красивый код. Когда ваш код начнут цитировать на форумах, вот тогда есть все шансы, что разработчики к вам прислушаются. А в таком ключе... вангую 4 скачивания. Не в том плане, что бы вам обидно, а в том плане, что это мало кому действительно интересно.
Euroset1; kote; +2
9. kote 536 25.02.17 14:28 Сейчас в теме
(8)

Насчёт скачиваний - мне совсем не обидно :) на самом деле мне не дали разместить ссылку на бесплатное скачивание этого примера, т.к. на Инфостарте правила, увы, совсем уже стали "жёсткими".. с другой стороны - я подумал о том же, что и Вы - это позволит оценить интерес к теме (т.е. увидеть, кому это действительно интересно).

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


У меня после каждого переключения из python в 1С - что-то вроде ломки :))) Не знаю, сколько человек испытывают подобные ощущения - но очень хотелось бы, чтоб язык как-то развивался. Со времён 7-ки - ничего не изменилось.. причем, с ней обратной совместимости не было - какой смысл было "замораживать" язык - непонятно..и да 1С++ - до сих пор выглядит куда более продвинутым решением.. ну как же так?

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

И всё таки Ваше мнение непонятно.(нет, понятно, что все уже и не ждут от 1С ничего в этом направлении..) Но всё же - нужно в 1С все это или нет?
pvlunegov; sashocq; botokash; yur4ik9408; +4
11. webester 26 25.02.17 17:17 Сейчас в теме
(9)
У меня после каждого переключения из python в 1С - что-то вроде ломки :)))

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

(9)
Но всё же - нужно в 1С все это или нет?

Я говорю, совершенно непонятно в каком это месте могло бы быть нужно. Это у вас как у автора надо спросить. То есть вы бы могли взять и наваять простую конфигурацию которая бы раскрывала, красоту подхода. Не хватает реализации конкретных задач. в семерошном 1С++ я видел красивый код, который просто в 77 так красиво и самое главное, эффективно не сделаешь. То есть он решал реальные задачи. У вас пока это выглядит как "Смотрите я могу кончиком языка до носа дотянуться". Оно то конечно круто, но как-то... зачем?
+
14. kote 536 25.02.17 18:17 Сейчас в теме
(11)
Я написал на питоне вот это. Не сказать, что это, что то невероятное, но в какой то мере погрузиться в него пришлось.


У Вас там неработающая ссылка.. пример посмотреть не удалось.
+
20. webester 26 26.02.17 02:43 Сейчас в теме
(14)
У Вас там неработающая ссылка.. пример посмотреть не удалось.
Странно. У меня ссылка работает. Напишу текстом https://1c-cod.ru/ это не кусок кода, это ссылка на работающий проект, который написан целиком на питоне gae + flask + местный nosql
kote; +1
10. vcv 89 25.02.17 16:05 Сейчас в теме
Со времён 7-ки - ничего не изменилось.. причем, с ней обратной совместимости не было - какой смысл было "замораживать" язык - непонятно..

А оно как-то принципиально надо? ООП в 1С. Функциональщина. Каковы ваши доводы за то, что оно необходимо языку 1С?

если у конкурентов строк меньше, а возможностей - больше

Кого вы считаете конкурентом для 1С? Явно же не Питона. 1С - специализированный, предметноориентированный язык. Конкурентом для него можно считать, например, ABAP. Разве в ABAP есть ООП? Формально, вроде, есть. По крайней мере классы с инкапсуляцией. Остальных китов ООП, если не ошибаюсь, не наблюдается. Так что, по фактур, ООП нет. Функционального программирования в ABAP нет в принципе. Кто еще из конкурентов?
1С_Мастер; Vovan1975; kote; Сурикат; +4 4
12. kote 536 25.02.17 17:30 Сейчас в теме
(10) Axapta/Navision - язык Х++, есть ООП
системы на СУБД Cache - тоже предметноориентированы, есть ООП,
про SAP (язык ABAP) Вы сами упомянули,
разве что в Oracle для разработчиков бизнес-решений вроде как нет ООП.. но по факту - когда нужно что-то, чего нет их BusinesSuite - берётся Java и пилится расширение (ну какое Java без ООП?)

Из отечественных платформ - посмотрите на Ultimate (там С# со всеми вытекающими - https://www.ultimatebusinessware.ru/).. Конечно, очень дорогое решение, но мы ведь не об этом, не так ли?


(10)
Формально, вроде, есть. По крайней мере классы с инкапсуляцией.


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

Хотя, как по мне - вот этот новый механизм "расширений конфигурации" - суть костыль, родившийся из-за отсутствия наследования/полиморфизма в языке. Это же попытка реализации этих преимуществ ООП.. Не согласны?

И вот еще - очень интересная история про то, что наследование - отдельно, ООП - отдельно. Очень интересные пруфы, на мой взгляд - (1) http://jug.ru/2016/09/bugayenko-west/ (" Есть класс млекопитающих, класс птиц, а потом сталкиваешься с утконосом, и всё ломается.."),

Ну и про композицию - достаточно наглядно (даже для тех, кто плохо знает английский) - https://www.youtube.com/watch?v=wfMtDGfHWpA&t=1s
sashocq; +1
16. vcv 89 25.02.17 20:54 Сейчас в теме
(12)
Хотя, как по мне - вот этот новый механизм "расширений конфигурации" - суть костыль, родившийся из-за отсутствия наследования/полиморфизма в языке. Это же попытка реализации этих преимуществ ООП.. Не согласны?

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

Местами, конечно... В качестве синтаксического сахара для каких-то мелочей ООП бы пригодился.
/*Личное субъективное мнение*/ Но, за много лет программирования в 1С, как-то не возникало желания использовать "объекты" шире, чем предусмотрено штатно - базовый объект Документ и унаследованный от него объект КонкретныйДокумент. Хотя, наверное, могло бы возникнуть, опыта в С++, С# и Delphi тоже лет много.

(13)
Ну а если хотите примера - может вот так подойдёт?

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

По читабельности, кстати, вариант 1С, при всей его дубовости, сто очков даст питоновским мутантам. За такой стиль оформления кода нужно долго бить по по голове толстыми книжками корпоративных стандартов.
Dmitri93; Ta_Da; charushkin; Brawler; Vovan1975; dj_serega; +6
17. Aphanas 92 26.02.17 00:51 Сейчас в теме
(16) Когда вы делаете расширение, вы зависите от типовой конфигурации точно таким же образом. Её пилят совершенно другие люди, которые ни как не уведомляют вас о своих изменениях и т. д.
sashocq; kote; +2
21. kote 536 26.02.17 09:01 Сейчас в теме
(16)

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


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


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


Суть примера не в читабельности (он намерено утрирован - записан в одну строку), а в объеме кода..
Это записывается в несколько строк и читабельность восстанавливается простой расстановкой переносов строк..
Но количество операторов, которые приходится набивать / читать - в конечном итоге может различаться на порядок.
+
23. spacecraft 26.02.17 09:29 Сейчас в теме
(21)
Область применения платформы 1С - и возможности языка 1С - это разные вещи. Вы путаете теплое с мягким.


А в Python для GUI используете TkInter? Или все же другие библиотеки. Мне больше нравится PyQt. Но мне и в голову не приходит требовать от Python этого из коробки, чтоб было встроено.

Для расширения специфических возможностей 1С существуют внешние компоненты. Не обязательно все делать на одном языке программирования (ЯП). Это нормальная практика в любом ЯП.
Нет одного единственного универсального ЯП, в котором все было бы лучше, чем у других. И сравнивать отдельные места просто не корректно. Это будет вырвано из контекста.
+
24. vcv 89 26.02.17 09:34 Сейчас в теме
(21)
Область применения платформы 1С - и возможности языка 1С - это разные вещи.

Разные. Но взаимосвязанные. Первое определяет основные требования ко второму.
Хорошо ли заиметь ООП и элементы функционального программирования в 1С? Однозначно хорошо. Нужно ли? А вот тут вопрос. Например, расширила 1С++ возможности 7.7, введя в неё классы. Что, много народа бросилось создавать свои классы? Нет. Большинство проигнорировало. Большая часть из меньшинства использовало классы как расширение платформы. Скачал несколько файлов, забросил их в конфигурацию - появился новый объект. Получается, по факту, ООП как-то ненужным оказался.

Но количество операторов, которые приходится набивать / читать - в конечном итоге может различаться на порядок.

Недостаток, да. Но вряд ли ради только того стоит ломать язык. Существует множество языков, гораздо более многословных, чем Python, C, Java... И ничего живут себе.
+
129. tango 540 07.07.23 22:58 Сейчас в теме
(21)
Область применения платформы 1С - и возможности языка 1С - это разные вещи

улыбнуло
примерно так улыбает, когда "тру-программеры" сравнивают скрипты 1серов с интернетом
+
130. tango 540 07.07.23 23:00 Сейчас в теме
(129) область применения ексель и возможности визуаль-базик - это разные вещи
+
88. Brawler 455 04.03.17 21:41 Сейчас в теме
(16)
За такой стиль оформления кода нужно долго бить по по голове толстыми книжками корпоративных стандартов.

Я лично нифига не понял тот пример кода в одну строчку, головоломка для неподготовленного мозга.
Уж действительно лучше дубовыми операторами условие "Если", цикл "Пока" и тд. записать сортировку, тогда любой программист выходец из любого другого языка программирования сразу поймет, что за тарабарщина написана.
Vitaly1C8; +1
90. kote 536 04.03.17 23:34 Сейчас в теме
(88) там все просто... попробую накидать гибридный код с объяснением:


// 1) в python сложение 2х массивов - даёт новый составной массив.. в 1С приходится писать какой нибудь код слияния массивов.. 

// 2) Фишка python - выражения над списковыми структурами данных (как верно заметил  Sergey Andreev похоже на  .forEach() , но с условием: 
//      семантика выражения [x for x in мМассив if x==мМассив[0]] - выбрать из массива мМассив элементы равные элементу мМассив[0].. по сути
//      тут цикл по элементам мМассив, в x попадает каждый элемент если он удовлетворяет постусловию ( x==мМассив[0]] )

//3) Вы должны понимать, что такое рекурсия и граничные условия..

Функция БыстраяСортировка(мМассив):
     Если мМассив.Количество() >  0 Тогда
        Возврат БыстраяСортировка([x for x in мМассив if x<мМассив[0]]) 
                      + [x for x in мМассив if x==мМассив[0]] 
                      + БыстраяСортировка([x for x in мМассив if x>мМассив[0]]);
    Иначе
        Возврат мМассив;
    КонецЕсли;
КонецФункции;
Показать


.. как правило, люди знакомые с иными парадигмами (громкое слово, да) программирования - видят приёмы этой парадигмы в коде на любом языке даже не зная этого другого языка - если язык не brainfuck.. скажем, я php не знаю - но в общих чертах понимаю, что там происходит, обычно..
so-quest; sashocq; +2
13. kote 536 25.02.17 17:42 Сейчас в теме
(10)
А оно как-то принципиально надо? ООП в 1С. Функциональщина. Каковы ваши доводы за то, что оно необходимо языку 1С?


Не хочется писать набившие оскомину банальности про то, что даёт ООП и функциональщина..
Если одним словом - оно окупается временем на поддержку и на кодирование..

Ну а если хотите примера - может вот так подойдёт?


Реализация алгоритма quick_sort на ООП языке с хорошим синтаксическим сахаром (Python):

def qsort(L):
    if L: return qsort([x for x in L if x<L[0]]) + [x for x in L if x==L[0]] + qsort([x for x in L if x>L[0]])
    return []


.. или с лямбдами:

 def qsort(L):
    if L: return qsort(filter(lambda x: x < L[0], L[1:])) + L[0:1] + qsort(filter(lambda x: x >= L[0], L[1:]))
    return []


Сколько будет занимать и как оно будет выглядеть на 1С? Возьмём отсюда - http://infostart.ru/public/204320/

//Алгоритм "Быстрая сортировка" { 
Процедура б_Сортировка(Массив,НижнийПредел,ВерхнийПредел)
      
    
    i    = НижнийПредел;
    j    = ВерхнийПредел;
    m    = Массив[Цел((i+j)/2)];
    
    Пока Истина Цикл        
        Пока Массив[i] < m Цикл            
            i    = i + 1;                   
        КонецЦикла;
        
        Пока Массив[j] > m Цикл            
            j    = j - 1;                   
        КонецЦикла; 
        
        Если i > j Тогда                       
            Прервать;                        
        КонецЕсли;
        
    КонецЦикла;
    
    Если НижнийПредел < j Тогда         
        б_Сортировка(Массив,НижнийПредел,j);        
    КонецЕсли; 
    
    Если i < ВерхнийПредел Тогда                      
        б_Сортировка(Массив,i,ВерхнийПредел);        
    КонецЕсли;
    
КонецПроцедуры

Функция БыстраяСортировка(Массив)
    
    НижняяГраница = 0;
    ВерхняяГраница = Массив.ВГраница();    
    б_Сортировка(Массив,НижняяГраница,ВерхняяГраница);
    
    Возврат Массив;
    
КонецФункции
 //---}
Показать


Конечно, можно возразить, что в 1С есть встроенный алгоритм сортировки.. но ведь сколько не встроенных - так же?
И для каждого невстроенного - будет примерно та же история.. я от этого чувствую,что язык просто сжигает много моего времени впустую..
(и не надо мне говорить про шаблоны кода и т.п. оно частично решает - но потом этот код придётся же еще 10 раз перечитать тому, что будет его поддреживать)
+
59. alexqc 150 01.03.17 18:15 Сейчас в теме
(13)

Ну а если хотите примера - может вот так подойдёт?
Реализация алгоритма quick_sort на ООП языке с хорошим синтаксическим сахаром (Python):
....

.. или с лямбдами:
......



А теперь покажите мне того человека, кто всю эту абракадабру вот так сходу поймет ;0 .
Это называется "стиль write-only"


И, эт самое...
Вы уверены что это оптимальный алгоритм?

Переводим на человеческий язык:

Отсортированный_Массив( Исходный_Массив ) это
: Отсортированный_Массив( Все элементы меньшие Исходный_Массив[0] )
+ элемент Исходный_Массив[0]
+ Отсортированный_Массив( Все элементы Большие Исходный_Массив[0] )

Я правильно понимаю, что мы тут на каждом шаге по паре подмассивов создаем???
И вопрос номер 2: что будет если там несколько одинаковых элементов? Мне кажется что они потеряются...




Сколько будет занимать и как оно будет выглядеть на 1С?
....


Ну, переменным стоило бы дать более осмысленные имена.
А так - да, это читается много лучше вашей "однострочной" сортировки.

И еще: это несколько не тот же алгоритм.

И, опять же, эт самое....
А вы уверены что этот код вообще что-либо сортирует???
Как мне кажется, кое-что важное тут забыто ;) ...


Vitaly1C8; +1
60. alexqc 150 01.03.17 18:28 Сейчас в теме
(59) На счет пропуска одинаковых элементов беру слова назад - просто у вас код в двух вариантах чуть различный, вот у меня в процессе написания "сложились" два ощущения, получился результат со строгими неравенствами.
+
61. starik-2005 3036 01.03.17 18:30 Сейчас в теме
(59) суть квиксорта в том, что два указателя двигаются навстречу друг другу и внутри них производится рекурсивное доупорядочивание. Т.е. массив не создается никакой новый, а он просо делится на части и скармливается рекурсивным функциям. Функциональная парадигма тут как раз максимально себя проявляет, т.к. позволяет активно параллелить процесс выполнения.
https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D­0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0 - тут есть картинка, как это делается.

Вообще, давно уже программистам пора привыкнуть к тому, что при передаче в функцию массива туда передается лишь указатель на него. Это азбука, не знать этого нельзя!
curdate; kote; +2
63. alexqc 150 01.03.17 19:05 Сейчас в теме
(61) А теперь внимание ВОПРОС:
На какой массив передастся указатель для

[x for x in L if x<L[0]]

?
+
66. starik-2005 3036 01.03.17 19:31 Сейчас в теме
(63)
На какой массив передастся указатель для
Не силен в питоне, но мне лично кажется (могу ошибаться), что массив здесь - это "L". х - это итератор для L (аналог foreach), с условием, когда он меньше чем L[0]. Предположу, что выбираются все элементы, меньшие L[0], элементы, равные L[0] и элементы, больше чем L[0] (как, собственно, и написано в вики). Потом левая и правая часть также квиксортились (рекурсивно). По всей видимости в Питоне в данной конкретной реализации действительно плодятся части массивов (в общей сложности не превышающие по количеству элементов основной массив). Но в реальных условиях данные делятся на две части и центральным элементом выбирается не L[0], но реализация действительно красива (результат = отсортированная правая часть + отсортированная левая часть => qsort: qsort(элементы, меньшие L[0]) + qsort(элементы, большие или равные L[0]) - просто круть!
kote; +1
67. alexqc 150 01.03.17 19:58 Сейчас в теме
(66) Если вы обратили внимание, я в (59) именно то и написал ( Отсортированный_Массив( Исходный_Массив ) это.. и т.д ).

Теперь уж по поводу "в общей сложности не превышающие" - казалось бы да, для того чтобы получить результирующий массив, мы должны получить его 2 отсортированные части, а потом их объединить. НО - вы забываете о том, что это рекурсия! Что эти части плодятся на каждом шаге; и в лучшем для нас случае ( когда на каждом шаге массив редуцируется вполовину, иное из соображений симметрии будет менее выгодно - мерять будем по бОльшей части)- мы получим глубину рекурсии log2(N). И на самом глубоком уровне мы будем иметь log2(N) подмассивов с удвояющейся длиной, т.е. фактически еще один массив длиной N.
В худшем... говорят, что в плохих случаях трудоемкость квиксорта асимптотически приближается к N^2. А теперь представьте рекурсию такой глубины, и на каждом уровне - по массиву ;).
+
64. vcv 89 01.03.17 19:11 Сейчас в теме
(61)
Вообще, давно уже программистам пора привыкнуть к тому, что при передаче в функцию массива туда передается лишь указатель на него. Это азбука, не знать этого нельзя!

Это да. Но это несколько нарушает функциональную парадигму. Если с массивом работаем только по ссылке (передаём в функции по ссылке, возвращаем из функции по ссылке), то функция потенциально может изменить свои параметры. В подобных ситуациях функциональный язык просто обязан создать новый массив.
Это не касательно именно кода в (13), с ним ситуация немного иная. Это общие размышления о конфликте в функциональных языках. Быстродействие требует передачи структур по ссылке, функциональная парадигма требует работы с копией переменной, что бы не модифицировать оригинал.
kote; +1
65. alexqc 150 01.03.17 19:17 Сейчас в теме
(61) И заодно скажите, где там 2 движущихся навстречу друг другу указателя (я def..., опять же)?

После чего скажите, где там в коде 1с происходит собственно сортировка? Ну, хотя бы когда срез массива упростится до двух рядом лежащих элементов...
+
68. kote 536 01.03.17 20:04 Сейчас в теме
(59) Алексей, добрый вечер.

Алгоритмы на python проверены на тестах TDD на онлайн сервисе обучения языку - они работают.

Да, там "плодятся" списки (~аналог массива) при помощи list comprehensions (я бы по смыслу перевел, как "списковые генераторы", хотя генератор в Python это еще и "ленивые" вычисления) - но для python это обычная история..

Можно легко на генераторы переделать (просто поменяв квадратные скобочки на круглые - и всё) - это не поменяет сути, но сделает вычисления "ленивыми" и снизит требования к памяти.. поэтому python_исты стараются писать проще, а к оптимизации прибегают, если данное место становится "бутылочным горлышком".

Вообще, более правильно то, что предлагает Сергей в (61).. завтра, если со временем получится, добавлю менее "спорный" вариант.. но не обещаю, что в одну строку.. Вот, думаю, может можно подружить алгоритм с ссылками, - если оперировать индексами и возвращать массив индексов элементов, а не отсортированный массив элементов.. Только тогда читать отсортированный список придётся в 2 приёма - сначала индекс из возвращённого списка, а потом элемент с этим индексом из исходного списка? Но тогда будет практически всё равно, какого размера объекты лежат в основном списке - если проблема в этом..

===
Надо сказать, что после небольшой практики на python (буквально один ознакомительный курс на stepic.ru, очень рекомендую) такие алгоритмы, как этот - будет легко читать.. эти "списковые генераторы" укладываются в сознание очень хорошо и ими хочется пользоваться постоянно..

Читабельность этого почти однострокового алгоритма легко восстанавливается переносами. Одностроковость - подчеркивает лишь лаконичность синтаксиса..

Синтаксический сахар не означает "легко читать", а означает "легко писать".

(62) В работоспособности конфы на версии платформы ниже, чем 8.3.9 -- не уверен, так как использовал там что-то по работе с текстовыми шаблонами - новые функции платформы..
curdate; neikist; +2
69. alexqc 150 01.03.17 20:19 Сейчас в теме

(68)
Синтаксический сахар не означает "легко читать", а означает "легко писать".


Вообще-то код в первую очередь для людей пишется. Сопровождать весь этот сахар потом кто будет?



(62) В работоспособности конфы на версии платформы ниже, чем 8.3.9 -- не уверен, так как использовал там что-то по работе с текстовыми шаблонами - новые функции платформы..


Ну я даже открыть ее не могу :(. Старые версии не читают CFник 839.
Вы хоть объясните, как делаете - "компилируйте" введенный код в код 1С и потом "выполнить", сделали какой-то свой интерпретатор/ВМ, или сделали обертки для ф-ций?

Vitaly1C8; +1
71. kote 536 01.03.17 20:33 Сейчас в теме
(69) Регулярками извлекаю функции, их имена и имена параметров. Порождаю объекты от псевдокласса ОбъектнаяФункция. Внутренний код сохраняю - его будем менять (если потребуется) в момент перед выполнением кода.

Потом, ищу имена функций в коде и подменяю вызовом метода соотв. объекта ОбъектнаяФункция. Запускаю выполнение кода консоли..

В момент, когда вызывается метод __Выполнить__(..) этого объекта - анализируются входящие параметры, и если среди них есть объект типа ОбъектнаяФункция - то соотв. переменные (если они вызываются) перед выполнением кода (рекурсивно) подменяются на такой же вызов.

Так же - "подгружается" контекст и видимость переменных и функций-объектов перед вызовами..

В общих чертах - где-то так..
+
73. spacecraft 01.03.17 20:45 Сейчас в теме
(71) отдаленно напоминает:
попытка использовать паттерна Фабрика:
Регулярками извлекаю функции, их имена и имена параметров. Порождаю объекты от псевдокласса ОбъектнаяФункция. Внутренний код сохраняю - его будем менять (если потребуется) в момент перед выполнением кода.

Фабричный метод:
Потом, ищу имена функций в коде и подменяю вызовом метода соотв. объекта ОбъектнаяФункция. Запускаю выполнение кода консоли..
kote; +1
80. alexqc 150 01.03.17 22:57 Сейчас в теме
(71) Все таки неудобно без исходника говорить. Я вот так и не понял - у вас свой интерпретатор или через Выполнить() 1С? "Запускаю выполнение кода консоли" - вот это что?

И если через 1С-выполнить() - то как реализуется сохранение/восстановление контекста, локальных переменных и т.п. при _вложенных_ вызовах ф-ций? Контекст-то для Выполнить() - общий....
+
83. kote 536 01.03.17 23:08 Сейчас в теме
(80) Работает всё через Выполнить().
Контекст грузиться через структуру Параметры.. и в начало кода перед выполнением дописывается код "ИмяПеременной = Параметры.ИмяПерменной" для всех переменных, которые должны быть доступны..
alexqc; +1
85. alexqc 150 01.03.17 23:24 Сейчас в теме
(83) В свое время пытался сделать конвертер кода Выполнить() в код Вычислить() ( Выполнить() не доступна в веб-клиенте) для настраиваемых в пользовательском режиме обработчиков формы. Из-за заморочек с переменными забил на это.

+
86. kote 536 01.03.17 23:38 Сейчас в теме
(85) На стороне клиента - пока не думал, как реализовать это всё.. но думаю, если заменить модуль обработки на модуль "левой" формы (и использовать эту форму как Класс) - то применённый тут подход может сработать.

+
15. DenisCh 25.02.17 19:15 Сейчас в теме
ef qsort(L):
if L: return qsort([x for x in L if x<L[0]]) + [x for x in L if x==L[0]] + qsort([x for x in L if x>L[0]])
return []


Сахар? Сахар, Карл!!!
Это, что любят мухи, Но не сахар
Ta_Da; ZOMI; ipoloskov; Fragster; +4 1
19. Aphanas 92 26.02.17 01:02 Сейчас в теме
Суть ООП в полиморфизме. При процедурном подходе полиморфизм невозможен, и это беда. Наследование и типизация - это способ обеспечения полиморфизма и не более. Причем, кривой и убогий. Инкапсуляция - ересь и пустышка, по сути это только защита от дурака.
Вот и всё ООП, больше ничего в нем нет.
Функции высшего порядка - это тоже способ обеспечения полиморфизма. Всё это лишь средство.

Нужно ли ООП в 1С? Само по себе ООП нигде не нужно, нужен полиморфизм. Если ООП, этот костыль, может дать полиморфизм, то от безысходности приходится уповать на него.
ZOMI; +1
22. kote 536 26.02.17 09:26 Сейчас в теме
(19)
Инкапсуляция - ересь и пустышка, по сути это только защита от дурака.


Ну Вы очень-очень непреклонны и бескомпромиссны :))

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

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

А то, что Вы говорите - так принято считать в Java/С++ - защита и т.п. нагрузка к понятию инкапсуляции были добавлены, но это не основное..

===

(18)
Автор, опиши принцип действия. Скачивать и ковыряться в коде нет никакого желания.


Принцип действия таков.

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

И всё это возможно и работает только благодаря Инкапсуляции и возможности порождения РАЗНЫХ объектов от одного класса (на самом деле - экземпляров обработки ФункцияОбъект)..

По сути - добавлен еще один уровень абстракции и трансляция кода в другой код, который и исполняется..
+
27. starik-2005 3036 26.02.17 16:20 Сейчас в теме
Мне кажется, что спорящие тут далеко не во всем разбираются из оспариваемого. Суть объектно-ориентированного программирования, как совершенно справедливо замечено в (22), это совмещение данных и методов их обработки в одном контейнере. И если кто-то думает, что ООП даст возможность взять объект конфигурации (например, документ) и произвести в нем какие-нибудь изменения, породив от него другой объект, то этот кто-то предельно ошибается - такого ни в 1С, ни где бы то ни было еще не будет. Считайте, что объект, заданный в конфигурации, - это, если угодно, интерфейс (прототип) всех объектов соответствующего типа.

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

Так вот, ООП позволяет, собственно, определить структуру данных и методы их обработки. И что при этом позволяет ООП:
1. Породить на основании объектов другие объекты с иными методами обработки данных. Простой пример - геометрические фигуры на канве: создаем базовый объект "Точка" с конструктором, деструктором и методами "показать", "скрыть", "переместить", ... Дальше порождаем объекты "Круг" и "Квадрат", добавляя в них данные для хранения радиуса или ширины. В итоге достаточно переопределить конструктор и методы "показать" и "скрыть" - и все. Это, собственно, наследование. Если есть несколько похожих процессов обработки данных, то объекты - это то, что нужно.
2. Полиморфизм - это то, что позволяет обращаться к наследнику объекта из базового типа. Это, конечно, в контексте ООП, ибо изначально полиморфизм был (да и остается) несколько иного толка. Но в ООП при строгой типизации метод базового типа - это метод базового типа. И если у нас есть массив кружков, точек и квадратов, то нам либо нужно будет стопиццот массивов определять для хранения всяких разных вариантов элементов той же формы, либо нам нужно определить один массив базового типа, а уже при вызове метода программа должна сама передать управление методу того объекта, который сохранен в соответствующем элементе массива. Во многих языках со строгой типизацией подобный метод объекта определяется с помощью слова "virtual". т.е. указывается, что данный метод - виртуальный. Дальше он может быть унаследован и переопределено у потомков с указанием того, что данный метод виртуальный. Помнится мне, что виртуальные методы должны быть в базовом объекте. создать свой виртуальный метод в потомке нельзя. Может быть в каких-нибудь языках программирования данное ограничение снято - не в курсе.
3. Инкапсуляция. Собственно, это механизм, который позволяет защитить данные объекта, позволив их изменение только с помощью функций (например, имеет смысл скрыть свойство "видимость" у вышеописанных объектов, чтобы нельзя было просто написать МойКвадрат.Видимость = 0, а нужно было бы вызвать метод Скрыть()). В действительно больших проектах или в библиотеках компонент данный подход помогает защитить данные объекта и предотвращает неожиданное поведение программ.

По поводу функциональной парадигмы, то изначально она позволяла программисту-математику рассмотреть саму программу, как функцию. Т.е. функциональное программирование реализует тот самый прямой подход к программированию, который описан в начале моего сообщения: программа - это функция к входящим данным, т.е. результат работы программы - это результат функции. Если тут не программистов-математиков, то и говорить дальше не о чем. Но вся суть функционального программирования проявляется тогда, когда нужно распараллелить код, ибо в математике большое выражение с множеством скобок может вычисляться с любого конца, ибо зачастую способно разбиться на простые элементарные выражения, выполнение которых может происходить абсолютно независимо. Например, если программа - это некая функция F = mv2/2, то никто не мешает отдельно вычислить m/2 и c * c в двух разных потоках, а потом сложить это. Просто рассмотреть программу, как функцию, не так-то просто. но при этом в реальной программе таких независимых участков будет очень много. Но тут, как говорится, уметь надо.

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

По поводу статьи, то вполне хорошее исследование, интересный пример реализации. Я в свое время предлагал реализацию ООП в 1С через общие модули и структуру данных, содержащую в себе этот общий модуль. Общий модуль описывал методы, а структура содержала данные. В итоге можно было бы через ОбъектСтруктура = ОбщийМодульМойОбъект1.СоздатьОбъект() создать новый объект, в поле "__Модуль__" которого могла бы находится ссылка на "ОбщийМодульМойОбъект1". В итоге вызов мог бы происходить так: ОбъектСтруктура.__Модуль__.Метод1(ОбъектСтруктура, Аргументы,...), при этом переданный в качестве параметра объект мог бы реализовать базовое свойство объекта self. Обработка тут нужна только для того, чтобы можно было инициализировать глобальные переменные, которые, по-сути, не нужны - структура в описанном примере сама их все содержит. Т.е. это, фактически, полновесная реализация ООП, когда можно пробежаться по массиву объектов и дернуть их метод (например, Для Каждого Объект ИЗ МассивОбъектов Цикл Объект.__Модуль__.Функция1(Объект, Аргементы, ...) КонецЦикла;).
CyberCerber; ZOMI; kote; Aphanas; +4
28. kote 536 26.02.17 18:06 Сейчас в теме
(27)
Другое дело, что функциональные вставки в программу позволяют решить некоторые моменты достаточно изящно. И вот эти все вставки сейчас и воспринимаются ошибочно, как функциональное программирование. Многие, как я понял, вообще функциональное программирование воспринимают только в контексте возможности передать куда-нибудь в качестве параметра функцию.


Ну раз камень в мой огород :) Вы считаете надо с теории категорий начинать разговор?
+
29. starik-2005 3036 26.02.17 18:27 Сейчас в теме
(28)
Вы считаете надо с теории категорий начинать разговор?
Тут нужно начинать с основ, ибо без понимания того, что такое ФП, невозможно понять, зачем оно нужно и как его применить. Теория категорий скорее запутает еще больше, чем прольет на что-либо свет. А основа - это представление программы, как функции для получения результата. Большой такой функции с функциями внутри, внутри которых тоже могут быть функции. Фактически - это преобразование над входными данными. Суть ФП в параллелизме и кешировании результатов функций, что приводит к возможности максимальной утилизации производительности. Функции в ФП всегда индепотентны, поэтому при одинаковых аргументах всегда возвращают одинаковый результат - это реализовано в 1С через функции модулей повторного использования. Т.е. функциональная парадигма в 1С как бы чуть есть, но нигде не описано, что это она. Да и большинству 1С-ников это неинтересно, ибо красота программирования им в принципе чужда. Даже рекурсию - как основу циклов для ФП, многие 1С-ники использовать боятся, т.к. у них сложности с предсказанием глубины и неопределенность с пониманием ее окончания - им кажется, что она будет бесконечна в каких-то случаях. Эти страхи и комплексы портят множество жизней.
sashocq; Ta_Da; ZOMI; support; kote; +5
33. spacecraft 26.02.17 22:55 Сейчас в теме
(29) со многим согласен, но вот с этим:
Функции в ФП всегда индепотентны, поэтому при одинаковых аргументах всегда возвращают одинаковый результат - это реализовано в 1С через функции модулей повторного использования

согласиться не могу.
Механизм повторного использования совсем другой. Это механизм чтения из кэша, по принципу соответствия значений входных параметров. Если в кэше не найдено соответствие [вызываемой функции + значения входных параметров], то выполняется вызов функции и добавляется новое соответствие с новым результатом. Если найдено, то функция не вызывается и данные читаются из кэша напрямую.
Механизм интересен тем, что данные в кэше временные (если к данным не был доступ в течении 20 минут, то данные исключаются/игнорируются из кэша), но в то же время уникальные для разных значений входных параметров (не перезатираются другими значениями).
Но это совсем не функциональная парадигма.
+
34. starik-2005 3036 26.02.17 22:57 Сейчас в теме
(33) парадигма - нет, а вот элемент - да. В ФП именно так все и работает.
+
36. spacecraft 26.02.17 23:07 Сейчас в теме
(34) хмм. Вот пример функции из модуля с повторным значением:
Функция НовоеЧисло(СтароеЧисло) Экспорт
	ГСЧ = Новый ГенераторСлучайныхЧисел();
	НовоеЧисло = СтароеЧисло/ГСЧ.СлучайноеЧисло(0, 10000);
	Сообщить(НовоеЧисло);
	Возврат НовоеЧисло;
КонецФункции

По истечении времени нахождения в кэше, для такого входного параметра будет возвращено совершенно другое значение. Это полное нарушение ФП.
+
37. kote 536 27.02.17 07:46 Сейчас в теме
(36) В 1С нет возможности использовать "семя" для ГСЧ (чтоб генерировать строго одинаковые псевдослучайные последовательности, зависящие только от входного параметра).. поэтому функцию ГенераторСлучайныхЧисел() надо воспринимать как доступ к значению глобальной переменной, которая хрен пойми как меняется..

В общем, строго говоря, нельзя её использовать в ФП - это не валидная функция с точки зрения ФП..
+
39. spacecraft 27.02.17 08:38 Сейчас в теме
(37)
В 1С нет возможности использовать "семя" для ГСЧ (чтоб генерировать строго одинаковые псевдослучайные последовательности, зависящие только от входного параметра)

Как это нет?

Новый ГенераторСлучайныхЧисел(<НачальноеЧисло>)
Параметры:

<НачальноеЧисло> (необязательный)

Тип: Число.
Начальное число, которым инициализируется генератор случайных чисел.
Описание:

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


Но пример тут больше для наглядности. В самой функции могут быть получены не всегда одинаковые выходные данные для одних и тех же входных данных.
Само понятие ФП это ориентирование на действия, а не на промежуточные данные.
kote; +1
40. kote 536 27.02.17 09:22 Сейчас в теме
(39) Ну тогда можно использовать..

Вот такой код в этой консоли даёт одну и ту же последовательность:

Функция СлучайноеЧислоФП(ГСЧ) Экспорт
    Возврат ГСЧ.СлучайноеЧисло(0, 100);
КонецФункции

////

ГСЧ = Новый ГенераторСлучайныхЧисел(5); // Инициализация генератора "семенем"..

Для НН = 1 По 10 Цикл
	Число = СлучайноеЧислоФП(ГСЧ);
	Сообщить(Число);
КонецЦикла;
Показать
+
41. spacecraft 27.02.17 09:26 Сейчас в теме
(40) вопрос не в том, что бы получить одну и туже последовательность, а в том, что функции модуля с повторно используемыми значениями не являются элементами ФП.
kote; +1
42. kote 536 27.02.17 09:29 Сейчас в теме
(41) Теперь понял Вас.. да, совершенно верно - это лишь периодически обновляемый кеш..
+
44. starik-2005 3036 27.02.17 10:00 Сейчас в теме
(36) просто эта функция не является индепотентной (ее результат не связан с аргументом). В этом и различие, но принцип оттуда.
+
30. Aphanas 92 26.02.17 18:47 Сейчас в теме
(27) Полностью согласен, всё отлично, только позволю себе несколько дополнений.

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

Когда "в итоге достаточно переопределить" конструктор или методы, это называется ПОЛИМОРФИЗМ. Наследование - это средство обеспечения полиморфизма в классическом ООП. Одно из возможных. Но теоретически (да и практически), полиморфизм можно сделать и без наследования. Для этого нужно просто определить в разных объектах методы с одинаковой сигнатурой. В языках с нечеткой типизацией, необязательно, чтобы они были потомками одного предка.

Что дает полиморфизм в плане управления потоком выполнения программы?
Именно он и только он дает возможность определять, какой код будет выполнен в результате вызова метода, вне этого метода. Т. е. он отвязывает сигнатуру от реализации. Это позволяет создавать логику, оперирующую абстракциями высоких порядков. Говоря в терминах классического ООП - представьте себе метод предка (собственный или виртуальный), оперирующий другими виртуальными методами, реализация которых определена, как полагается, в потомках. Так мы можем закодировать достаточно сложную логику, которая будет АБСТРАКЦИЕЙ.

Чем больше нам удастся определить таких абстракций, чем большую часть логики нам удастся выделить в такие абстракции и чем более высокого порядка буду эти абстракции, тем большую часть предметной области и тем более в полной мере нам удастся охватить нашими ограниченными интеллектуальными возможностями. И тем выше наши шансы на успех в борьбе со сложностью.
+
31. starik-2005 3036 26.02.17 19:07 Сейчас в теме
(30)
Суть работы программы в преобразовании данных, но суть программирования, как процесса создания программы, скорее, в управлении потоком выполнения. Т. е., грубо говоря, в определении того, какой оператор за каким будет выполняться.
В действительности в функциональных языках программирования компилятор зачастую так все повернет, что мысль программиста о последовательности операторов будет значительно отличаться от скомпилированного кода.

А вот с тем, что через ООП повышается уровень абстракции и программа рассматривается как совокупность процессов, их иерархии и взаимодействия - согласен полностью. Сложность остается внутри классов, а классы позволяют получить новую точку отсчета и воспринимать взаимодействие классов как отдельную категорию и рассматривать сложность начиная с этого уровня.
Ta_Da; Сурикат; +2
25. fixin 4253 26.02.17 10:33 Сейчас в теме
я изучал ФП в универе - язык Лисп.
То еще говнище, на мой взгляд.
В современное время я столкнулся с XSLT, та же фигня.
невозможность использования глобальных переменных влечет к необходимости тащить контекст с ними через все функции, что убого.

ООП использовал в BC++ еще в 2000.

Но когда я вижу, как убого выглядит ООП при программировании форм, как оно чересчур усложняет разработку, я понимаю что это извращение.

В 1С не нужно не ФП ни ООП.
Vitaly1C8; Brawler; +2 2
26. kote 536 26.02.17 12:18 Сейчас в теме
(25) на основе Лиспа - предать анафеме всю парадигму функционального подхода - это неправильный подход, на мой взгляд..
Использование функционального подхода никак не ограничивает Вас в доступе к переменным в "вышележащих" неймспейсах - замыкания на этом и основаны во многих языках поддерживающих функциональщину (js, python, ruby - то, что своими руками пробовал)..

Потом, Вы тут http://infostart.ru/public/576405/ писали про синхронность/ассинхронность.. ну так - все те же минусы и плюсы у Лиспа. Обратные вызовы требуют сохранения нужных для вызова переменных контекста - но не всех, как Вы утверждаете.. а отказ от глобальных переменных, доступных для изменения из многих точек программы - сильно уменьшает полипотентность Вашей системы..

(25)
Но когда я вижу, как убого выглядит ООП при программировании форм, как оно чересчур усложняет разработку, я понимаю что это извращение.


Странное утверждение.. в чём же убогость ООП при программировании форм - Вы случаем, конкретный продукт (фреймворк для построения форм) с подходом не путаете?? Я, например, вижу, что в отношении форм 1С двигается в направлении Adobe Flex - т.е. декларативного описания формы (управляемые формы - как раз про это).. и ООП подход у Flex прекрасно сочетался с декларативными формами - гораздо удобнее и гибче, чем в 1С. А о чем толкуете Вы?

PS Мне, например, ООП подход только помогает, т.к. приходится чётко разделять ответственность между объектами.. в конечном итоге - в коде меньше "лапши" и он становится проще и лучше поддерживается.. и на самом деле почти всем исследователям ООП в 1С не хватает еще одного уровня абстракции над тем, что Вы предлагаете - некоторого транслятора кода разработчика - в те изыски, что они предлагают (добавляя методы, вызовы и последовательность событий).

К тому же - даже те, кто что-то предлагал, но не использовал свои наработки в своём коде (в этом замечены даже Вы http://fixin.com.ru/articles/down_oop_1s8/article.htm). Вот где вы использовали Ваши наработки в этом плане?

И последний вопрос - а почему, собственно, ООП должно именно к формам в 1С иметь отношение?? И почему удобство работы с формами - критерий оценки ООП как подхода?

Я думаю, что как раз тем, кто хотел бы использовать 1С чуть шире, чем позволяют встроенные объекты - очень помогло бы ООП. А если Вы ограничены рамками бухгалтерии и отчетов.. то, возможно, и правда - как говориться "а нафига козе баян"?
+
32. fixin 4253 26.02.17 20:35 Сейчас в теме
(26)
На Лисп и XSLT нет глобальных переменных, отсюда лишний гемор.
Параллельность может быть и в Си простым fork.

Попробуй написать простейшее приложение на JAVA с формами, например игру пять в ряд, будешь "приятно" удивлен

Программисту ERP ООП не очень нужно, на самом деле. Это скорее Real-time приложениям для моделирования предметной области.
В ERP же есть база данных и формы работы с ней. Не та область. И соответственно, не тот форум для обсуждения ООП.
38. kote 536 27.02.17 08:35 Сейчас в теме
Эээхх.. Никто и не заметил.. придётся самому указать - вот, дополнил описание существенным замечанием для тех, кому ФП не интересно:

Но даже если Вы не интересуетесь функциональным программированием - Вам наверняка понравится возможность ОПРЕДЕЛЯТЬ ФУНКЦИИ НЕПОСРЕДСТВЕННО В КОНСОЛИ КОДА..

Насколько мне известно - это первая консоль такого рода.. все известные мне реализации - попытки вынести алгоритмы в отдельные сущности - страдали существенным недостатком - область видимости у этих алгоритмов была та же самая, что и у основного потока исполнения.. в этой обработке - у каждой функции своя область видимости переменных - но с несколькими предопределенными переменными и функциями (методами самого объекта-функции).. тем не менее - это куда лучше, чем вариант с общей областью видимости..
+
43. kote 536 27.02.17 09:30 Сейчас в теме
(0) Ура, спасибо модераторам! Теперь можно качать разработку бесплатно..

Пишите об ошибках. По возможности - будут исправлять.. а если укажете как исправить - то еще лучше :)
+
45. dj_serega 391 27.02.17 10:02 Сейчас в теме
Я так понял больших успехов по управляемых формах не достигли? ;)
Используете "ЭтаФорма", "ЭтотОбъект".
В некоторых местах можно реализовать через "НаСервереБезКонтекста" (СериализоватьДанныеСервер()).


Ну и общий смысл какой? Как тут ООП завязан? :)
+
46. kote 536 27.02.17 10:20 Сейчас в теме
(45)
Я так понял больших успехов по управляемых формах не достигли? ;)
Используете "ЭтаФорма", "ЭтотОбъект".


Не уверен, что понял суть наезда.. но отвечу, как понял - да, использую и то и другое чтобы явно обращаться к экспортируемым полям объекта (и другим рекомендую).

В некоторых местах можно реализовать через "НаСервереБезКонтекста" (СериализоватьДанныеСервер()).


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

Ну и общий смысл какой? Как тут ООП завязан? :)


Нууууу...для начала, хотелось бы уточнить - а что Вы подразумеваете под аббравиатурой "ООП"?

+
47. dj_serega 391 27.02.17 10:36 Сейчас в теме
(46)
Не уверен, что понял суть наезда.. но отвечу, как понял - да, использую и то и другое чтобы явно обращаться к экспортируемым полям объекта (и другим рекомендую).

Теперь понятно :) И это был не наезд а уточнение ;)

(46)
Нууууу...для начала, хотелось бы уточнить - а что Вы подразумеваете под аббравиатурой "ООП"?

Знаком с тынц и тынц.
Вопрос больше о том что много кто пытался с 1С сделать ООП и все как-то (имхо) сложно получается.
Как-то через расширения уже есть но все-равно не то. И, мне кажется, неполучится что-то людское сделать.

К примеру, можно на 1С писать простенькие игры, но это больше развлечение и реальных задач на это поступать не будет, ибо 1С на это не рассчитана. Аналогично и с ООП, можно что-то свое придумать но оно будет не в том виде как должно быть.
+
48. kote 536 27.02.17 11:43 Сейчас в теме
(47)
Вопрос больше о том что много кто пытался с 1С сделать ООП и все как-то (имхо) сложно получается.
Как-то через расширения уже есть но все-равно не то. И, мне кажется, не получится что-то людское сделать.


Спасибо. На хабре - не читал, а вот вариант уважаемого Гения_1С - знаком с ним (вчера накопал и удивился его отклику, если честно)..

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

Способ, указанные на Хабре - более универсален и только таким образом (+ нужно было бы еще про стек вызовов и AST подумать автору) можно "организовать" наследование на базе языка не имеющего ничего, кроме возможности объявления структур данных.

Но в среде 1С - есть более простой способ инкапсуляции кода в своём собственном неймспейсе/области видимости - это использование модулей объектов Форма, Обработка, Отчет.. и на мой взгляд - это гораздо понятнее и проще, чем в способе указанном на хабре. Его я и использовал. Почему я использую такие имена методов, как Вы видите у меня - ну мне так удобнее.. каждый может делать как ему удобно. Мне, думаю, не составит труда разобраться в коде, написанном по соглашениям в заметке Гения_1С (http://infostart.ru/public/120628/)..

Использование окружающих подчеркиваний - это из python, т.к. опыт показывает что это довольно удачный способ изолировать свой код, от кода пользователя ("пересечение" по именам переменных)..

Использование методов __Вызвать__() - 2 подчёркивания и ___Вызвать___() - 3 подчеркивания - тоже не случайно. Это дополнительная мера, для ограничения области видимости исполняемого кода - чтобы код пользователя видел только свои переменные и данные объекта ЭтотОбъект (экземпляр псевдоКласса КлассОбъектнаяФункция)..

.. Достаточно удобен такой вот шаблон - использование методов __Новый__ и __Инит__ по отдельности и таким образом, как там описано. Первый возвращает новый экземпляр текущего объекта и, при передаче соотв. параметров - инициализирует объект через конструктор __Инит__.. второй позволяет переинициилизировать объект и переиспользовать его (т.к. инициализация нового объекта каждый раз - это лишние накладные расходы).

(Вообще, я собираюсь на базе этой связки методов попробовать исследовать наследование через Прототипы (как в классическом JS), но это на будущее.. что-то близкое происходит и там, но надо будет проработать поиск методов в цепочке наследования или внутри объекта держать служебную структуры - дерево АСТ, стек вызовов..)

==

В общем и целом - ООП тут при всём - без ООП не получилось бы ничего. По порядку:


Итак, тут есть псевдо-классы.. от них порождаются объекты, которые инкапсулируют поведение и данные.

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

Далее, с помощью этих псевдо-классов создаются сущности, играющие роль Функций с соответстующим поведением (объектных функций)..

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

Кроме того - теперь функции стали еще и более функциональными (тавтология, да).. Они присутствуют в области видимости, как объекты - в переменных с таким же именем, как функция.. И более того - определенные в консоли функции могут принимать в качестве параметров другие объектные функции - и это даёт возможность применять некоторые приёмы ФП..

И на мой взгляд - получилось очень даже по человечески - вся изюминка в том, что человеческий код траслируется в исполняемый промежуточный - в итоге и Людям удобно, и новые возможности в языке появились..

Вот посмотрите на скрины с кодом - и скажите.. разве у Вас есть вопросы к удобству и семантике кода??
Видны какие-то вещи, которые не описаны в самой консоли?? Нет?!

Ну тогда ОК.

С формами и другими вещами я обошелся несколько небрежно.. просто скопировал откуда-то и выкинул какие-то команды, чтоб не мешали.. вся разработка велась в КлассОбъектнаяФункция..
+
49. vadim1011985 99 27.02.17 22:12 Сейчас в теме
Кстати стоит отметить что в типовой конфигурации на БСП есть Процедура ВыполнитьБезопасно , которая позволяет вызывать процедуры из общих модулей или менеджеров объектов по их имени
Конечно это далеко не ФП , но думаю что с этим тоже что-нить придумать Процедура

// Выполнить экспортную процедуру по имени.
//
// Параметры
//  ИмяЭкспортнойПроцедуры – Строка – имя экспортной процедуры в формате 
//                                    <имя объекта>.<имя процедуры>, где <имя объекта> - это
//                                    общий модуль или модуль менеджера объекта.
// Параметры               - Массив - параметры передаются в процедуру <ИмяЭкспортнойПроцедуры>
//                                    в порядке расположения элементов массива.
// ОбластьДанных           - Число  - задает область данных, в которой необходимо выполнить процедуру.
// 
// Пример:
//  ВыполнитьБезопасно("МойОбщийМодуль.МояПроцедура");
//
Процедура ВыполнитьБезопасно(ИмяЭкспортнойПроцедуры, Параметры = Неопределено, ОбластьДанных = Неопределено) Экспорт
	
	// Проверка предусловий на формат ИмяЭкспортнойПроцедуры.       
	ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяЭкспортнойПроцедуры, ".");
	Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
			ИмяЭкспортнойПроцедуры);
	КонецЕсли;

	ИмяОбъекта = ЧастиИмени[0];
	Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
			ИмяЭкспортнойПроцедуры);
	КонецЕсли;
		
	Если ЧастиИмени.Количество() = 3 Тогда
		ДопустимыеИменаТипов = Новый Массив;
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаКонстанты()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыСведений()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыНакопления()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыБухгалтерии()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыРасчета()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаСправочники()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаДокументы()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаОтчеты()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаОбработки()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаБизнесПроцессы()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаЖурналыДокументов()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаЗадачи()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыСчетов()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыОбмена()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыВидовХарактеристик()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыВидовРасчета()));
		ИмяТипа = ВРег(ЧастиИмени[0]);
		Если ДопустимыеИменаТипов.Найти(ИмяТипа) = Неопределено Тогда
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
				ИмяЭкспортнойПроцедуры);
		КонецЕсли;
	КонецЕсли;
	
	ИмяМетода = ЧастиИмени[ЧастиИмени.ВГраница()];
	ВременнаяСтруктура = Новый Структура;
	Попытка
		// Проверка на то, что ИмяМетода является допустимым идентификатором.
		// Например: МояПроцедура
		ВременнаяСтруктура.Вставить(ИмяМетода);
	Исключение
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
				ИмяЭкспортнойПроцедуры);
	КонецПопытки;
	
	ПараметрыСтрока = "";
	Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда
		Для Индекс = 0 По Параметры.ВГраница() Цикл 
			ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],";
		КонецЦикла;
		ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);
	КонецЕсли;
	
	ВыполненаУстановкаРазделенияСеанса = Ложь;
	Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
		Если Не ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда
			Если ОбластьДанных = Неопределено Тогда
				ОбластьДанных = ЗначениеРазделителяСеанса();
			Иначе 
				Если ОбластьДанных <> ЗначениеРазделителяСеанса() Тогда
					ВызватьИсключение(НСтр("ru = 'В данном сеансе недопустимо обращение к данным из другой области данных!'"));
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		Если ОбластьДанных <> Неопределено
			И (НЕ ИспользованиеРазделителяСеанса() ИЛИ ОбластьДанных <> ЗначениеРазделителяСеанса()) Тогда
			УстановитьРазделениеСеанса(Истина, ОбластьДанных);
			ВыполненаУстановкаРазделенияСеанса = Истина;
		КонецЕсли;
	КонецЕсли;
	
	Выполнить ИмяЭкспортнойПроцедуры + "(" + ПараметрыСтрока + ")";
	
	Если ВыполненаУстановкаРазделенияСеанса Тогда
		УстановитьРазделениеСеанса(Ложь);
	КонецЕсли;
	
КонецПроцедуры
Показать


Ну и как пример использования все из той-же конфигурации

Функция ЗапуститьВыполнениеВФоне(Знач ИдентификаторФормы, Знач ИмяЭкспортнойПроцедуры, 
	Знач Параметры, Знач НаименованиеЗадания = "", ИспользоватьДополнительноеВременноеХранилище = Ложь) Экспорт
	
	АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы);
	
	Если Не ЗначениеЗаполнено(НаименованиеЗадания) Тогда
		НаименованиеЗадания = ИмяЭкспортнойПроцедуры;
	КонецЕсли;
	
	ПараметрыЭкспортнойПроцедуры = Новый Массив;
	ПараметрыЭкспортнойПроцедуры.Добавить(Параметры);
	ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилища);
	
	Если ИспользоватьДополнительноеВременноеХранилище Тогда
		АдресХранилищаДополнительный = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторФормы);
		ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилищаДополнительный);
	КонецЕсли;
	
	ПараметрыЗадания = Новый Массив;
	ПараметрыЗадания.Добавить(ИмяЭкспортнойПроцедуры);
	ПараметрыЗадания.Добавить(ПараметрыЭкспортнойПроцедуры);

	Если ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая Тогда
		ВремяОжидания = 4;
	Иначе
		ВремяОжидания = 2;
	КонецЕсли;
	
	ПараметрыЗадания.Добавить(Неопределено);
	Задание = ФоновыеЗадания.Выполнить("ОбщегоНазначения.ВыполнитьБезопасно", ПараметрыЗадания,, НаименованиеЗадания);
	Попытка
		Задание.ОжидатьЗавершения(ВремяОжидания);
	Исключение		
		// Специальная обработка не требуется, возможно исключение вызвано истечением времени ожидания.
	КонецПопытки;
	
	Результат = Новый Структура;
	Результат.Вставить("АдресХранилища",       АдресХранилища);
	Результат.Вставить("ЗаданиеВыполнено",     ЗаданиеВыполнено(Задание.УникальныйИдентификатор));
	Результат.Вставить("ИдентификаторЗадания", Задание.УникальныйИдентификатор);
	
	Если ИспользоватьДополнительноеВременноеХранилище Тогда
		Результат.Вставить("АдресХранилищаДополнительный", АдресХранилищаДополнительный);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
Показать
+
50. kote 536 01.03.17 05:49 Сейчас в теме
(49)
Конечно это далеко не ФП , но думаю что с этим тоже что-нить придумать Процедура


Не очень понял, что Вы хотите предложить с этим сделать и как приложить к данной разработке.
Можно поконкретнее?
+
56. vadim1011985 99 01.03.17 09:12 Сейчас в теме
(50) нет, предложить ничего не хочу, я думал что с помощью этой функции как-то реализовать что-то на подобии ФП но приглядевшись понял что не получиться это сделать
+
51. vcv 89 01.03.17 06:06 Сейчас в теме
Предлагаю обратить внимание на статистику. За несколько дней файлы к этой статье скачали 13 раз. В обсуждениях поучаствовала дюжина человек, притом далеко не все из них высказались положительно в отношении статьи. Полсотни комментариев. Отсюда вполне можно сделать вывод, что тема 1С-общественности не интересна. Не хочу сказать, что не нужна. Заиметь ООП и ряд элементов фукциональщины было бы неплохо. Но всё таки - не интересна. Уж извините за непрошеные выводы.
dj_serega; kote; +2 1
52. neikist 01.03.17 08:13 Сейчас в теме
(51) Очень жаль на самом деле что тема малоинтересна, привнести в 1с какие то элементы ООП и ФП было бы просто супер. Не раз ловил себя на мысли что платформа со всеми ее механизмами хороша очень во многом... кроме языка. Но, судя по реакции на данную публикацию и мнению коллег - 1с все это и не подумает вводить((
+
54. kote 536 01.03.17 08:35 Сейчас в теме
(52)
Не раз ловил себя на мысли что платформа со всеми ее механизмами хороша очень во многом... кроме языка.


Точно.

==

Единственное, я не люблю строго типизированные языки (особенно, с С подобным синтаксисом) - мне в этом плане вполне устраивает python (или ruby) как эталон.. (js тоже здорово сделан, синтаксис как в С)
+
53. kote 536 01.03.17 08:31 Сейчас в теме
(51) да, я вижу.. похоже, что не интересна.

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

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

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


+
58. vcv 89 01.03.17 12:29 Сейчас в теме
(53)
додумались уже скайп затолкать в платформу

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

(54)
Единственное, я не люблю строго типизированные языки

Думаю, что полезно было бы сделать не строго типизированный язык, а настройку дополнительных предупреждений при исполнении кода.
Если бы, например, можно было бы включить предупреждение/ошибку при попытке засунуть в реквизит типа "Справочник.Пользователи" значение типа "Справочник.Организации", это бы позволило отлавливать кучу глупых ошибок и опечаток. Это же касается использования неинициализированных переменных. Код типа "Процент = 10; Сумма = Сумма*Процет;" должен выдавать ошибку при выполнении, а не молча выполняться.
+
55. zqzq 23 01.03.17 08:58 Сейчас в теме
Вообще идее использования обработок без форм как ООП-объектов уже 100500 лет... Включая ТИПОВЫЕ конфигурации: например в УПП 1.3 обработка БухгалтерскиеИтоги (она ещё от бух.1.6 вроде).
+
57. kote 536 01.03.17 10:06 Сейчас в теме
(55)
Вообще идее использования обработок без форм как ООП-объектов уже 100500 лет.


.. думаю, это совсем не то. Объект - не класс.. попробуйте уловить разницу:

У меня в коде - именно эмулируется класс (как шаблон объекта).
И у этого класса есть метод __Новый__(), возвращающий НОВЫЕ экземпляры объекта данного класса..

Первый раз - в переменную я получаю класс.. а от этой переменной уже - порождаю объекты.

А там получают эту обработку, как Объект и переиспользуют этот объект много-много раз, так?

==

А совсем "в общем" 1С - это изначально ООП среда, да.. любой Документ или Справочник.. и форма и обработка и отчет - всё это объекты.
+
62. alexqc 150 01.03.17 18:57 Сейчас в теме
Не можете сохранить в пониже чем для 8.3.9?
+
70. alexqc 150 01.03.17 20:28 Сейчас в теме
Вообще же, как правильно сказал товарищ Фиксин, функциональщина для прикладных задач на фиг не упала. Ибо наш мир по своей сути - императивный :).
Для чисто математики, - да, возможно. Для всяких доказательств, теорий и т.п. абстракции.
Но когда дело доходит до прикладных решений - реально за функциональной формой скрывается императивное исполнение.

Вот смотрим что на код на питоне, что на ваш код в консоли.... Вот где вы там функ. программирование увидели? Передали функцию в функкцию? да это еще Си без плюсов умел...
+
72. kote 536 01.03.17 20:38 Сейчас в теме
(70)
Вот смотрим что на код на питоне, что на ваш код в консоли.... Вот где вы там функ. программирование увидели? Передали функцию в функкцию? да это еще Си без плюсов умел...


Ну - название публикации несколько маркетинговое, да :) но, в общем и целом - именно на возможности передачи функции в качестве параметра базируются многи приёмы, которые принято причислять к функциональному подходу.

Уж простите бога ради ;)
+
74. spacecraft 01.03.17 20:49 Сейчас в теме
и рекомендую подробно посмотреть БПО. Часть озвученного там уже давно используется.
Да и в БСП базовая функциональность построена на определение модуля по именам.
+
75. kote 536 01.03.17 21:12 Сейчас в теме
(74) Что такое БПО? Какая часть там используется?

А на счёт БСП - лучше не надо этого.. идея была более-менее, но то, что получилось - превращается в некий ад для разработчика..

Куча версий, обратной совместимости практически нет, код не самого лучшего качества..

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

В конечном итоге - это проблема языка 1С, что бы там не говорили..

Да, можно обойтись без ООП и всего другого - и иметь ERP в 5 миллионов строк.. но, простите - это всё наполнено smell code до самых краёв.. да что там - видели бы Вы какие ошибки и сколько пустых уровней у вызовов в обычной Бюджетной Заплате v3..

И да.. то, что 1С код НЕ_тестируется (это видно по грубейшим ошибкам после релизов) - это тоже заслуга процедурного подхода и убогости языка, на мой взгляд..
sashocq; starik-2005; +2
76. spacecraft 01.03.17 21:46 Сейчас в теме
(75)
Что такое БПО? Какая часть там используется?

Библиотека Подключаемого Оборудования.
Там тоже попытка использовать полиморфизм через фабричный метод.
Создано много однотипных общих модулей, которые работают с конкретным типом/производителем оборудования. У них одинаковые названия методов.
По имени определяется модуль и вызывается функция этого метода.
Почти классический фабричный метод, но отлаживать в итоге не удобно. По F12 невозможно перейти. Конкретный модуль определяется во время выполнения.
Идея хорошая, но в рамках 1С это затрудняет отладку. Не приспособлен 1С к ООП.
+
77. kote 536 01.03.17 22:03 Сейчас в теме
(76) С отладкой - в любой подобной консоли беда, т.к. внутри кода отданного в метод глобального контекста Выполнить(..) невозможно трассировать выполнение программы. Так что это тут "несущественно" - в силу недостатков отладчика платформы 1С.
+
79. starik-2005 3036 01.03.17 22:13 Сейчас в теме
(77) это решаемо, если выполнять по строке кода (для а = 1 по СтрЧислоСтрок(КодаКусок) Цикл Выполнить(СтрПолучитьстроку(КодаКусок, А)) КонецЦикла). Можно внутрь вставить проверку на точку останова и при наличии у строки данной точки выходить из процедуры выполнения и передавать управление диалогу. В принципе не вижу трудностей (даже с автоподстановкой - но на 1С это уже сложнее запилить - лучше в JS на форме с HTML-полем).
+
81. kote 536 01.03.17 23:04 Сейчас в теме
(79) Думаю, не совсем так просто.. с циклами этот номер не пройдёт. Для деббагера нужно будет строить AST и проигрывать его на state_machine.. т.е. уже эмулировать полноценный интерпретатор.
+
82. alexqc 150 01.03.17 23:06 Сейчас в теме
(79) По строчке кода не сможешь Выполнить() для циклов и условий. Да и с определяемыми внутри Выполнить() переменными - бяда и огорчение...
kote; +1
87. starik-2005 3036 03.03.17 10:35 Сейчас в теме
(82) все это решаемо даже на околоязыке программирования от 1С.
+
78. starik-2005 3036 01.03.17 22:08 Сейчас в теме
(76)
Идея хорошая, но в рамках 1С это затрудняет отладку.
И тут мы снова возвращаемся к тому, что язык в 1С - это, по-сути, 5-й паскаль. С тех времен Паскаль ой как далеко ушел (см. Компонентный Паскаль и Оберон). Нежелание 1С развивать язык в принципе говорит о том, что у них в этом плане кризис жанра - они на нормальном языке (С++) не могут сделать нормально платформу, т.к., полагаю, программистов привлекают не самых лучших (или задачи ставят не особо грамотно). "В последнее время участились случаи" (с) вылезания старых ошибок (ошибка POST к ресурсу, ошибка формата потока, ошибка SDBL - это все тянется еще с 8.0, полагаю). Мы нашли интересный глюк, связанный с длиной ключа для функций модулей повторного использования. Уменьшили длину ключа и - о, чудо! - все стало работать, и платформа перестала валиться в дамп при реинициализации через 20 минут (время хранения значения). Ну не бред? Видимо кто-то хеш читает через одно место, а потом оказывается, что он за границами массива, а проверить на это 1С-ники не догадались - и так сойдет!
neikist; kote; spacecraft; +3
84. kote 536 01.03.17 23:12 Сейчас в теме
Вообще, я стремился сделать как можно проще.. и кажется получилось очень неплохо - именно в плане простоты.. (ну сам себя не похвалишь :) )
alexqc; +1
89. Brawler 455 04.03.17 22:28 Сейчас в теме
В очередной раз все взялись обсуждать язык программирования 1С, мол убогий и все такое, но наверное позабыли о том, что именно такую его функциональность 1С определили для себя сами, и именно такую функциональность языка они могут поддерживать на разных платформах ну и соответственно в тонком/толстом/вэб-клиенте/сервере/мобильной платформе. Если добавить функциональности больше чем это необходимо, то можно огрести в будущем проблем.

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

И такой код не должен проходить проверку
Код
   Если Истина Тогда
      Б = 7;
   Иначе
      А = 6;
   КонецЕсли;
   Сообщить(А);
Показать полностью

При исполнении просто тишина, даже ошибка не вываливается.
+
91. starik-2005 3036 05.03.17 14:06 Сейчас в теме
(89) сообщается "Неопределено", которое не отображается, ибо нечего отображать. Какая тут ошибка? Иногда так заглушки ставят для того, чтобы инициализировать автоподстановку на тип, передаваемый в функцию. Если мне среда разработки на такое ругаться будет - в лес такую среду)))

А по поводу питона, то там все понятно. С другой стороны, а понятен ли бухгалтеру код 1С? Вряд ли. Так какого лешего 1С-нику должен быть понятен лаконичный код питона? Пусть такой 1С-ник идет и курит бамбук до полного просветления.
+
92. spacecraft 05.03.17 14:16 Сейчас в теме
(91) ошибка с точки зрения использования не инициализированого значения переменной. Не думая, что ЯП с жесткой типизацией это пропустят.
+
93. starik-2005 3036 05.03.17 14:33 Сейчас в теме
(92)
Не думая, что ЯП с жесткой типизацией это пропустят.
Да, с++ так просто обмануть не получится:
#include <iostream>

int main()
{
	if (1) int i=10;
	std::cout << i;
}
1.cpp: In function ‘int main()’:
1.cpp:6:15: error: ‘i’ was not declared in this scope
std::cout << i;
^
+
97. Brawler 455 05.03.17 15:33 Сейчас в теме
(93)
Да, с++ так просто обмануть не получится:

Так, если бы вы обратили внимание на ошибку, то там ясно говорится, что переменной i не объявлено вообще в области видимости std::cout, а не переменная не инициализирована.
В С++ переменная доступна в области видимости, где она объявлена, а вот в 1С это почти полный аналог Паскаля.
В Паскале, переменные должны объявляться в секции Var методов или модуля. В 1С переменные должны объявляться в начале метода/модуля с применением ключевого слова Перем, однако это не обязательно и в выше приведенном коде фактически транслятор воспринимает код как
Код
Перем А;
Перем Б;
Если Истина Тогда
    Б = 7;
Иначе
    А = 6;
КонецЕсли;
Сообщить(А);
Показать полностью

Но даже зная это, меня не радует то, что не выбрасывается исключение, что переменная А не инициализирована вообще, не то что Неопределено, а вообще ни разу с момента своего объявления.

Добивает даже такое, что подбешивает
Код
Функция Сумма(А, Б)
   Результат = А + Б;
  // Возврат Результат; // случайно забываем написать
КонецФункции

Сообщить(Сумма(5, 6));
Показать полностью

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

С такие вещами как по мне имеет смысл побороться с 1С.
+
98. spacecraft 05.03.17 15:50 Сейчас в теме
(97) Если это именно так, т.е. по-умолчанию идет объявление переменных, тогда это вполне допустимая ситуация. Даже основные ЯП с жесткой типизацией иногда используют инициализацию по-умолчанию. В том же конструкторе класса.
+
Оставьте свое сообщение