Имя: Пароль:
1C
 
Написал на Хабр статью про спуск переменной контекста вглубь стека вызовов.
🠗 (Волшебник 29.06.2022 10:29)
, ,
0 Гений 1С
 
гуру
24.06.22
22:58
1. КГ/АМ 77% (10)
2. Другое 23% (3)
3. Да, делал именно так 0% (0)
4. Да, но делал по-другому 0% (0)
5. Не сталкивался 0% (0)
Всего мнений: 13

Использовали? https://habr.com/ru/post/673350/
101 ДедМорроз
 
25.06.22
15:26
Так все просто
Class A
Private ForTopK
Public Function Top(ByRef ķ)
ForTopK=k
Top=Middle()
End Function
Private Function Middle()
V1=GetOne()
V2=GetTwo()
Middle=Down(V1,V2)
End Function
Private Function Down(ByRef a,ByRef b)
If IsEmpty(ForTopK)=True Then k=1 Else k=ForTopK
Down=(a+b)*k
End Function
End Class
Вот здесь мы как раз видим,что мы задали переменную у объекта,но она у нас не глобальная
102 ДедМорроз
 
25.06.22
15:43
(101) замечу сразу,что это решение предлагаемым методом,и,наверное,скорее костыль,но поаво на жизнь имеет.
103 Ненавижу 1С
 
гуру
25.06.22
15:53
(91) а не всегда надо вглубину, можно линейно разбить:собрали одно, преобразовали, передали далее...

Стонут не от глубины как таковой, а от бессмысленности этого. Зачастую метод просто передаёт 1:1 в следующий
104 Злопчинский
 
25.06.22
16:01
(98) мнe не надо "наблюдать за реализацией". я и без описанных костылей охреневаю в попытках разобрать логику/мысль кучи доработок сторонними кодерами у обращающихся клиентов. Если к ним еще пришпилить этот костыль - вообще пздц будет.
105 Hans
 
25.06.22
16:03
Использование глобальных переменных это быдлокодинг.
106 Гений 1С
 
гуру
25.06.22
18:47
(99) ну не стоит обобщать под "все" миллион леммингов. ггг... всегда возникает вопрос "а судьи кто". А на хабре ты почитай камменты.
но я ж не против - жду от тебя красивого, элегантного решения, можешь утереть мне нос, так сказать.

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

(102) да, если бы у 1С были объекты, можно было бы добавить переменную как член класса, но это мало чем отличается от добавление переменной контекста.

(103) MR0Бит, как всегда о своем, о нульбитном.

(104) То ли ты страннный, то ли твои клиенты. Скорее первое.

(105) ну покажи нам элегантное решение этой задачи, гыгыгы, не в быдло-стиле. Тявкать то все горазды, а как выдать на гора - так творческая импотенция.
107 Злопчинский
 
25.06.22
19:01
(106) я даже понимаю чем рождаются такие костыли, у самого такие поползновения есть. где обрубаю их, а где - нет... Ибо за Хруб на что согласен клиент можно только такой костыль кинуть
108 Гений 1С
 
гуру
25.06.22
19:42
(107) не факт, что если на эту задачу посадить конструктора она за 10*Х руб родит что-то приличное.
109 Волшебник
 
25.06.22
19:46
(106) Сергей, будьте более вежливы к людям, которые Вам говорят прописные истины. Ну пожалуйста.
110 Гений 1С
 
гуру
25.06.22
20:10
(109) а кем они прописаны? Ггг
111 ДедМорроз
 
25.06.22
20:46
(106) код переписан полностью под парадигму ООП - вы же сами просили.
Ну и костыль с переменной никуда не делся и остался тем же костылем,только в стиле ООП.
112 Гений 1С
 
гуру
25.06.22
20:52
(111) ничем не отличается от использования глобальных переменных, вместо глобальной переменной - глобальное свойство класса. Я просил удивить чем-то новым.
113 Ненавижу 1С
 
гуру
25.06.22
21:32
(112) не глобальное свойство класса, а свойство объекта класса, что позволяет подсовывать объект нужного класса с нужным поведением
это называется единый интерфейс и полиморфизм методов
114 Гений 1С
 
