Имя: Пароль:
1C
1С v8
Зазеркалье: Async - Await
0 pechkin
 
20.04.20
16:07
Скоро случится чудо и в 1с завезут Async - Await
https://wonderland.v8.1c.ru/blog/uluchsheniya-v-sintaksise-yazyka-1s-dlya-raboty-s-asinkhronnymi-funktsiyami/
1 v77
 
20.04.20
16:15
Скоро уже проще будет на C# каком нибудь писать, чем на 1С :)
2 NorthWind
 
20.04.20
16:15
(0) неплохо
3 Serginio1
 
20.04.20
16:16
Ну Async - Await хороши в том числе и для немодальных вызовов.
И когда замыкания заведут?
4 pechkin
 
20.04.20
16:18
зачем замыкания когда first class functions нету
5 H A D G E H O G s
 
20.04.20
16:29
Много красивых слов.
Которые можно заменить одной статьей
http://rusproject.narod.ru/winapi/w/waitforsingleobject.html


Годно, че.
Астрологи объявили год асинхронности.
Порог вхождения студентиков и количество кусков г-да в типовых возрастет.
6 pechkin
 
20.04.20
16:30
зачем винапи, когда они с жс срисовывали
7 H A D G E H O G s
 
20.04.20
16:31
Я ваших жс-ов в глаза не видел и, надеюсь, не увижу.
А winapi - вечно и было еще до ваших яв.
8 Garykom
 
гуру
20.04.20
16:34
(3) Угу только замыканий и не хватает... И компилятора из ЯП 1С в JS
9 Djelf
 
20.04.20
16:36
Не понял статью.
Вызов асинхронный, но "ждать" не асинхронный, а как тогда два асинхронных вызова сделать?
А как получить % выполнения? Может же понадобиться, и скорее всего понадобится.
А если асинхронный вызов "повис", "ждать" до бесконечности?
10 Конструктор1С
 
20.04.20
16:39
Лучше бы фоновые задания развивали. А то чтобы из фоновых заданий изобразить многопоточность, приходится исполнять финты ушами
11 v77
 
20.04.20
16:39
(9) ну, видимо пока один повис, второй будет выполнятся. А если оба повиснут, то оба повиснут.
12 ptiz
 
20.04.20
16:43
Жуть какая.
13 Garykom
 
гуру
20.04.20
16:47
Терь при передачах по значению и при зависании ждать если асинхронная функция все никак ответ не возвращает а контекст 1С сохраняет будет мдя.

Особенно если разраб скосячил и можно несколько раз запустить код с Ждать - оперативочка того.
14 Serginio1
 
20.04.20
16:47
(7) В .Net ассинхронность лет 7. В TypeScript 5 d JS 4. Ну вот до 1С только и дошло. Но проблема скорее всего в том, что все функции работы с файлами, Http и прочее станут асинхронными вот и включили. С другой стороны промисы хороши тем, что можно вручную устанавливать значение  в resolve. Очень хорошо для немодальных функций.
https://learn.javascript.ru/async-await
15 Serginio1
 
20.04.20
17:26
Промисы удобны для всякого рода немодальных вызовов, что бы продолжить работу после выполнения метода

Что касается асинхронных методов то они работают через два метода:

static GetPromise(Target: NetObjectinterface, name: any, args: any[]) {

        let key = window.CallNetMethod(0, "GetUniqueString");
        let promise = new Promise((resolve, reject) => {
            NetObject.PromiseDictioanary.set(key, { resolve: resolve, reject: reject });
            window.CallAsyncNetObjectFunction(Target.Id, name, key, args);
        });
        return promise;
    }

И при получении асинхронного результата:

static SetPromiseResult(Successfully: boolean, TaskId: string, result: any) {
        let item = NetObject.PromiseDictioanary.get(TaskId);
        try {

            NetObject.PromiseDictioanary.delete(TaskId);
           // Вот здесь не могу установить результат Proxy с Target function
            //  result = NetObject.WrapResult(result, true);
           // возникает исключение "Не найден then"
            if (Successfully)
                item.resolve(result);
            else
                item.reject(result);
        }

        catch (e) {
            item.reject("ошибка установки асинхронного результата " + e);
            alert("ошибка установки асинхронного результата " + e);
        }
    }

где:

static PromiseDictioanary = new Map();


То есть запомнить resolve, reject в конструкторе и вызвать когда действие закончится. Но в 1С нет замыканий!!!
16 Serginio1
 
20.04.20
17:40
Вернее не в конструкторе а в параметрах метода вызываемого Promise при старте. Но даже обычных типов функций нет.
17 vde69
 
20.04.20
17:54
1с это все-же десктопная система, зачем в ней вообще нужны асинхронные вызовы окон???

да я понимаю тяжелые вещи запускать через фоновое задание, но зачем задать вопрос и не ждать пока на него пользователь ответит??? зачем такие вопросы вообще нужны???

кто может хоть 1 пример привести когда это полезно?
18 Djelf
 
20.04.20
18:00
А... кажется допёрло ;)
Но не факт что доперло правильно...
Из-за того что броузеры стали асинхронно обрабатывать сохранение файла потребовалось сделать костыль №1, но он требует отдельной процедуры, которая сработает при ОписаниеОповещения.
Это увеличивает количество кода, поэтому сделали синхронный костыль "Ждать" и асинхронный костыль "Асинх", чтобы превратить асинхронную функцию в синхронную.
Не уверен... кажется это не костыль, а грабли!
19 Serginio1
 
