Вход | Регистрация
 

Теоретическая забава: как в Выполнить использовать функции

Теоретическая забава: как в Выполнить использовать функции
Я
   Гений 1С
 
09.04.21 - 13:01
Итак, есть некий код, который выполняется через Выполнить.
Хочется в нем вызывать некие локальные функции, которые тут же и описаны, в коде.

Т.е. что то типа:

а = 1;
б = 2;
В = 1;
Р = ВызватьФункцию Х(а, б);
Р = ВызватьФункцию Y(Р);


Функция X(а, б)
... операторы
КонецФункции

Функция Y(зн)
... операторы
КонецФункции


Вопрос возник тут: http://forum.infostart.ru/forum9/topic223461/message2630470/#message2630470

Я думаю, это возможно. Но точно не знаю как. Думаю, вопрос будет интересен математикам.
   eTmy
 
1 - 09.04.21 - 13:05
Открываешь конфигуратор и проверяешь
   Kigo_Kigo
 
2 - 09.04.21 - 13:08
(1) Это не метод гения1с ))))
   программистище
 
3 - 09.04.21 - 13:08
Он открывал сам конфигуратор хоть раз!?
   mikecool
 
4 - 09.04.21 - 13:11
(0) расскажи, что такое псевдопроцедуры?
   mikecool
 
5 - 09.04.21 - 13:14
(1) +1
   Волшебник
 
6 - 09.04.21 - 13:16
Нужно в программный код добавить директивы препроцессора
#НачалоФункции
#КонецФункции

Затем по директивам препроцессора нужно вырезать эти куски программного кода и загнать их в коллекцию.
Затем нужно нарезать параметры.
Затем вызываешь с передачей параметров и обрабатываешь возвращаемое значение.
   mikecool
 
7 - 09.04.21 - 13:18
+5 и я открою мегатайну - я использовал в Выполнить() локальные функции
   Garykom
 
8 - 09.04.21 - 13:23
А что внутри Выполнить нельзя другое Вычислить?
   программистище
 
9 - 09.04.21 - 13:28
(0) Описание и реализацию в процедуру запихнуть нельзя, выполнить идет же в рамках процедуры/функции
   TormozIT
 
10 - 09.04.21 - 13:28
(8) Можно, но редактировать их и проверять корректность очень неудобно будет без довольно большой обвязки в виде редактора и выполнятора.
   Конструктор1С
 
11 - 09.04.21 - 13:29
(0) опять гениальные костыли ваяешь? Пиши нормальный код!
   Вафель
 
12 - 09.04.21 - 13:30
лучше отказаться от выполнить, а использовать доп общие модули, которые делать в расширении.
И редактор и отладка и все про все на месте.
а если это какой то типовой механизм, то там присать
ОбщийМодуль.МояПроцедура(Параметры,...)
Можно для каждого элемента создавать свой общий модуль
   Вафель
 
13 - 09.04.21 - 13:31
ибо самая ж... начинается когда что-то не срабатывает и нужна отладка.
а отладка кода в выполнить - это просто лютый п...ц
   Конструктор1С
 
14 - 09.04.21 - 13:40
(13) проблемы начинаются ещё до отладки. Когда пытаешься понять, что делает тот говнокод, который был собран на лету и засунут в Выполнить()
   Вафель
 
15 - 09.04.21 - 13:42
(14) говнокод можно в любом месте нахерачить
   Конструктор1С
 
16 - 09.04.21 - 13:47
(15) естественно. Но Выполнить() повышает угрёбищность говнокода. Можно сказать выводит говнокод на новый уровень
   polosov
 
17 - 09.04.21 - 13:49
(0) Ты плохо думаешь про математиков.
   Гений 1С
 
18 - 09.04.21 - 14:15
(16) басни.
(10) теперь ты понял, что такое псевдопроцедуры?
   Гений 1С
 
19 - 09.04.21 - 14:16
ну например, объявления процедур можно в коллекцию функции загнать.
   Гений 1С
 
20 - 09.04.21 - 14:19
типа:
Функции = Новый Структура()
Функции.Вставить("Y", "Код функции");
Функции.Вставить("X", "Код функции");

Выполнять можно так:
Выполнить (Функции.X);