гуру
25.06.22
21:42
(113) без разницы, по сути это переменная с более узкой областью видимостью, чем глобальная
115 Кирпич
 
25.06.22
21:46
Вы чо совсем с ума сошли, с Генрихом 1с его глупости обсуждать? :) Он глобальные переменные уже изобрёл?

КГ/АМ
116 Кирпич
 
25.06.22
21:47
(0)когда ты уже придумаешь байт и успокоишься, крокодил проклятый :)
117 Ненавижу 1С
 
гуру
25.06.22
22:00
(114) по сути это свойство экземпляра, а не глобальная переменная. Экземпляров может быть много. Область видимости тут не причём.
118 Гений 1С
 
гуру
25.06.22
22:37
(117) и шо? ггг.. вы обладаете редким талантом писать "прописные истины", КЭП.
119 Ненавижу 1С
 
гуру
26.06.22
08:58
(118) так ты не понимаешь разницу, но делаешь вид, что именно это и имел ввиду
120 Ненавижу 1С
 
гуру
26.06.22
09:02
Из минусов типовых - чрезмерное увлечение строковыми данными, как ключами. Зачем все это, если в конце все равно к перечислению привели?

ВариантОбеспечения = ?(КодДействия = "ДЕЙСТВИЕ_КОБЕСПЕЧЕНИЮ",  Перечисления.ВариантыОбеспечения.КОбеспечению,
                             ?(КодДействия = "ДЕЙСТВИЕ_РЕЗЕРВИРОВАТЬПОМЕРЕПОСТУПЛЕНИЯ", Перечисления.ВариантыОбеспечения.РезервироватьПоМереПоступления,
                             ?(КодДействия = "ДЕЙСТВИЕ_РЕЗЕРВИРОВАТЬ", Перечисления.ВариантыОбеспечения.СоСклада,
                             ?(КодДействия = "ДЕЙСТВИЕ_ОТГРУЗИТЬ",     Перечисления.ВариантыОбеспечения.Отгрузить,
                             ?(КодДействия = "ДЕЙСТВИЕ_НЕОБЕСПЕЧИВАТЬ",Перечисления.ВариантыОбеспечения.НеТребуется,
                                                                       Неопределено)))));
121 Гений 1С
 
гуру
26.06.22
09:23
(119) MR0Бит
(120) у типовых все плохо и гнило. а ты какие-то мелочи показываешь, ггг...
122 Ненавижу 1С
 
гуру
26.06.22
09:24
(121) "все плохо и гнило" это ниочем
123 Гений 1С
 
гуру
26.06.22
09:25
(122) конкретные претензии крупными мазками я уже в этой ветке описывал. Остальное лень перечислять. Может как-нибудь статью напишу на хабре, тогда обкашляем радости типовых
124 Ненавижу 1С
 
гуру
26.06.22
09:29
(123) ждем от тебя только, ты так "прелестно" излагаешь
125 Мимохожий Однако
 
26.06.22
09:35
Общее впечатление от подхода и аргументации

КГ/АМ
126 Leonardo1c
 
26.06.22
09:54
Видел поделки тс лет 10 назад - там было goto (перейти)
127 Гений 1С
 
гуру
26.06.22
10:07
(126) до сих пор использую, например, для выхода из двойного цикла. или для перехода к концу процедуры.
128 Ненавижу 1С
 
гуру
26.06.22
10:17
(127) к концу процедуры есть Возврат
129 Кирпич
 
26.06.22
10:57
(128) ну всё. ждем статью "возврат из вложенного цикла с помощью оператора возврат"
130 Leonardo1c
 
26.06.22
10:58
(128) это же надо функции писать
- мучиться насиловать мозг 😀
131 ДедМорроз
 
26.06.22
11:33
(128) если у нас есть влодкнные циклы и мы хотим продолжить исполнение кода явно задав все итераторы циклов,то без goto это сделать очень сложно.
Правда,вложенные циклы можно разложить в один цикл с каскпдным изменением итераторов,тогда можно без goto и код от количества итераторов слабо зависит.