20.04.20
18:04
Угу при этом вызов
&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Оповещение = Новый ОписаниеОповещения(“ЗаполнитьТоварыВопросЗавершение”, ЭтотОбъект);
ТекстВопроса = “Табличная часть будет очищена. Продолжить?”;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТоварыВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
//алгоритм заполнения
КонецЕсли;
КонецПроцедуры

можно написать

&НаКлиенте
Процедура ЗаполнитьТовары(Команда)
Результат= await ПоказатьВопросАсинх(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Если Результат = КодВозвратаДиалога.Да Тогда
//алгоритм заполнения
КонецЕсли;
КонецПроцедуры

Я понимаю, что ты выберешь первый, но я второй!

По сути все запросы на сервер они асинхронные. Что бы не блокировать гуй. Да и в браузере методы могут быть асинхронными. Вспомни почему они перешли на немодальные окна?
20 vde69
 
20.04.20
18:08
вот я сейчас перевожу в вордпрессе часть обработок в фоновый режим, да гемороя мног, но хоть понятно зачем это...

а в случае 1с с отказом от модальных окон я вообще не понимаю зачем это нужно, то-ли это дань моде, толи блаж чья-то... но реально я не вижу зачем это когда практически ввели режим окна "блокировать владельца" и "блокировать весь интерфейс", все равно все модальные окна переводят на блокирующие, с точки зрения пользователя - ничего не поменялось, с точки зрения программиста - стало больше кода. Кто в выигрыше?
21 mikecool
 
20.04.20
18:09
(0) нихрена не понял, в чем же плюсы относительно текущей асинхронности?
22 H A D G E H O G s
 
20.04.20
18:18
(21) Не надо писать 2 процедуру
23 Serginio1
 
20.04.20
18:21
(21) В том что вместо
Оповещение = Новый ОписаниеОповещения(“ЗаполнитьТоварыВопросЗавершение”, ЭтотОбъект);
ТекстВопроса = “Табличная часть будет очищена. Продолжить?”;
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТоварыВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт

Можно написать просто
Результат= await ПоказатьВопросАсинх(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
24 sitex
 
naïve
20.04.20
18:34
Мы конечно можем долго рассуждать и доказывать что это не нужно , но все таки пусть лучше будет ,чем не будет. Хоть какие то зачатки. А то блин мои руки больше в js тянуться чем в 1С.
\
25 pavig
 
20.04.20
19:07
(0)
Цель благая, но сделали убого
26 PR
 
20.04.20
19:10
(20) 1С как для людей написала https://wonderland.v8.1c.ru/blog/asinkhronnye-vyzovy-rasshireniy-brauzerov-i-vneshnikh-komponentov/
Но это же надо прочитать, да, а нахрена?
Гораздо проще брякнуть что-нибудь типа "Да нахрена все это новое понапридумывали, трахайся теперь"
Помнится, фузинята примерно так же рассудали про клиент-серверную архитектуру
27 PR
 
20.04.20
19:10
(25) Сделай лучше, че
28 quest
 
20.04.20
19:16
(27) В закрытой ВМ, без спецификации ? Совсем что ли директорская извилина кровоток пережала?
29 Sysanin_1ц
 
20.04.20
20:30
(0) Ну осталось только напрямую дать возможность работать с HTML/CSS/JS и 1с реально пойдет в рост
30 Sysanin_1ц
 
20.04.20
20:31
(29) --> Ну еще ООП внедрить
31 Ненавижу 1С
 
гуру
20.04.20
20:33
ключевые слова "Ждать" и "Асинх" доставляют
32 pechkin
 
20.04.20
20:34
"дословный" перевод
33 ДенисЧ
 
20.04.20
20:43
(31) Предложи свой вариант
34 orefkov
 
20.04.20
21:49
(33)
Ассасинх
36 Ненавижу 1С
 
гуру
20.04.20
22:01
(35) в виде расширений
37 Ненавижу 1С
 
гуру
20.04.20
22:05
Так это чего? теперь отчеты можно формировать без создания фоновых заданий?
39 vde69
 
20.04.20
22:18
(26) да верю, я что для браузера это нужно, а много-ли ты знаешь контор которые в браузере работают?

90% 1с это тонкий или толстый клиент, а 1с ради этих 10% гемороя доставляют всем....

так-же как и многое другое...

вся эта муть с отказом от асинхронности нафиг никому не нужна, так-же как всякие алкого, пушнина и прочее в бухгалтерии
40 Serginio1
 
20.04.20
22:29
(37) Ну это будет зависеть от того сделают они выполнение promise в пуле потоков потоке.
А также методы WhenAll, WhenAny. Но сдается, что дадут небольшой набор асинхронных методов

https://learn.javascript.ru/async-await
https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern
41 Сияющий в темноте
 
20.04.20
22:31
Сначала мы делали асинхронные процедуры честно,а потом решили программистам сделать механизм,который из аминхронных делает подобие синхронных.

нет бы WaitForMultiplyObject или CompletionPort.

да и HttpЗапрос только у 1с остался не асинхронным.

опять же,где нормальная многопоточность,их асинхронность в том,что они не смогли свои функции в стандартный механизм браузера просунуть.
42 Serginio1
 
20.04.20
22:33
https://habr.com/ru/company/ruvds/blog/353658/
Во втором примере нам приходится иметь дело с неизвестным количеством промисов. Однако решить эту проблему очень просто. А именно, надо создать массив и поместить в него промисы. Затем, используя Promise.all(), можно организовать ожидание разрешения всех этих промисов.

async function orderItems() {
  const items = await getCartItems()    // асинхронный вызов
  const noOfItems = items.length
  const promises = []
  for(var i = 0; i < noOfItems; i++) {
    const orderPromise = sendRequest(items[i])    // асинхронный вызов
    promises.push(orderPromise)    // синхронный вызов
  }
  await Promise.all(promises)    // асинхронный вызов
}
43 pechkin
 
20.04.20
22:36
Просим.алл подвезут только в 19 релизе
44 Serginio1
 
20.04.20
22:39
(43) А о замыканиях то хоть задумываются?
45 Сияющий в темноте
 
20.04.20
22:39
(42) а 1с вообще обещает,что ожидание ввполняется а отдельном потоке.
кстати,например,можно число потоков поставить в 1,и все сайты,которые пытались использовать асинхронность висят до сообщения суенарий завис.

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

Поэтому,они к этому механизму и пришли.
46 Сияющий в темноте
 
20.04.20
22:41
(44) замыкания-это область видимости,а у 1с ее просто нет,а передача контекста прекрасно реализуется через структуру.
потом,для 1с сиертельны связи между обьектами в виде графа-сборщик мусора не справляется,и куда тут замыкания подвозить?
47 Сияющий в темноте
 
20.04.20
22:44
на самом деле,вместо замыканий очень полезна директива CaptureContext(VarList) и потом CloneCallWithContext.
48 Serginio1
 
20.04.20
22:50
(46) Суть замыканий в том, что переменные метода попадают в замыкание.
Мало того сам async awaite это конечный автомат с запоминанием контекстаю

ибо

данные1=1;
данные2=2;
Результат= await ПоказатьВопросАсинх(ТекстВопроса, РежимДиалогаВопрос.ДаНет); // вот здесь мы покидаем контекст и запоминается точка и переменные с которой нужно продолжить
и после выполнения ПоказатьВопросАсинх запускается поток (берется из пула) и запускается код после присваивания и дальше

данные=Данные1+Результат+данные2

Так или иначе им нужно разбивать метод на несколько методов с запоминанием контекста
49 Serginio1
 
20.04.20
22:52
https://habr.com/ru/post/260217/
Кстати в TypeScript когда еще не было промисов использовал async awaite c генерацией автомата
50 Serginio1
 
20.04.20
22:56
Вот здесь попонятние написано https://habr.com/ru/company/otus/blog/488082/
51 pechkin
 
20.04.20
22:59
В данном случае замыкания таки есть
52 Сияющий в темноте
 
20.04.20
23:37
и еще
разница между модальным диалогом и БлокироватьОкноВладельца в том,что во втором случае можно смело сделать вызов экспортного метода у окна-владельца,так как внутри окна нет ни какого состочния ни авполяемого кода,а когда модальный вызов,то код как бы стоит на паузе,и выполнять в окне другие действия посто невозможно(в том числе и обработчики астнхронных вызовов).
53 Сияющий в темноте
 
20.04.20
23:40
(51) суть замыкания-передача области видимости из одной функции в другую.
просто сохранение контекста(тупо блокп переменных)это не совсем замвкание.
неплохо бы просто иметь обьект Context,чтобы с ним можно было выполнять какие-то манипуляции.
54 amiga 600
 
21.04.20
00:10
(14)
"Очень хорошо для немодальных функций."

Миста не меняется
55 Serginio1
 
21.04.20
00:24
(53) Ты 50 читал? Это и есть замыкание ввиде класса с единственным методом MoveNext со всеми переменными метода.
Именно для этого и нужно ключевое слово async что бы понимать что это не обычная функция и нужно строить автомат
а MoveNext  вызывается после каждого awaite.  Замыкания можно реализовывать разными способами. Например в C# это с помощью анонимных классов
в котором хранятся внутренние и внешние переменные
https://ru.stackoverflow.com/questions/233227/Реализация-замыканий-в-c
56 NorthWind
 
21.04.20
06:28
(7) прогресс неостановим. WaitFor...Object(s) и прочие CreateThread были сделаны для языков, которые не поддерживали асинхронность встроенными средствами. Сейчас это становится по сути на том же уровне, что поддержка if или for, и мне кажется, это хорошо. Почему нет?
57 Провинциальный 1сник
 
21.04.20
06:38
"Асинх Функция КопироватьФайлыАсинх(ИсхКаталог, ЦелКаталог)"

Как это жутко коряво выглядит. Что мешало Асинх сделать модификатором, а не префиксом?

"Функция КопироватьФайлыАсинх(ИсхКаталог, ЦелКаталог) Асинх" - было бы намного лучше. И кстати, НаСервере и тому подобное лучше бы так же оформлять...
58 Комрад1
 
21.04.20
06:40
А может кто-нибудь объяснить что это даёт на практике. В стиле "Раньше мы не могли сделать "Нечто" а теперь это "Нечто" легко сможем"
59 Провинциальный 1сник
 
21.04.20
06:41
Эти бешеные джависты доведут 1с до цугундера..
60 Провинциальный 1сник
 
21.04.20
06:45
(58) Ну типа, объем кода сократится. Но как же это всё коряво выглядит...
61 NorthWind
 
21.04.20
06:48
(58) запустить несколько потоков выполнения. То что делали с помощью фонового задания. Только фоновое задание реализовывались старыми средствами языка, а сейчас они впилили операторы для этого. Т.е. обновили сам язык.
62 Комрад1
 
21.04.20
06:50
(60) (61) Ну, то есть ничего нового сделать не сможем, а просто старое будет работать лучше (сарказм) ?
63 NorthWind
 
21.04.20
06:54
(62) по сути да. На самом деле все идеально четко сформулировано в (5), к этому ещё можно добавить что оно использовалось в древнем Си 25 лет назад. И вполне себе давало асинхронность. Но сейчас это впиливают в средства языков, такой тренд.
64 Провинциальный 1сник
 
21.04.20
06:56
(62) Ну, сложно ждать чего-то нового от корпорации, согласившейся плестись в хвосте прогресса и модных течений. Из законодателя мод отрасли учетных систем 1с превратилась в подражателя. Это добром не кончится.
65 ДенисЧ
 
21.04.20
07:06
(64) Ты уже перешёл на жабу полностью? Или до сей поры плетёшься в хвосте прогресса?
66 Комрад1
 
21.04.20
07:12
(64) Похоже, что они что-то начали понимать. Пока есть небольшой шанс, что ещё не поздно.
67 Провинциальный 1сник
 
21.04.20
07:47
(65) При чем тут я? Я ремесленник, работаю молотком, который разрабатывает 1с. Вот только последнее время они выпускают молотки с кривой несбалансированной ручкой, потому что где-то за океаном это стало модным..
68 Hmster
 
21.04.20
08:27
я так понимаю зарплаты программистов 1С будут расти?
69 NorthWind
 
21.04.20
08:37
(68) за что ж их поднимать, если вам инструменты делают все проще и проще? :) Вот я понимаю на си многопоточку писать - муторно, непонятно, куча всяких мьютексов, семафоров, тредов, хрен проссышь одним словом. А тут раз - и асинк процедура, все готово :)))
70 Ненавижу 1С
 