Остается решить вопрос с передачей параметров и реентерабельностью. В принципе можно использовать массив Стек.
Стек.Добавить(А);
Стек.Добавить(Б);
Выполнить (Функции.X);

А в коде функции:
А = Стек(Стек.Количество() - 2);
Б = Стек(Стек.Количество() - 1);
....//Тут тело функции

Стек.Удалить(Стек.Количество() - 1);
Стек.Удалить(Стек.Количество() - 2);
   Конструктор1С
 
21 - 09.04.21 - 14:29
(20) я тебя недооценил. Ты способен вывести говнокод на новый уровень. Сделать его абсолютно нечитаемым и неотлаживаемым
   Конструктор1С
 
22 - 09.04.21 - 14:31
(20) осталось добавить в это угрёбище метки с переходами, и вершина говнокодерства будет достигнута
   Волшебник
 
23 - 09.04.21 - 14:32
(22) Переходы можно реализовать между функциями.
   Mort
 
24 - 09.04.21 - 14:35
Разного рода консоли выполнения в режиме предприятия для админов, универсальные обработки данных - вот в общем и все места где "Выполнить()" стоит использовать. Использовать это в функционале готового решения - однозначно говнокод.
   Ненавижу 1С
 
25 - 09.04.21 - 14:35
(20) Даешь вызов функции по таблице виртуальных методов!
   Kassern
 
26 - 09.04.21 - 14:37
(22) ничего ты не понимаешь, человек просто старается обфусцировать код)
   АнализДанных
 
27 - 09.04.21 - 14:37
(21) Конвертация данных разве не также работает ?
   vde69
 
28 - 09.04.21 - 14:37
(20)
Функции = Новый Структура()
Функции.Вставить("Y", "Параметры.А = Параметры.Б+1;");

Параметры = Новый Структура("А,Б",0,1);

Выполнить (Функции.Y);
   Гений 1С
 
29 - 09.04.21 - 14:38
(24) почему. Разве это не ты придумал вложенные формы?
   Kassern
 
30 - 09.04.21 - 14:38
(26) кстати через выполнить и метки, как раз один из способов обфускации код в 1с, что-то подобное я видел в примерах
 
 Рекламное место пустует
   Гений 1С
 
31 - 09.04.21 - 14:38
(27) от КД2 отказались в пользу КД3, т.к. это дыра для произвольного кода, для Фреша недопустимо, а обмены нужны
   polosov
 
32 - 09.04.21 - 14:38
(20) Осталось написать на C# компоненту, которая будет выдавать функции для выполнения по запросу и защита "Гений 3000" готова.
   Leonardo1c
 
33 - 09.04.21 - 14:39
(25) надо еще нейросеть что бы сама в выполнить говнокод сливала ))))
   Kassern
 
34 - 09.04.21 - 14:40
(32) ахахахх)) только он не учтет, что другой кодер в отладке глянет, что его компонента возращает, выпилит ее и воткнет результат компоненты в код)
   Гений 1С
 
35 - 09.04.21 - 14:41
(34) ну вряд ли будет приятно работать с переменными КакойТыКозел, ВороватьНехорошоБаран
   Kassern
 
36 - 09.04.21 - 14:44
(35) документировать свою разработку в таком же ключе будешь?)
   Гений 1С
 
37 - 09.04.21 - 14:47
(36) зависит от того, сколько мне за документирование заплатят
   Kassern
 
38 - 09.04.21 - 14:48
(36) а функции наверное будут как то так созданы?)
ГениальныйМодуль.СовершитьКакуюНибудьДичь(НикомуНеНужныеПараметры)
   Kassern
 
39 - 09.04.21 - 14:51
(35) а если серьезно, на кой это тебе работа с выполнить? Чисто ради интереса, или все таки в продакшен хочешь выпустить?
   Конструктор1С
 
40 - 09.04.21 - 14:53
(31) КД2 не только дыру в безопасности создаёт. Она ещё и вставляет палки в колёса при сопровождении правил
   Конструктор1С
 
41 - 09.04.21 - 14:59
(37) интересно детки пляшут. Тот код, который ты пишешь, по-умолчанию должен быть читабельным
   Гений 1С
 
42 - 09.04.21 - 15:00
(39) чисто ради интереса, мы там с Тормозом по ссылке из сабжа поспорили
   Конструктор1С
 
