Имя: Пароль:
1C
 
Теоретическая забава: как в Выполнить использовать функции
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
Интерпретатор в интерпретаторе. Оригинально