гуру
21.04.20
08:47
а как это будет в транзакции? транзакция когд будет закрываться, если вызвана неявно из записи и/или проведения?
71 dmt
 
21.04.20
09:28
(70) наверное, все эти ждать и асинх должны работать только на клиенте, а там разве есть неявные транзакции?
72 Ненавижу 1С
 
гуру
21.04.20
09:39
(71) если только на клиенте и если это не будет работать в обычном приложении
73 d4rkmesa
 
21.04.20
10:09
(0) "Нрааавица"
74 1CnikPetya
 
22.04.20
00:32
(17) Ну, 1CFresh уже много лет. Рынок SaaS решений - растет очень быстро и если не захватить его, то кто-нибудь уведет малые и средние компании. Поэтому приходится подстраиваться под Web.

(21) Сейчас, если надо использовать 2-3 ассинхронных вызова - это ад. А если еще что-нибудь в цикле, то это просто дикость начинается. Новая реализация позволит решать задачи намного более удобны образом.
75 ptiz
 
22.04.20
11:52
Такими темпами мы доживем до заметок из зазеркалья, где обсуждаются методы трассировки лучей.
76 Serginio1
 
22.04.20
12:25
(75) Дожить бы до замыканий
77 fisher
 
22.04.20
12:31
(0) Ну, наконец-то. Я уж и не чаял. А вот замыканий я бы не ждал. Уверен, что их не будет.
78 fisher
 