43 - 09.04.21 - 15:04
(42) поспорил, а теперь забудь все извращения с Выполнить() и сходи помой руки
   Ненавижу 1С
 
44 - 09.04.21 - 15:16
Сделай структуру кодов, ключ - имя, значение - тело
Требование - всегда один аргумент с именем Параметры - Структура или Неопределено (по-умолчанию)
Вызов осуществлять через команду ВызватьМетод(Имя,Параметры=Неопределено)

Профит
   Гений 1С
 
45 - 09.04.21 - 15:16
(43) ну почему же, это упражнения на тему "чистого академического программирования"
   Гений 1С
 
46 - 09.04.21 - 15:16
(44) тоже вариант, но стек таки нужен для реентерабельности
   ДядяМитяй
 
47 - 09.04.21 - 15:18
Про БСП забыли что ли? ВыполнитьВБезопасномРежиме() же...
   Гений 1С
 
48 - 09.04.21 - 15:20
(47) шта?
   Ненавижу 1С
 
49 - 09.04.21 - 15:23
(46) Стек же в методе:

Процедура ВызватьМетод(Имя,Параметры=Неопределено)
  Выполнить(СтруктураКода[Имя]);
КонецПроцедуры
   Гений 1С
 
50 - 09.04.21 - 15:27
(49) ну как вариант, да, если такой метод есть в конфе
   Ненавижу 1С
 
51 - 09.04.21 - 15:28
(50) продам в БГП
   Гений 1С
 
52 - 09.04.21 - 15:29
(51) а если универсально, то через стек
   Ненавижу 1С
 
53 - 09.04.21 - 15:48
(52) рядом с вызовом кладешь этот метод и все
но ты давай, карябай
   Вафель
 
54 - 09.04.21 - 15:51
(52) ты ещё тут и рекурсии делаешь.
Чтобы наверняка никто ничего не понял
   Гений 1С
 
55 - 09.04.21 - 15:53
(53) это если можешь метод положит. В КД2 не положишь, например, йо?
   Вафель
 
56 - 09.04.21 - 15:54
(55) в кд2 есть глобальные функции
   Ненавижу 1С
 
57 - 09.04.21 - 15:55
(55) ну ты же вроде уже освоил технологию расширений?
ты же не на деревню дедушке данные шлешь
   Гений 1С
 
58 - 09.04.21 - 16:05
(56) Реентерабельные? ;-)
   Вафель
 
59 - 09.04.21 - 16:15
(58) нет конечно, но это и не нужно
   TormozIT
 
60 - 09.04.21 - 16:19
(18) Теперь я понял что ты имел ввиду под этим словом. Механизм "псведопроцедур" я делал в большом масштабе и в итоге он все равно скатился к генерируемым обычным процедурам, а сервисного кода там получилось довольно много.
 
 Рекламное место пустует
   Shadawn
 
61 - 09.04.21 - 16:39
Вообще никому не рекомендую использовать Выполнить, только Вычислить. Причина проста - Выполнить не работает в веб-клиенте, поэтому если вдруг когда-нибудь людям захочется веб-клиента, придется все переписывать.
   Гений 1С
 
62 - 09.04.21 - 16:50
(60) Ну вот ради этого все и затевалось. Чтобы донести свою мысль. ОК
   Гений 1С
 
63 - 09.04.21 - 16:50
(61) а зачем выполнить в веб-клиенте? его лучше на сервере гонять.
   Serg_1960
 