Также через goto удобно реализовывать переход на обработку ощибки,если мы не любим исключения и хотим,чтобв исполнение кода было более понятным.Нл,нужно понимать такую вещь,что поставив один раз goto мы потом ставим его еще и еще.Понятно,что при имитации работы клеточного автомата или другого объекта состояний работа через goto выглядит наоборот более понятной и простой,но это не про 1с - здесь нет бесконечно выполняемых действий по щаблонам состояний.

На самом деле,в Си ++ есть такая конструкция как long jump,которая тот же goto но и еще и между функциями,так как позволяет сохранять состояние стека - неявно она используется при обработке исключений,но использование этой конструкции в коде я видел только в драйверах (и то,когда все свалилось и нужно начать сначала).

Поэтому,использование goto где-то,кроме bat-файлов - очень и очень нехорошо.
132 Гений 1С
 
гуру
26.06.22
12:24
(128) возврат выходит сразу, а если надо перед возвратом что-то сделать, то надо или вложенную процедуру использовать или Гоуту
133 Гений 1С
 
гуру
26.06.22
12:25
(131) бред. гота часто сркашивает недостатки языка. Есть определенные случаи, когда гота уместна, я их выше описал.
134 Гений 1С
 
гуру
26.06.22
12:26
Это как цикл Пока Истина скрашивает недостаток LOOP UNTIL
135 Ненавижу 1С
 
гуру
26.06.22
12:29
(132) а это уже не к концу так-то
136 Ненавижу 1С
 
гуру
26.06.22
12:30
(132) и да, лучше вложенные методы чем гото
137 ДедМорроз
 
26.06.22
12:46
Вложкнные процедуры хороши,когда мало параметров,а иначе приходится таскать контекст и потом в процедуре проверять,что передали карету,а не тыкву.
138 Ненавижу 1С
 
гуру
26.06.22
12:51
(137) структурируйте параметры по смыслу
139 Гений 1С
 
гуру
26.06.22
13:02
(138) пошла задняя
140 Ненавижу 1С
 
гуру
26.06.22
13:45
(139) ляпнул чтобы ляпнуть?
141 Конструктор1С
 
26.06.22
13:50
(120) это какой-то ахтунг, под стать ТСу
142 Конструктор1С
 
26.06.22
13:53
(127) ну да, программировать ты так и не научился, походу никогда и не научишься. Тот случай, когда навечно застрял в джунах
143 Конструктор1С
 
26.06.22
16:25
Нашел ещё одну ловкую мысль у Макконела

"ДОРОГА В АД ПРОГРАММИРОВАНИЯ ВЫМОЩЕНА ГЛОБАЛЬНЫМИ ПЕРЕМЕННЫМИ" (c)
144 Гений 1С
 
гуру
26.06.22
20:58
(142) член кружка анонимных программистов рассказывает мне как кашлять.
145 Chai Nic
 
26.06.22
21:26
(143) Глобальные переменные это зло, без сомнения. Но почему же таким же злом не считают глобальные процедуры?)
146 Ненавижу 1С
 
гуру
26.06.22
22:50
(145) глобальная процедура... Боюсь это не устоявшийся термин и зависит от конкретики языка, например
147 vsad420
 
26.06.22
22:54
Код лишь реализация архитектуры и применения различных парадигм. Если взять подход с иерархическими конечными автоматами и наследованием автоматов, то такой проблемы не возникает, ввиду возможности переопределить поведение. Детали можно найти в "Practical Statecharts in C/C++: Quantum Programming for Embedded Systems"

Более простым способом является вынесения состояния в отдельный объект, что тебе там и рекомендовали. Всё это нормальным программистам обычно известно. Ты не открываешь ничего нового. Наивная попытка изобрести то, что давно уже сделано.
148 Bigbro
 
27.06.22
05:17
не читал, но дешевый самопиар осуждаю.

КГ/АМ
149 Конструктор1С
 
27.06.22
05:18
(144) твой фетишизм добавляет 0,0 твоей профессиональной ценности
150 Chai Nic
 