22.04.20
12:32
По той же причине, что и классов.
79 Вафель
 
22.04.20
12:38
Не совсем понятны стенания про замыкания когда нет параметров функций.
В формально в механизме асинк авайт замыкания есть
80 Вафель
 
22.04.20
12:39
Ведь что такое авайт.
Это разбиение процедуры на 2 (внутреннее) и коллбэк
81 minsk1s
 
23.04.20
14:04
(57) - там резерв для слова Экспорт))

(72) только для клиента функционал. для сервера нет и не может быть
кому интересно вот бета код: 1cnik.by/asinhronnye_funkcii.php
82 Garykom
 
гуру
23.04.20
14:08
(80) Хочешь чтобы были замыкания/коллбэки в 1с в виде:

Процедура Верхняя()

Ждать Процедура Нижняя()
//.. тут левый код
КонецПроцедуры

КонецПроцедуры
83 Serginio1
 
23.04.20
16:28
(80) Там автомат строится
https://habr.com/ru/company/otus/blog/488082/

и вызывается в начале и после каждого awaite
84 jbond
 
23.04.20
16:36
85 Ненавижу 1С
 
гуру
23.04.20
17:13
(84) заканчивайте отмечать 1-е апреля
86 Вафель
 
23.04.20
17:47
Я про жс говорил.
Там как раз авайт через промис и колбэк с замыканием
1с вроде тем же путем пошла
87 Serginio1
 
23.04.20
20:08
(86) Что жс,что .Net суть таже. В свое время когда на жс не было async awaite TS сам генерил автомат
  awaite это автомат, а проимис в resolve запускет MoveNext этого автомата.
Да внутри это по сути замыкание с автоматом.
Но 1С почему то игнорирует замыкания.
88 Вафель
 
23.04.20
20:11
(87) в смысле игнорирует?
Какие могут быть замыкания если нет функции параметров?
Что куда замыкать?
89 Serginio1
 
23.04.20
20:24
https://ru.stackoverflow.com/questions/233227/Реализация-замыканий-в-c

По сути получается переменный метода в отдельный класс, переменные замыкания и метод в другой класс.
С точки зрения жс это и есть класс с состоянием
90 Serginio1
 
23.04.20
20:37
91 Вафель
 
23.04.20
20:43
Не понятно что что ты хочешь от 1с когда говоришь про замыкания.
Покажи пример кода как оно могло бы быть
92 Serginio1
 
23.04.20
21:00
(91) Ну я тебе в 89 ссылочку дал.
Замыкания можно использовать при передаче в другую функцию, а также внутри функции или как переменную которую можно изменять.
93 Serginio1
 
23.04.20
21:05
Ну например
Функция НайтиПоУсловию(Тз,Условие,Список="",Модуль="") Экспорт
Массив = новый массив;
Для каждого Стр из Тз Цикл
   Если Вычислить(Условие) Тогда
     массив.Добавить(стр)
   КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции

Приходится использовать Вычислить. А мог бы так

Функция НайтиПоУсловию(Тз,Условие) Экспорт
Массив = новый массив;
Для каждого Стр из Тз Цикл
   Если Условие(стр) Тогда
     массив.Добавить(стр)
   КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции
94 ДенисЧ
 
23.04.20
21:11
(93) Это не замыкание, это, условно говоря, делегат
95 Asmody
 
23.04.20
21:31
(92) ты путаешь лямбды и замыкания
96 Serginio1
 
23.04.20
21:43
(94) Ничего я не путаю. В качестве Условие может выступать как статическая функция так и метод объекта.
С точки зрения .Net  замыкание это метод класса. Просто класс генерится автоматически и захватывает переменные метода, которые могут изменятся и из других замыканий.
Я уже давал ссылку на реализацию замыкания в .Net
https://ru.stackoverflow.com/questions/233227/Реализация-замыканий-в-c
97 Serginio1
 
23.04.20
21:44
Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.
98 Serginio1
 
23.04.20
21:46
Лямбда-выражение в программировании — специальный синтаксис для определения функциональных объектов, заимствованный из λ-исчисления. Применяется как правило для объявления анонимных функций по месту их использования, и обычно допускает замыкание на лексический контекст, в котором это выражение использовано. Используя лямбда-выражения, можно объявлять функции в любом месте кода.
99 Serginio1
 
23.04.20
21:52
Сам делегат Условие может замыкать на себя данные метода из которого вызывается функция НайтиПоУсловию(Тз,Условие)
Например это могут использоваться данные из запроса и также другие замыкания. На яркий пример Linq который построен на лямдах выражениях в которых захватывается контекст метода
100 Asmody
 
23.04.20
22:18
В примере (93) у тебя и не лямбда, и не замыкание. А функция высшего порядка
101 Вафель
 
23.04.20
22:23
Ну собственно про что я и говорил
О каких замыканиях идёт речь пока нет функций параметров
102 Serginio1
 
23.04.20
22:30
(100) Меня Вафель спаривал зачем мне замыкания. Я ему привел пример. В качестве делегата может выступать замыкание и как правило оно и будет выступать.
В примере как раз не лямда, а функция (делегат). Лямбда выражение это немного другое, это локальная функция которая может захватывать контекст
https://ru.wikipedia.org/wiki/Лямбда-выражение
x => x * 5
103 Вафель
 
23.04.20
22:40
Ты видно совсем не понимаешь о чем я говорю
104 Serginio1
 
23.04.20
22:40
(101)  Вот пример использования без параметров