64 - 09.04.21 - 17:11
Теоретическая забава говоришь? Ок.
Псевдофункции можно реализовать с помощью Goto :( гусары - молчать :) Легко реализуется однократный вызова, а многократный из различных мест алгоритма - расскажу в понедельник :) Если не забуду :(
   Ненавижу 1С
 
65 - 09.04.21 - 17:14
(0) как продвигается разработка Free RAD?
   Гений 1С
 
66 - 09.04.21 - 17:15
(64) выполнить поддерживает Готу?
   Shadawn
 
67 - 09.04.21 - 17:37
(63) Ну, например если ты хочешь иметь возможность навешивать несколько обработчиков на 1 и то же событие элемента формы.
   ДедМорроз
 
68 - 09.04.21 - 21:27
Если не влом использовать директиву "определить" и код писать в кавычках,а потом делать Вызвать аналогично,явно указывая параметры или всегда только один параметр,то все уже готово и даже стек вызовов.
   ГдеСобакаЗарыта
 
69 - 09.04.21 - 21:36
(16),(24) Вот! Я своему тимлиду почти тоже самое сказал в свое время, когда он мне свою подделку показал. Уволили меня через пару месяцев.
   TormozIT
 
70 - 10.04.21 - 01:01
(66) Да
   TormozIT
 
71 - 10.04.21 - 01:13
(64) Действительно, оператор "Перейти" дает способ повторно использовать код, но только с прописыванием всех переходов. Например код
Текст = "Первый";
МеткаВозврата = "Возврат1";
Перейти ~Сообщить;
~Возврат1:

Текст = "Второй";
МеткаВозврата = "Возврат2";
Перейти ~Сообщить;
~Возврат2:
Перейти ~Конец;

~Сообщить:
Сообщить(Текст);
Если МеткаВозврата = "Возврат1" Тогда
    Перейти ~Возврат1;
ИначеЕсли МеткаВозврата = "Возврат2" Тогда
    Перейти ~Возврат2;
КонецЕсли;

Выдаст сообщения:
Первый
Второй
   Конструктор1С
 
72 - 10.04.21 - 10:30
(45) в программировании давно уже считается дурным тоном использовать хитровывернутые алгоритмы там, где задача решается простым линейным алгоритмом. Полвека назад, во времена недоразвитости прогоаммирования, дороговизны и слабости железа, было модно выписывать всякие математические пируэты в коде. Сейчас так никто не делает, программирование стало коллективной деятельностью. И на первое место выдвинуты удобочитаемость и удобосопровождаемость кода
   acanta
 
73 - 10.04.21 - 10:45
Вы считаете что рефакторинг это изобретение алгоритмов там, где их быть не должно?
Например, зачем делать на счете авансов развернутые аналитики по документам, если достаточно суммы и по требованию подобрать на эту сумму остатка последние платежи клиента?
   Конструктор1С
 
74 - 10.04.21 - 12:05
(73) цели рефакторинга не напомнишь?
   Волшебник
 
75 - 10.04.21 - 12:05
(71) Именно из-за таких программ с GOTO изобрели функции
   acanta
 
76 - 10.04.21 - 12:07
(74) нет. Коллегам программистам не нравится рефакторинг.
   Конструктор1С
 
77 - 10.04.21 - 14:13
(76) вот поэтому к 1сникам и относятся как к недопрограммистам
   ДедМорроз
 
78 - 10.04.21 - 17:27
Единственное оправданное место GoTo - это выход наружу из многоуровневого цикла,т.к.без GoTo это выполняется добавлением лишних условий и уменьшением удобочитаемости кода.
Опять же, надо понимать,что на низком уровне любой условный оператор или цикл - это тот же самый GoTo,но в виде операторов и циклов оно читается удобнее.
Хотя, выражение "Пока Истина Цикл" ничем,по сути,не отличается от метки перехода.
   ДедМорроз
 
79 - 10.04.21 - 17:29
(73) Рефакторинг полезен там,где без него от кода явно пахнет,ну и не надо ставить рефакторинг как самоцель,т.к.улучшать что угодно можно до бесконечности.
   Гений 1С
 
80 - 11.04.21 - 09:20
(78) это потому что нет BREAK 2, который выходит на два уровня цикла вместо BREAK 1 по дефолту
   ДедМорроз
 
81 - 11.04.21 - 12:18
(80) когда у тебя несколько уровней циклов,то считать их тоже ещё то занятие,а вот выход нафиг,или goto или return,если всю эту конструкцию вынесли в отдельную процедуру.
   GANR
 
82 - 11.04.21 - 12:35
(0) тот кто будет отлаживать - возненавидит
   Конструктор1С
 
83 - 11.04.21 - 14:55
(78) обильно вложенные друг в друга циклы не оправдывают использование GOTO. Вклинивание GOTO в такие алгоритмы это попытка выправить кривой код путём закидывания правой ноги через левое ухо. Когда встречается такая вот уродливая лесенка:

Для каждого Элемент1 Из Коллекция1 Цикл
    Для каждого Элемент2 Из Коллекция2 Цикл    
        Для каждого Элемент3 Из Коллекция3 Цикл        
            Для каждого Элемент4 Из Коллекция4 Цикл
            
                //...    

            
            КонецЦикла;        
        КонецЦикла;    
    КонецЦикла;
КонецЦикла;

нужно переделывать код, а не подпирать его уродливым костылём GOTO. Ибо в коде дерьмо, а не декомпозиция
   1ctube
 
84 - 12.04.21 - 08:01
Вообще использование выполнить это говнокод
   Гений 1С
 
85 - 12.04.21 - 08:09
(83) вы слишком категоричны, батенько.
   1ctube
 
86 - 12.04.21 - 08:13
(85) По поводу этой команды да. Как же я её ненавижу
   Гений 1С
 
87 - 12.04.21 - 08:19
(86) ненависть обычно от страха идет. не бойся готы
   Serg_1960
 
88 - 12.04.21 - 12:20
"Выполнить() - это говнокод"(84) и "GoTo - как же я её ненавижу"(86) - "Не любите кошек? Вы просто не умеете их готовить!"(с) :)
   sikuda
 