27.06.22
08:14
(146) Ну вот например функции в Си - сплошь глобальные процедуры. Их всегда видит весь модуль. А объявить функцию локально внутри области видимости другой функции - нельзя. А в паскале например это штатная возможность изначально. В результате возможно объявить неглобальную переменную, доступную во всей нижележащей иерархии подпрограмм без явной передачи в параметрах.
151 Ненавижу 1С
 
гуру
27.06.22
18:21
(150) какой модуль в си? Там нет моделей
Если в паскале функция вернет локальную подфункцию, то эта локальная функция как бы уже и глобальная

Другое
152 Сергиус
 
27.06.22
19:09
(0)Как-то ты уже предлагал идею со справочником - писать туда нужные значения и в месте использования читать. Что-то подобное и тут.

КГ/АМ
153 Гений 1С
 
гуру
27.06.22
20:39
(152) да, потом переделал на параметры сеанса.
154 ДедМорроз
 
27.06.22
21:12
(150) В Си имя функции - это указатель на ее адрес,поэтому,можно определить переменную и в нее поместить указатель на нужную функцию и менять его,если нужно.
В современном Си++ есть области видимости.
Опять же,в Си файл собирается из нескольких объектных файлов,и в каждом можно определять свои функции,если все сделать правильно,то можно иметь несколько версий одной функции.
В частности,в плюсах могут существовать одноименные функции,принимающие разные параметры.

Но,проблема всех компиллируемых языков в том,что весь код должен быть написан еще на этапе сборки программы,что,во многих случаях,очень сильно ограничивает.
155 Кирпич
 
27.06.22
22:28
(151) Есть в Си модули. Ты же заголовочные файлы подключаешь. Чем тебе не модули. А в паскале ты адрес вложенной функции не вернешь. Да и нет в этом никакого смысла.
(154) "Но,проблема всех компиллируемых языков в том,что весь код должен быть написан еще на этапе сборки программы"
А в других языках нужно писать код, которые генерируют код? :)) На 1с ты не пишешь сначала весь код что ли?
156 Ненавижу 1С
 
гуру
27.06.22
22:43
(155) заголовочные файлы это просто текст вынесенный в другой файл. Это не модули, не пространства имён.

По поводу Паскаля - очень даже, если результат функции есть функциональный тип
157 ДедМорроз
 
27.06.22
22:48
(155) так оператор Выполнить в 1с позволяет делать чудеса.
И,писать код,который собирает код,часто намного проще.
158 Повелитель
 
28.06.22
07:30
(0) То что в статье не использую, так как в коментах к статьи и говорят, что отладка такого кода сложна и не очень всё наглядно.

Использую 2 варианта.

1 вариант.

Процедура КакаяТоТиповаяПроцедура(КакиетоПараметры)
Мой код
ВОЗВРАТ;
//
Типовой код
//
КонецПроцедуры

2 Вариант

Процедура КакаяТоТиповаяПроцедура(КакиетоПараметры) переименовываю её в КакаяТоТиповаяПроцедура_Архив(КакиетоПараметры)
//
Типовой код
//
КонецПроцедуры

Добавляю такую же процедуру
Процедура КакаяТоТиповаяПроцедура(КакиетоПараметры)
Мой код
КонецПроцедуры

В этих 2-х вариантах проще потом делать обновления новых релизов типовых.


Сейчас очень сильно сталкнулся с этой проблемой когда в типовую, конкретно в УТП для Казахстана добавили модуль с СНТ. Причем модуль написано так плохо, что некоторые процедуры в нём в принципе не работают, не знаю как они её в тираж пустили. Например невозможно оформить возврат ЭСФ если в реализации были 2 одинаковые номенклатуры.
И сейчас почему-то модно стало применять код как в ЗУП, где огромное количество временных запросов идут друг за другом страниц этак на 10 формата А4. Отладить такой код практически невозможно. Проще переиминовать их процедуру в КакаяТоТиповаяПроцедура_Архив(КакиетоПараметры) и сделать свою.
159 Гений 1С
 
гуру
28.06.22
08:07
(158) чувак, 2 раза перечитал, не понял, что ты там применяешь..
160 Chai Nic
 
28.06.22
08:15
(156) "очень даже, если результат функции есть функциональный тип"
Это уже не настоящий паскаль, а генномодифицированный)
161 luter-89
 