Можно внутри функции создавать и использовать замыкание
Процетура ТестЗамыканий();
delegates = новый Массив;
        outside = 0; // #1 Создает экземпляр переменной только однажды

        Пока (i<2)
        {
            inside = 0; // #2 Создает экземпляр переменной многократно
            массив.Добавить(() => delegate // #3 Захват переменной анонимным методом
            {
               Сообщить(""+ outside+"," inside);
                outside=outside+1;
                inside=inside+1;
            };
        }

first=массив[0];
second=массив[0];

first();
first();

        first();

        second();
        second();
        first();

        
        second();
КонецПроцедуры

Сначала нужны переменные типа замыкания
105 Вафель
 
23.04.20
22:41
Я не спрашивал тзачем нужны замыкания
Я спрашивал (101)
106 Serginio1
 
23.04.20
22:42
Или переменные функции. Суть переменных функций без замыканий мало. Так или иначе замыкания нужны и уже давно.
107 Serginio1
 
23.04.20
22:45
(105) Так назовем нужен тип Функция. Так тебя устроит?
То что нет типа функция поэтому нет и параметров функция и замыканий.

Или так нужен тип параметра функция! Так тебя устроит?
108 Вафель
 
23.04.20
22:50
Ну вот другое дело
109 Serginio1
 
23.04.20
23:05
Так какой смысл замыкания без типа функция? Понятно, что должен быть и тип это помему и … понятно?
110 Cthulhu
 
23.04.20
23:08
еще замыкание - и можно переименовывать в 1с# ?.......
111 Serginio1
 
23.04.20
23:21
(110) Так они ввеели async awaite из JS так что 1С_JS
112 Serginio1
 
23.04.20
23:23
Кстати метод "Выполнить" захватывает локальный контекст.
113 DTX 4th
 
24.04.20
00:43
Я ржу
Асинки без замыканий и стрелочных функций, огонь
Пздц, бафните язык уже, а то кодить большой.
114 DTX 4th
 
24.04.20
00:45
больно*
115 Asmody
 
24.04.20
01:17
(113) я ржу с Обещание.
Такое впечатление, что архитекторам языка иногда заносят интересные книжки.
116 Cthulhu
 
24.04.20
01:54
на самом деле вот про 1с... так, на всякий случай - взгляните на рукописное начертание буквы "алеф"...
117 APXi
 
24.04.20
08:27
(19) А разве у процедуры ЗаполнитьТовары(Команда) не должно быть впереди Асинк?
118 Сияющий в темноте
 
24.04.20
17:05
(100) скорее даже,указатель на функцию,который,кстати в 1с реализовали через обработкаоповещения.
(113) у них в общих модулях только локальные переменные,так что до замыканий им очень далеко.
хотя,через ту же обработку оповещения это все реализуется.
а собственно,как и сама обработка через структуру.

хочешь указатель на функцию-все просто:
новый Структура("Имя,Модуль,Параметры,КонтекстЗамыкания")
и в путь ^_^
119 Serginio1
 
24.04.20
17:16
(118) Замыкание кстати может изменять контекст. Придется вручную восстанавливать контекст
120 ptiz
 
24.04.20
17:21
Навеяло вашими диалогами.
Может когда-нибудь в 1С 8 сделают и такую вещь как "Контекст"? В 7.7 ведь было!
121 Serginio1
 
24.04.20
17:28
(120) Здесь под контекстом понимаются переменные функции и родительских замыканий. Замыкание может быть вложено в замыкание
122 Сергиус
 
24.04.20
17:29
(120)В чем суть 7-ного контекста?
123 Eiffil123
 
24.04.20
17:34
Особо обрадуются разработчики, которые использовали переменные с именами новых ключевых слов.
124 Serginio1
 
24.04.20
17:53
(123) Ну наверное нужно сделать рефакторинг.
125 Djelf
 
24.04.20
18:19
(115) Да, "Обещание" как то не очень.
Оно может что-то вернуть, или не вернуть, и вообще обмануть...
Нужно было бы использовать слово "Клятва", чтобы гарантировать возврат.
126 Сияющий в темноте
 
24.04.20
18:32
(125)обещание результата.
вполне нормально.
(119) ну,если контекст это структура,то вполне нормально-ссылок много,а структура одна.
просто,переопределить работу со структурой,и все будет работать.
(123) они это уже проходиди,у них в БСП были функции,которые потом стали встроенными,но с другим набором параметров,так что им по граблям не привыкать ходить,и другим предлагают.
127 Сияющий в темноте
 
24.04.20
18:35
потом,в 1с просто нет статических переменных,а время жизни переменной-вопрос открытый,боюсь,что компилятор их выкидывает из памяти еще до выхода из функции.
128 Сияющий в темноте
 
24.04.20
18:47
В 7.7 контекст работал очень похоже на значение контекста,а в 8 его заменили обьектом,где также экспортные функции доступны.
129 Serginio1
 
24.04.20
18:56
(126) Прелесть лямбда выражений, что они создаются по месту. В .Net в начале не было замыканий, можно было использовать только методы.
Было очень неудобно. Затем появились анонимные делегаты, а затем и лябда выражения и те и другие замыкали контекст, но с лямбда выражениями запись была более лаконичной.

Но хотя бы можно было передать метод класса. В 1С и этого нет.

Ну как я уже писал
Функция НайтиПоУсловию(Тз,Условие) Экспорт
Массив = новый массив;
Для каждого Стр из Тз Цикл
   Если Условие(стр) Тогда
     массив.Добавить(стр)
   КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции

нужно передать не только контекс, но и метод отбора.

Пока это вызывается так

Функция НайтиПоУсловию(Тз,Условие,Список="",Модуль="") Экспорт
Массив = новый массив;
Для каждого Стр из Тз Цикл
   Если Вычислить(Условие) Тогда
     массив.Добавить(стр)
   КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции

// Примеры использования
//тз=НайтиПоУсловию(тз,"Стр.Колонка1<20 и Стр.Колонка2>500");
//  или
//Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок("Иванов,Сидоров,Петров");

//Рез=НайтиПоУсловию(тз,"Список.Найти(стр.ФизЛицо)<>Неопределено");

//Или

//Рез=НайтиПоУсловию(тз,"Найти(Врег(стр.Значение),Врег(""акф""))>0");

//Рез=НайтиПоУсловию(тз,"Модуль.ФункцияСравнения(Стр,Список)",МассивСтруктур,ЭтотОбъект);

//То есть в модуле обработки должна быть функция
//  Функция ФункцияСравнения(стр,МассивСтруктур) Экспорт
130 Serginio1
 
24.04.20
18:57
При этом Вычислить как раз и замыкает контекст.
http://catalog.mista.ru/public/371762/
131 Злопчинский
 
24.04.20
19:14
(128) "а в 8 его заменили объектом," - а что тут есть "объект"..?
132 Злопчинский
 
24.04.20
19:16
(122) в точто тебе через "контест" - доступны переменные, процедуры и функции этого контекста.
например из открытой формы обработки можно вызвать другую обработку - и передать в нее "контекст" родительской обработки. Дочерняя обработка может обновить например форму родительской обработки, стукнуться и выполнить ее процедуры...
133 Djelf
 
24.04.20
19:23
(126) А кто тебе обязан отдать "обещание"? Это флирт, и по факту флирта, никто, никому, ничему, ничего не обязан.
134 Garykom
 
гуру
24.04.20
19:27
(133) Он ждал, ждал - а она не дала... результат функция
135 Djelf
 
24.04.20
19:30
(134) А если вообще не дала и упала в колодец? Или зависла на 100 дней над наблюданием прохождения Юпитера над Сатурном?
136 Djelf
 
24.04.20
19:33
Я не говорю что это не правильно, нужно посмотреть это на реальных примерах.
137 Serginio1
 
24.04.20
19:40
(136) Для этого есть
awaite Task.WhenAny(ВыполняемаяЗадача, Task.Delay(сколько нужно миллисекунд)
Правда нужно предусмотреть и прекратить задачу
138 Djelf
 
24.04.20
20:16
(137) Отсутствие этого в 1С, меня и ввело в ступор непонимания, как оно должно и будет работать.
Волноваться и внедрять пока незачем, посмотрим как оно будет в бсп внедрено и какие костыли к этому решению они там придумают.
139 mikecool
 
24.04.20
21:22
читаю холивар про замыкания и не пойму их прикладного примера )
140 Serginio1
 
24.04.20
21:54
(139)
НайтиПоУсловию(тз,Стр=>Стр.Колонка1<20 и Стр.Колонка2>500);
141 Serginio1
 
24.04.20
21:58
Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок("Иванов,Сидоров,Петров");

Рез=НайтиПоУсловию(тз,стр=>Список.Найти(стр.ФизЛицо)<>Неопределено);





Рез=НайтиПоУсловию(тз,стр=>Найти(Врег(стр.Значение),Врег("акф"))>0");


Рез=НайтиПоУсловию(тз,Модуль.ФункцияСравнения);

где Фун Модуль.ФункцияСравнения(Стр) функция модуля
142 DTX 4th
 
24.04.20
21:59
(115) Я сначала тоже.. Но потом вспомнил, что мы на русском кодим, и как-то отлегло)

(118) От указателя на функцию без возможности динамического создания функций (локальных функций, ну или как это называется) толку особо нет

(139) Удобно доработки группировать.
Если скинуть все таблицы обработки клиент банка к себе модуль, модуль превратиться в помойку. На клиенте могут помочь формы, а вот на сервере туго

(140) +++
Давно о такой штуке мечтаю. Думал даже общий модуль запилить, но потом понял, что нельзя нормально вернуть объект с процедурами...
143 Serginio1
 
24.04.20
22:02
(142) Я Вычислить часто  использую, когда нужно унивесальную функцию запилить см (129)
144 Serginio1
 
24.04.20
22:06
Функция НайтиПоУсловию(Тз,Условие,Список="",Модуль="") Экспорт
Массив = новый массив;
Для каждого Стр из Тз Цикл
   Если Вычислить(Условие) Тогда
     массив.Добавить(стр)
   КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции


Например ФункцияСравнения определена в этом же модуле (ЭтотОбъект)
МассивСтруктур определен в функции


Рез=НайтиПоУсловию(тз,"Модуль.ФункцияСравнения(Стр,Список)",МассивСтруктур,ЭтотОбъект);

тогда Список и Модуль будут подставляться из параметров
145 DTX 4th
 
24.04.20
22:14
(143) Интересная идея, запомню)
У меня из таких хаков самая часто используемая -

Функция Выполнить2(Выражение, Контекст)
  Выполнить(Выражение);
  Возврат Истина;
КонецФункции


И можно во время пазу процедуры выполнять :)

Сейчас не вспомню, но что-то типа
Выполнить2("Контекст.Сортировать(""Колонка1""), Таблица)
:)
146 DTX 4th
 
24.04.20
22:14
*во время паузы в отладчике
147 _KaA
 
24.04.20
22:23
(39)

Вы очень сильно "округлили". А как же пользователей сервисов 1cFresh? А как же мобильные клиенты? И даже если сейчас пользователи ВЕБа и Мобилки это, навскидку, от 10 до 20%, то в будущем этот процент будет только увеличится...

И незабываем, что очень много процессов между собой связаны, поэтому вполне можно допустить что это новшество является частью другого проекта на развитие...
148 Serginio1
 
24.04.20
22:30
(145) Вот поэтому и хочется нормальных замыканий как во всех языках.
Хотя и Выполнить очень удобная функция, особенно когда внутри вызываются ёмкие функции
149 Сияющий в темноте
 
24.04.20
22:33
На самом деле,все растет от интерпретатора.

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

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

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

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

асинхронное исполнение,кстати,страдает тем же дефектом-все переменные функции будут жить до ее завершения.
ну и,можно было реализовать что-то типа DoEvents,как это бвло в VbScript для обработки асинхронных событий,когда мы в коде разрешаем их выполнить,а потом проверяем результаты,но нет,было решено изобретать велосипед с квадратными колесами.
соответственно,ждем возможность ожидать заданный интервал времени и возможность ожидать несколько зааершений сразу с аозможностью обработки завершенного-тогда весь код формы можно будет реализовать в одном цикле.
собственно говоря DoEvents делает именно это-отдать управление системе и сохранить контекст.
просто,вместо выхода из функции,можно вызывать другую функцию,которая реально делает ввход с сохранением еонтекста и потом вход обратно.
150 Сияющий в темноте
 
24.04.20
22:41
еще одно очень полезное применение указателя на функцию-это итераторы.
например,обход дерева-это вложенные рекурсивные вызовы,но не хочется об этом думать каждый раз-пишкм один раз алгоритм обхода,а потом передаем ему функцию,которую он ввзовет для каждого элемента,и все.
151 Вафель
 
24.04.20
22:48
(150) это называется функциональное программирование
152 Вафель
 
24.04.20
22:51
(149) вообще-то этот велосипед уже давно был изобретен и не 1с а в жаваскрипте
153 Serginio1
 
24.04.20
23:08
(149) Одна из проблем 1С это то, что отсутствует сборка мусора. Жизненный цикл ссылки построен на подсчете ссылок. Но и в этом тоже не проблема.
По сути при использовании замыкания нужно заниматься кодогенерацией. Но это не проблема при компиляции в БайтКод.
Все давным давно придумано
154 Serginio1
 
24.04.20
23:16
Уще когда в JS не было async awaite TS генерил код плохочитаемый
https://stackoverflow.com/questions/56306701/typescript-generates-awaiter-generator-when-using-promises

Вот здессь хоть с ошибками но попонятнее
https://stackoverflow.com/questions/42412145/what-is-a-state-machine-in-terms-of-javascript-promises-and-c-sharp-asyc-await
155 Сияющий в темноте
 
25.04.20
14:11
в 1с уже есть сборщик мусора не только на подсчете ссылок.
но граф с клиента на сервер или обратно она так передавать и не научилась.
и по вложенности тоже двоит обьекты.

а обещание,это еще и шаг в многопоточность
потом могут сделать ВыполнитьВНовомПотоке и в ответе тоже обещание,тем более,что новые браузеры фоновое исполнение уже умеют.
156 Сияющий в темноте
 
25.04.20
14:17
и важна сборка мусора на клиенте,так как на сервере можно после завершения исполнения кода все,чтотон себе выделил,просто осаободить и нн бояться.
157 ДенисЧ
 
25.04.20
14:38
(156) @сервере можно после завершения исполнения кода все,чтотон себе выделил@
Память не ресурс (с)

У меня тут где-то метла завалялась... Пойду, испоганю...
158 Serginio1
 
25.04.20
16:24
(156) На сервер передаются сериализованные данные (можно конечно держать серверную ссылку на  клиенте, но это не для 1С). Никто не держит ссылки на сервере или клиенте. Там своя кухня.
Хотя это и возможно https://habr.com/ru/post/323096/  При финализации объекта.
Единственно, что можно присвоить результат сервера клиенту.

А вот про сборщик мусора в 1С поподробнее пожалуйста? В .Net головная  боль сочетать COM с подсчетом ссылок и сборка мусора
159 Garykom
 
гуру
25.04.20
16:35
(149) Интересно когда в 1С можно будет новые расширения писать и добавлять программно ))
160 Сияющий в темноте
 
25.04.20
20:05
(159)
расширения и сейчас можно программно добавить,но само расширение,это перехват вызова функции.
161 Garykom
 
гуру
25.04.20
20:43
(160) Подразумевал когда конфа (точнее расширение) саму себя "дописывает" ))
Новые расширения делает и подключает.
162 Вафель
 
25.04.20
22:01
(161) уже сейчас можно
163 Сияющий в темноте
 
26.04.20
11:53
расширение можно загрузить из xml в отдельный конфигуратор
потов выгрузить в cfe и программно подключить в конфу
164 Сияющий в темноте
 
26.04.20
11:54
на самом деле,программно и конфигурацию редактировать уже можно без особых проблем
просто исполнителя запустить на другой временно созданной конфигурации
165 Bro
 
26.04.20
13:03
(158) Кстати тоже интересно про сборку мусора. Потому как та же Java только к 11-й версии выкатила что-то более удобоваримое в виде G1. Потому как тот же CMS приводил к фрагментации и периодически (особенно при нагрузке) уходил в STW сборку мусора (причем в однопоточную (!) так как Oracle решил похоронить CMS уже очень давно). Причем даже G1 достаточно сложный неочевидный сборщик мусора (и там по дефолту в Java очень странная есть настройка, которая уже на среднем highload'е может приводить к жестким STW паузам).

ЗЫ: Самое главное в сборщике мусора это работа с цикличными ссылками если что (без цикличных ссылок, обычный подсчет ссылок работает на ура).
166 Fragster
 
гуру
27.04.20
21:24
У кого есть доступ, поддержите тупых 1сников, которые считают, что асинхронность в текущем виде должна быть невидимой со стороны прикладного кода https://partners.v8.1c.ru/forum/topic/1906773
167 DTX 4th
 
28.04.20
20:08
(142) Вспомнил, чего мне не хватает
Хочу иметь возможность чейнить такие методы.
Типа ТЗ.Выбрать(Строка => Строка.Колонка3).Сортировать().ВыбратьПервые(10)
168 DTX 4th
 
28.04.20
20:09
Мб кто что подскажет
169 Cyberhawk
 
28.04.20
20:27
(166) Как предлагается поддержать? Удали ту ссылку и дай нормальную с номером сообщения, которое надо плюсануть, и не позорься
170 trdm
 
28.04.20
20:43
А куда пул-реквесты 1С-у засылать?
https://prnt.sc/s7j438
Виснет на диалогах, 8.3.17.1386
171 Serginio1
 
28.04.20
20:50
(167) Это Linq называется. Опять же нужны замыкания https://metanit.com/sharp/tutorial/15.1.php
Но на том же C# есть методы расширения https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
для расширения Linq
172 Ненавижу 1С
 
гуру
29.04.20
07:58
(171) для вот данного примера в (167) они не нужны
173 Serginio1
 
29.04.20
10:01
(172)  ТЗ.Выбрать(Строка => Строка.Колонка3). а это что?
174 Fragster
 
гуру
29.04.20
11:14
(173) вероятно оставить от таблицы только колонку 3
175 Serginio1
 
29.04.20
11:28
(174) Это понятно, разговор про то, что в данном примере замыкания (лямбда выражения) не нужны Строка => Строка.Колонка3
176 Fragster
 
гуру
29.04.20
11:34
(175) ну, то, что возврат копии объекта (или самого объекта) из методов не требует лямбд - правда. а вот для сортировки, фильтрации, сворачивания и преобразования - очень даже нужны, упрощают код для написания и понимания в разы.
177 Serginio1
 
29.04.20
12:02
(176) Пойми я этим линком пользуюсь каждый день и прекрасно понимаю, что и зачем. Мало того, что линк используется для коллекций, но еще и для БД с формированием запросов.
Тут даже на С++ прикручивают. А 1С плетется в хвосте. Надеюсь async awaite это первая ласточка
178 DTX 4th
 
29.04.20
13:56
(171) Да, да, у меня шарп входит в тройку основных языков помимо js и 1С)
Только вчера приложение под мак на netCore собрал, которое дергает скрипт питона, чтобы получить активное окно :D
179 jbond
 
29.04.20
15:41
После короны в России останутся живые Java и Salesforce программисты?
180 sitex
 
naïve
29.04.20
15:48
(179) Если только будут удаленно работать на запад.
181 Fragster
 
гуру
29.04.20
15:50
все в 1с уйдут