89 - 12.04.21 - 13:10
(88) Eval is Evil. Использование внутри eval локальных переменных из внешнего кода считается плохим решением, так как это усложняет задачу по поддержке такого кода.
   1ctube
 
90 - 12.04.21 - 13:14
(87) Когда вижу эту конструкцию, реально страшно становится
   1ctube
 
91 - 12.04.21 - 13:14
(89) Вот вот!
   Конструктор1С
 
92 - 12.04.21 - 13:25
(85) уродский код дорого обходится его владельцам, и это в буквальном смысле
   Serg_1960
 
93 - 12.04.21 - 14:01
"уродский код дорого обходится его владельцам, и это в буквальном смысле", навеяло:

В УПП используются спецификации на изготовление продукции. В простейшем случае это список номенклатуры и нормы расхода, указанные числом. Понимая всё примитивность реализации, методисты УПП "расширили" функциональность: нормы расхода можно указывать не числом, а... формулой. Как это реализовано - я не буду рассказываться, дам только ссылку - https://курсы-по-1с.рф/articles/упп-формулы-исходных-комплектующих/

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

Я сделал проще :) все технологи и конструктора нашей организации имеют высшее образование, изучали программирование... и поэтому я предоставил пользователям возможность в спецификациях напрямую писать алгоритмы, отражающие расчет норм расхода материалов на изготовление продукции. Нормы расхода материалов для конкретной продукции рассчитываются с помощью Выполнить().
   Вафель
 
94 - 12.04.21 - 14:03
Даже если юзера и в силах написать код, то все равно на этот код без слез не взглянешь
   Serg_1960
 
95 - 12.04.21 - 14:07
Я могу заскринить сюда примеры, но поверь на слово - плакать не придётся. Просто там нет ничего интересного.
   Конструктор1С
 
96 - 12.04.21 - 14:59
(93) вот это как раз и будет пример уродства. Все эти "формулы" в режиме 1С:Предприятия становятся просто мегауродскими, стоит их только немного усложнить. Даже возьмём пример из курса:

?( [Температура] < 17, 0.11, ?( [Температура] > 23, 0.095, 0.1))

достаточно добавить ещё пару условий "если" и можно будет глаза сломать

?( [Температура] < 17, 0.11, ?( [Температура] > 23, 0.095, ?( [Температура] > 28, 0.098, ?( [Температура] > 40, 0.105, 0.1))))

между тем это довольно элементарная формула. Она прекрасно смотрелась бы в коде, в виде отдельной функции с блоками Если. Да, будет возражение, мол придётся же код каждый раз менять, сопровождать. Так формулы в режиме предприятия тоже придётся сопровождать
   Serg_1960
 
97 - 12.04.21 - 15:32
(96) «Сон разума порождает чудовищ»(с) Это относится не только к формулам УПП, но и,например, к более развитому функционалу ЗУП 3.1. У принципа формул есть некий предел усложнения, после которого они взрывообразно превращаются в монстроподобные конструкции :(
   1ctube
 
98 - 13.04.21 - 07:04
Жесть, жесть, жесть
   Ненавижу 1С
 
99 - 13.04.21 - 07:18
Интерпретатор в интерпретаторе. Оригинально


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.