28.06.22
08:24
Странно видеть столько негативных комментариев))
Но Гений предложил уже давно придуманную схему и она давно используется в типовых конфигурациях.
Посмотрите глобальную переменную ПараметрыПриложения.

Другое
162 Гений 1С
 
гуру
28.06.22
08:26
(161) ну она все же не для этого используется. В моем предложении именно на момент спуска в стек устанавливается значение.
163 luter-89
 
28.06.22
08:27
(105) Главное правильно применять, использовать окружение в разработке, тогда становится понятно где что лучше использовать
164 luter-89
 
28.06.22
08:28
(162) Ну я может не полностью погрузился в тему, но я думаю ты также можешь использовать это соответствие.
Какая разница в какой момент ты будешь сохранять значение переменной
165 Повелитель
 
28.06.22
08:32
(159) Объясняю другими словами.

1 вариант.

Вначале типовой процедуры вызываем ВОЗВРАТ; Таким образом полностью перекрываем типовой код. Соответственно перед возвратом пишем свой код.

2. Вариант. Типовую процедуру не удаляю, а переименовываю, чтобы коллеги могли видеть что было в типовой. И создаю процедуру с таким же названием как в типовой, только код там полностью мой.
166 Кирпич
 
28.06.22
08:32
(156) Модули в Си конечно не такие правильные как в паскале, но они есть. И это факт. А про вложенные функции в паскале - там компилятор тупо не даст тебе вернуть адрес вложенной функции. И нахрена тебе адрес вложенной функции, что с ним делать?
(157) "И,писать код,который собирает код,часто намного проще." Ты пользуешься оператором Выполнить не каждый год. Не выдумывай.
167 Гений 1С
 
гуру
28.06.22
08:33
(165) а чем это лучше расширений? И как это решит задачу с печатными формами например? Ощущение что вы слышали звон, да не поняли о чем он
168 Ненавижу 1С
 
гуру
28.06.22
09:05
(166) 1. нет модулей в Си, и в Си++ они только пытаются появится. Это факт.
2. в Паскале: объявляем функциональный тип, говорим что внешняя функция возвращает этот тип. Так например каррирование устроено
169 Chai Nic
 
28.06.22
09:10
(168) "Так например каррирование устроено"
А что это такое и зачем оно нужно? Когда я учил паскаль, в начале 90х, о подобном не слышали.
170 Кирпич
 
28.06.22
09:11
(168) "2. в Паскале: объявляем функциональный тип, " покажи пример
171 vsad420
 
28.06.22
10:23
(170) https://www.freepascal.org/docs-html/ref/refse17.html
Type TOneArg = Procedure (Var X : integer);  
     TNoArg = Function : Real;  

var proc : TOneArg;  
    func : TNoArg;
172 Кирпич
 
28.06.22
10:25
(171) да это понятно. как вернуть адрес встроенной функции(которые внутри другой функции)?
173 Повелитель
 
28.06.22
10:55
(167) Расширение не переопределяет функцию/процедуру, а по сути добавляет код в конец.

Печатные формы выношу во внешние. Выдрать код и вставить в во внешнюю печатную форму занимает 30 минут и никаких проблем с обновлением в дальнейшем. Плюс эту печатную форму можу выставить на продажу.
174 ice777
 
28.06.22
11:12
(0) почитал статейку. Лошади едят сено, коровы дают молоко.. Ничего нового.
И креативного тоже ничего не увидел.
175 Гений 1С
 
гуру
28.06.22
11:16
(174) нельзя налить воды в полную мочи чашку.
176 Гений 1С
 
гуру
28.06.22
11:16
(173) откройте для себя Вместо и ИзменениеИКонтроль, спорим, вы о них не знали? Гггг.
177 Повелитель
 
28.06.22
12:35
(176) Погляжу, спасибо, не обращал внимания ))
178 lodger
 
28.06.22
12:44
всё пропало.

КГ/АМ
179 Ryzeman
 
28.06.22
13:15
(0) Директор в моей первой семёрочной конторе любил чуток поговнокодить, он ОЧЕНЬ любил константы примерно по тем же причинам. Вы бы с ним спелись)

КГ/АМ
180 Гений 1С
 
гуру
28.06.22
15:04
(177) я думаю, это перевернет ваше представление о программировании расширений. я рад что лишил вас "девственности ВМЕСТО"
(179) какое у тебя место на инфостарте, кстати, красавец?
181 Arbuz
 
28.06.22
16:11
(180) Жениться бы тебе, барин! ©
182 unbred
 
28.06.22
16:13
не сталкивался, но всякий случай "5"

КГ/АМ
183 Курцвейл
 
28.06.22
16:17
(0) Почему не написал статью на stackoverflow? Русский язык слишком богат и слишком гибкий чтобы вести строгие и логичные дискуссии по вопросам общения с машиной.

Другое
184 unbred
 
28.06.22
16:20
каменты почитал к статье. прям кайф) очень рекомендую)
185 Курцвейл
 
28.06.22
16:25
А потом прибежал Сирожа. Directed by Robert B. Weide
186 Гипервизор
 
28.06.22
17:17
(180) Как-то в стиле "сперва добейся".
И о чём же говорит место на Инфостарте?
187 Конструктор1С
 
28.06.22
17:23
(186) о том что гена потратил много сил и времени на зарабатывание плюсиков на инфостарте
188 Волшебник
 
28.06.22
17:26
(180) >> какое у тебя место на инфостарте, кстати, красавец?

У Мани было первое и где он теперь? Всё это мимолётно и ненадёжно. Не копи сокровищ на земле и рейтинг в облаках, а лучше подумайте о душе.
189 andrewalexk
 
28.06.22
17:57
(185) :) да там многие режиссеры подойдут
"А ведь там талант одиночка тоже пробирается,...
сквозь толпу, только не с диссертацией, а с ножичком."(с)
190 Гений 1С
 
гуру
28.06.22
21:14
(188) не знаю, где маня. Но то что он там был первым показатель его скиллов. А те, кто там не бывали, хз, хз
191 Гений 1С
 
гуру
28.06.22
21:15
(187) это win-win стратегия. ну и потом сперва ты работаешь на зачетку, а потом она на тебя.
(186) именно, о том, что сообчество оценило товарища.
192 Zapal
 
28.06.22
21:27
как я понимаю здесь в первую очередь ставится задача решить вопрос с минимальными изменениями типовой, а не по канонам
с этой точки зрения решение из (0) вполне приемлимо
193 Гений 1С
 
гуру
28.06.22
21:29
(192) ну наконец-то глас разума. Я его долго ждал, респект, коллега
194 vsad420
 
28.06.22
22:37
(172) В Паскале ? Скорей всего ассемблерной вставкой. Но лучше использовать более подходящий язык или просто иной подход с вынесением состояния в отдельную структуру.
195 los_hooliganos
 
28.06.22
23:26
Показал статью Сережи знакомым болгарам. Они восхитились.
196 Ryzeman
 
29.06.22
07:07
(180) Сперва добейся?) Я слишком давно в интернете, что бы вестись на эту хрень. Ты сам на общественный суд статью выдал, не я)
197 Кирпич
 
29.06.22
07:16
(195) покажи им сирожкино кино.
198 Гений 1С
 
гуру
29.06.22
08:50
(196) я отдал для того, чтобы услышать аргументы. Когда их увижу, не буду тебя спрашивать о месте на инфостарте. Ну а для "Мистеров 0 бит" это мой любимый вопрос. Короче, проще говоря, если ты прише просто потрещать, то и я просто потрещу
199 Ryzeman
 
29.06.22
09:57
(198) Аргументов тебе написали уже кучу, что тут что на хабре, повторяться не хочется. То, что ты "изобрёл" достаточно часто используется для костылизации типовых минимальными усилиями, например когда делают все доработки через расширения и не хотят править 100500 типовых процедур. То есть право на жизнь имеет, но не отменяет того, что это - полная хрень в плане архитектуры решения и мало чем отличается от моего любителя констант.
200 Ryzeman
 
29.06.22
10:06
А ещё для этой же цели достаточно часто используют ХранилищеОбщихНастроек
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.