|
Теоретическая забава: как в Выполнить использовать функции | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
09.04.21
✎
13:01
|
Итак, есть некий код, который выполняется через Выполнить.
Хочется в нем вызывать некие локальные функции, которые тут же и описаны, в коде. Т.е. что то типа: а = 1; б = 2; В = 1; Р = ВызватьФункцию Х(а, б); Р = ВызватьФункцию Y(Р); Функция X(а, б) ... операторы КонецФункции Функция Y(зн) ... операторы КонецФункции Вопрос возник тут: http://forum.infostart.ru/forum9/topic223461/message2630470/#message2630470 Я думаю, это возможно. Но точно не знаю как. Думаю, вопрос будет интересен математикам. |
|||
1
eTmy
09.04.21
✎
13:05
|
Открываешь конфигуратор и проверяешь
|
|||
2
Kigo_Kigo
09.04.21
✎
13:08
|
(1) Это не метод гения1с ))))
|
|||
3
программистище
09.04.21
✎
13:08
|
Он открывал сам конфигуратор хоть раз!?
|
|||
4
mikecool
09.04.21
✎
13:11
|
(0) расскажи, что такое псевдопроцедуры?
|
|||
5
mikecool
09.04.21
✎
13:14
|
(1) +1
|
|||
6
Волшебник
09.04.21
✎
13:16
|
Нужно в программный код добавить директивы препроцессора
#НачалоФункции #КонецФункции Затем по директивам препроцессора нужно вырезать эти куски программного кода и загнать их в коллекцию. Затем нужно нарезать параметры. Затем вызываешь с передачей параметров и обрабатываешь возвращаемое значение. |
|||
7
mikecool
09.04.21
✎
13:18
|
+5 и я открою мегатайну - я использовал в Выполнить() локальные функции
|
|||
8
Garykom
гуру
09.04.21
✎
13:23
|
А что внутри Выполнить нельзя другое Вычислить?
|
|||
9
программистище
09.04.21
✎
13:28
|
(0) Описание и реализацию в процедуру запихнуть нельзя, выполнить идет же в рамках процедуры/функции
|
|||
10
TormozIT
гуру
09.04.21
✎
13:28
|
(8) Можно, но редактировать их и проверять корректность очень неудобно будет без довольно большой обвязки в виде редактора и выполнятора.
|
|||
11
Конструктор1С
09.04.21
✎
13:29
|
(0) опять гениальные костыли ваяешь? Пиши нормальный код!
|
|||
12
Вафель
09.04.21
✎
13:30
|
лучше отказаться от выполнить, а использовать доп общие модули, которые делать в расширении.
И редактор и отладка и все про все на месте. а если это какой то типовой механизм, то там присать ОбщийМодуль.МояПроцедура(Параметры,...) Можно для каждого элемента создавать свой общий модуль |
|||
13
Вафель
09.04.21
✎
13:31
|
ибо самая ж... начинается когда что-то не срабатывает и нужна отладка.
а отладка кода в выполнить - это просто лютый п...ц |
|||
14
Конструктор1С
09.04.21
✎
13:40
|
(13) проблемы начинаются ещё до отладки. Когда пытаешься понять, что делает тот говнокод, который был собран на лету и засунут в Выполнить()
|
|||
15
Вафель
09.04.21
✎
13:42
|
(14) говнокод можно в любом месте нахерачить
|
|||
16
Конструктор1С
09.04.21
✎
13:47
|
(15) естественно. Но Выполнить() повышает угрёбищность говнокода. Можно сказать выводит говнокод на новый уровень
|
|||
17
polosov
09.04.21
✎
13:49
|
(0) Ты плохо думаешь про математиков.
|
|||
18
Гений 1С
гуру
09.04.21
✎
14:15
|
(16) басни.
(10) теперь ты понял, что такое псевдопроцедуры? |
|||
19
Гений 1С
гуру
09.04.21
✎
14:16
|
ну например, объявления процедур можно в коллекцию функции загнать.
|
|||
20
Гений 1С
гуру
09.04.21
✎
14:19
|
типа:
Функции = Новый Структура() Функции.Вставить("Y", "Код функции"); Функции.Вставить("X", "Код функции"); Выполнять можно так: Выполнить (Функции.X); Остается решить вопрос с передачей параметров и реентерабельностью. В принципе можно использовать массив Стек. Стек.Добавить(А); Стек.Добавить(Б); Выполнить (Функции.X); А в коде функции: А = Стек(Стек.Количество() - 2); Б = Стек(Стек.Количество() - 1); .... //Тут тело функции Стек.Удалить(Стек.Количество() - 1); Стек.Удалить(Стек.Количество() - 2); |
|||
21
Конструктор1С
09.04.21
✎
14:29
|
(20) я тебя недооценил. Ты способен вывести говнокод на новый уровень. Сделать его абсолютно нечитаемым и неотлаживаемым
|
|||
22
Конструктор1С
09.04.21
✎
14:31
|
(20) осталось добавить в это угрёбище метки с переходами, и вершина говнокодерства будет достигнута
|
|||
23
Волшебник
09.04.21
✎
14:32
|
(22) Переходы можно реализовать между функциями.
|
|||
24
Mort
09.04.21
✎
14:35
|
Разного рода консоли выполнения в режиме предприятия для админов, универсальные обработки данных - вот в общем и все места где "Выполнить()" стоит использовать. Использовать это в функционале готового решения - однозначно говнокод.
|
|||
25
Ненавижу 1С
гуру
09.04.21
✎
14:35
|
(20) Даешь вызов функции по таблице виртуальных методов!
|
|||
26
Kassern
09.04.21
✎
14:37
|
(22) ничего ты не понимаешь, человек просто старается обфусцировать код)
|
|||
27
АнализДанных
09.04.21
✎
14:37
|
(21) Конвертация данных разве не также работает ?
|
|||
28
vde69
09.04.21
✎
14:37
|
(20)
Функции = Новый Структура() Функции.Вставить("Y", "Параметры.А = Параметры.Б+1;"); Параметры = Новый Структура("А,Б",0,1); Выполнить (Функции.Y); |
|||
29
Гений 1С
гуру
09.04.21
✎
14:38
|
(24) почему. Разве это не ты придумал вложенные формы?
|
|||
30
Kassern
09.04.21
✎
14:38
|
(26) кстати через выполнить и метки, как раз один из способов обфускации код в 1с, что-то подобное я видел в примерах
|
|||
31
Гений 1С
гуру
09.04.21
✎
14:38
|
(27) от КД2 отказались в пользу КД3, т.к. это дыра для произвольного кода, для Фреша недопустимо, а обмены нужны
|
|||
32
polosov
09.04.21
✎
14:38
|
(20) Осталось написать на C# компоненту, которая будет выдавать функции для выполнения по запросу и защита "Гений 3000" готова.
|
|||
33
Leonardo1c
09.04.21
✎
14:39
|
(25) надо еще нейросеть что бы сама в выполнить говнокод сливала ))))
|
|||
34
Kassern
09.04.21
✎
14:40
|
(32) ахахахх)) только он не учтет, что другой кодер в отладке глянет, что его компонента возращает, выпилит ее и воткнет результат компоненты в код)
|
|||
35
Гений 1С
гуру
09.04.21
✎
14:41
|
(34) ну вряд ли будет приятно работать с переменными КакойТыКозел, ВороватьНехорошоБаран
|
|||
36
Kassern
09.04.21
✎
14:44
|
(35) документировать свою разработку в таком же ключе будешь?)
|
|||
37
Гений 1С
гуру
09.04.21
✎
14:47
|
(36) зависит от того, сколько мне за документирование заплатят
|
|||
38
Kassern
09.04.21
✎
14:48
|
(36) а функции наверное будут как то так созданы?)
ГениальныйМодуль.СовершитьКакуюНибудьДичь(НикомуНеНужныеПараметры) |
|||
39
Kassern
09.04.21
✎
14:51
|
(35) а если серьезно, на кой это тебе работа с выполнить? Чисто ради интереса, или все таки в продакшен хочешь выпустить?
|
|||
40
Конструктор1С
09.04.21
✎
14:53
|
(31) КД2 не только дыру в безопасности создаёт. Она ещё и вставляет палки в колёса при сопровождении правил
|
|||
41
Конструктор1С
09.04.21
✎
14:59
|
(37) интересно детки пляшут. Тот код, который ты пишешь, по-умолчанию должен быть читабельным
|
|||
42
Гений 1С
гуру
09.04.21
✎
15:00
|
(39) чисто ради интереса, мы там с Тормозом по ссылке из сабжа поспорили
|
|||
43
Конструктор1С
09.04.21
✎
15:04
|
(42) поспорил, а теперь забудь все извращения с Выполнить() и сходи помой руки
|
|||
44
Ненавижу 1С
гуру
09.04.21
✎
15:16
|
Сделай структуру кодов, ключ - имя, значение - тело
Требование - всегда один аргумент с именем Параметры - Структура или Неопределено (по-умолчанию) Вызов осуществлять через команду ВызватьМетод(Имя,Параметры=Неопределено) Профит |
|||
45
Гений 1С
гуру
09.04.21
✎
15:16
|
(43) ну почему же, это упражнения на тему "чистого академического программирования"
|
|||
46
Гений 1С
гуру
09.04.21
✎
15:16
|
(44) тоже вариант, но стек таки нужен для реентерабельности
|
|||
47
ДядяМитяй
09.04.21
✎
15:18
|
Про БСП забыли что ли? ВыполнитьВБезопасномРежиме() же...
|
|||
48
Гений 1С
гуру
09.04.21
✎
15:20
|
(47) шта?
|
|||
49
Ненавижу 1С
гуру
09.04.21
✎
15:23
|
(46) Стек же в методе:
Процедура ВызватьМетод(Имя,Параметры=Неопределено) Выполнить(СтруктураКода[Имя]); КонецПроцедуры |
|||
50
Гений 1С
гуру
09.04.21
✎
15:27
|
(49) ну как вариант, да, если такой метод есть в конфе
|
|||
51
Ненавижу 1С
гуру
09.04.21
✎
15:28
|
(50) продам в БГП
|
|||
52
Гений 1С
гуру
09.04.21
✎
15:29
|
(51) а если универсально, то через стек
|
|||
53
Ненавижу 1С
гуру
09.04.21
✎
15:48
|
(52) рядом с вызовом кладешь этот метод и все
но ты давай, карябай |
|||
54
Вафель
09.04.21
✎
15:51
|
(52) ты ещё тут и рекурсии делаешь.
Чтобы наверняка никто ничего не понял |
|||
55
Гений 1С
гуру
09.04.21
✎
15:53
|
(53) это если можешь метод положит. В КД2 не положишь, например, йо?
|
|||
56
Вафель
09.04.21
✎
15:54
|
(55) в кд2 есть глобальные функции
|
|||
57
Ненавижу 1С
гуру
09.04.21
✎
15:55
|
(55) ну ты же вроде уже освоил технологию расширений?
ты же не на деревню дедушке данные шлешь |
|||
58
Гений 1С
гуру
09.04.21
✎
16:05
|
(56) Реентерабельные? ;-)
|
|||
59
Вафель
09.04.21
✎
16:15
|
(58) нет конечно, но это и не нужно
|
|||
60
TormozIT
гуру
09.04.21
✎
16:19
|
(18) Теперь я понял что ты имел ввиду под этим словом. Механизм "псведопроцедур" я делал в большом масштабе и в итоге он все равно скатился к генерируемым обычным процедурам, а сервисного кода там получилось довольно много.
|
|||
61
Shadawn
09.04.21
✎
16:39
|
Вообще никому не рекомендую использовать Выполнить, только Вычислить. Причина проста - Выполнить не работает в веб-клиенте, поэтому если вдруг когда-нибудь людям захочется веб-клиента, придется все переписывать.
|
|||
62
Гений 1С
гуру
09.04.21
✎
16:50
|
(60) Ну вот ради этого все и затевалось. Чтобы донести свою мысль. ОК
|
|||
63
Гений 1С
гуру
09.04.21
✎
16:50
|
(61) а зачем выполнить в веб-клиенте? его лучше на сервере гонять.
|
|||
64
Serg_1960
09.04.21
✎
17:11
|
Теоретическая забава говоришь? Ок.
Псевдофункции можно реализовать с помощью Goto :( гусары - молчать :) Легко реализуется однократный вызова, а многократный из различных мест алгоритма - расскажу в понедельник :) Если не забуду :( |
|||
65
Ненавижу 1С
гуру
09.04.21
✎
17:14
|
(0) как продвигается разработка Free RAD?
|
|||
66
Гений 1С
гуру
09.04.21
✎
17:15
|
(64) выполнить поддерживает Готу?
|
|||
67
Shadawn
09.04.21
✎
17:37
|
(63) Ну, например если ты хочешь иметь возможность навешивать несколько обработчиков на 1 и то же событие элемента формы.
|
|||
68
ДедМорроз
09.04.21
✎
21:27
|
Если не влом использовать директиву "определить" и код писать в кавычках,а потом делать Вызвать аналогично,явно указывая параметры или всегда только один параметр,то все уже готово и даже стек вызовов.
|
|||
69
ГдеСобака Зарыта
09.04.21
✎
21:36
|
(16),(24) Вот! Я своему тимлиду почти тоже самое сказал в свое время, когда он мне свою подделку показал. Уволили меня через пару месяцев.
|
|||
70
TormozIT
гуру
10.04.21
✎
01:01
|
(66) Да
|
|||
71
TormozIT
гуру
10.04.21
✎
01:13
|
(64) Действительно, оператор "Перейти" дает способ повторно использовать код, но только с прописыванием всех переходов. Например код
Текст = "Первый"; МеткаВозврата = "Возврат1"; Перейти ~Сообщить; ~Возврат1: Текст = "Второй"; МеткаВозврата = "Возврат2"; Перейти ~Сообщить; ~Возврат2: Перейти ~Конец; ~Сообщить: Сообщить(Текст); Если МеткаВозврата = "Возврат1" Тогда Перейти ~Возврат1; ИначеЕсли МеткаВозврата = "Возврат2" Тогда Перейти ~Возврат2; КонецЕсли; Выдаст сообщения: Первый Второй |
|||
72
Конструктор1С
10.04.21
✎
10:30
|
(45) в программировании давно уже считается дурным тоном использовать хитровывернутые алгоритмы там, где задача решается простым линейным алгоритмом. Полвека назад, во времена недоразвитости прогоаммирования, дороговизны и слабости железа, было модно выписывать всякие математические пируэты в коде. Сейчас так никто не делает, программирование стало коллективной деятельностью. И на первое место выдвинуты удобочитаемость и удобосопровождаемость кода
|
|||
73
acanta
10.04.21
✎
10:45
|
Вы считаете что рефакторинг это изобретение алгоритмов там, где их быть не должно?
Например, зачем делать на счете авансов развернутые аналитики по документам, если достаточно суммы и по требованию подобрать на эту сумму остатка последние платежи клиента? |
|||
74
Конструктор1С
10.04.21
✎
12:05
|
(73) цели рефакторинга не напомнишь?
|
|||
75
Волшебник
10.04.21
✎
12:05
|
(71) Именно из-за таких программ с GOTO изобрели функции
|
|||
76
acanta
10.04.21
✎
12:07
|
(74) нет. Коллегам программистам не нравится рефакторинг.
|
|||
77
Конструктор1С
10.04.21
✎
14:13
|
(76) вот поэтому к 1сникам и относятся как к недопрограммистам
|
|||
78
ДедМорроз
10.04.21
✎
17:27
|
Единственное оправданное место GoTo - это выход наружу из многоуровневого цикла,т.к.без GoTo это выполняется добавлением лишних условий и уменьшением удобочитаемости кода.
Опять же, надо понимать,что на низком уровне любой условный оператор или цикл - это тот же самый GoTo,но в виде операторов и циклов оно читается удобнее. Хотя, выражение "Пока Истина Цикл" ничем,по сути,не отличается от метки перехода. |
|||
79
ДедМорроз
10.04.21
✎
17:29
|
(73) Рефакторинг полезен там,где без него от кода явно пахнет,ну и не надо ставить рефакторинг как самоцель,т.к.улучшать что угодно можно до бесконечности.
|
|||
80
Гений 1С
гуру
11.04.21
✎
09:20
|
(78) это потому что нет BREAK 2, который выходит на два уровня цикла вместо BREAK 1 по дефолту
|
|||
81
ДедМорроз
11.04.21
✎
12:18
|
(80) когда у тебя несколько уровней циклов,то считать их тоже ещё то занятие,а вот выход нафиг,или goto или return,если всю эту конструкцию вынесли в отдельную процедуру.
|
|||
82
GANR
11.04.21
✎
12:35
|
(0) тот кто будет отлаживать - возненавидит
|
|||
83
Конструктор1С
11.04.21
✎
14:55
|
(78) обильно вложенные друг в друга циклы не оправдывают использование GOTO. Вклинивание GOTO в такие алгоритмы это попытка выправить кривой код путём закидывания правой ноги через левое ухо. Когда встречается такая вот уродливая лесенка:
Для каждого Элемент1 Из Коллекция1 Цикл Для каждого Элемент2 Из Коллекция2 Цикл Для каждого Элемент3 Из Коллекция3 Цикл Для каждого Элемент4 Из Коллекция4 Цикл //... КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; нужно переделывать код, а не подпирать его уродливым костылём GOTO. Ибо в коде дерьмо, а не декомпозиция |
|||
84
1ctube
12.04.21
✎
08:01
|
Вообще использование выполнить это говнокод
|
|||
85
Гений 1С
гуру
12.04.21
✎
08:09
|
(83) вы слишком категоричны, батенько.
|
|||
86
1ctube
12.04.21
✎
08:13
|
(85) По поводу этой команды да. Как же я её ненавижу
|
|||
87
Гений 1С
гуру
12.04.21
✎
08:19
|
(86) ненависть обычно от страха идет. не бойся готы
|
|||
88
Serg_1960
12.04.21
✎
12:20
|
"Выполнить() - это говнокод"(84) и "GoTo - как же я её ненавижу"(86) - "Не любите кошек? Вы просто не умеете их готовить!"(с) :)
|
|||
89
sikuda
12.04.21
✎
13:10
|
(88) Eval is Evil. Использование внутри eval локальных переменных из внешнего кода считается плохим решением, так как это усложняет задачу по поддержке такого кода.
|
|||
90
1ctube
12.04.21
✎
13:14
|
(87) Когда вижу эту конструкцию, реально страшно становится
|
|||
91
1ctube
12.04.21
✎
13:14
|
(89) Вот вот!
|
|||
92
Конструктор1С
12.04.21
✎
13:25
|
(85) уродский код дорого обходится его владельцам, и это в буквальном смысле
|
|||
93
Serg_1960
12.04.21
✎
14:01
|
"уродский код дорого обходится его владельцам, и это в буквальном смысле", навеяло:
В УПП используются спецификации на изготовление продукции. В простейшем случае это список номенклатуры и нормы расхода, указанные числом. Понимая всё примитивность реализации, методисты УПП "расширили" функциональность: нормы расхода можно указывать не числом, а... формулой. Как это реализовано - я не буду рассказываться, дам только ссылку - https://курсы-по-1с.рф/articles/упп-формулы-исходных-комплектующих/ Я не скажу, что это реализовано "уродским кодом", но замечу: для нашей организации этой функциональности явно недостаточно - у нас зависимости куда более сложные, чем то, что предоставили методисты. Иногда по три/четыре листа одних только формул расчета норм :( Я сделал проще :) все технологи и конструктора нашей организации имеют высшее образование, изучали программирование... и поэтому я предоставил пользователям возможность в спецификациях напрямую писать алгоритмы, отражающие расчет норм расхода материалов на изготовление продукции. Нормы расхода материалов для конкретной продукции рассчитываются с помощью Выполнить(). |
|||
94
Вафель
12.04.21
✎
14:03
|
Даже если юзера и в силах написать код, то все равно на этот код без слез не взглянешь
|
|||
95
Serg_1960
12.04.21
✎
14:07
|
Я могу заскринить сюда примеры, но поверь на слово - плакать не придётся. Просто там нет ничего интересного.
|
|||
96
Конструктор1С
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)))) между тем это довольно элементарная формула. Она прекрасно смотрелась бы в коде, в виде отдельной функции с блоками Если. Да, будет возражение, мол придётся же код каждый раз менять, сопровождать. Так формулы в режиме предприятия тоже придётся сопровождать |
|||
97
Serg_1960
12.04.21
✎
15:32
|
(96) «Сон разума порождает чудовищ»(с) Это относится не только к формулам УПП, но и,например, к более развитому функционалу ЗУП 3.1. У принципа формул есть некий предел усложнения, после которого они взрывообразно превращаются в монстроподобные конструкции :(
|
|||
98
1ctube
13.04.21
✎
07:04
|
Жесть, жесть, жесть
|
|||
99
Ненавижу 1С
гуру
13.04.21
✎
07:18
|
Интерпретатор в интерпретаторе. Оригинально
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |