Синхронная асинхронность в «1С:Предприятие 8.3.18»

22.04.2020      210959

Фирма «1С» рассказала об улучшении синтаксиса языка 1С для работы с асинхронными функциями. Новая форма работы с асинхронностью будет реализована в технологической платформе «1С:Предприятие 8.3.18».

Новая асинхронность в «1С:Предприятие 8.3.18»

«В версии 8.3.18 будут внесены изменения для того, чтобы упростить работу с асинхронностью. В основе лежит идея, что разработчику проще и понятнее видеть код, состоящий из набора последовательно выполняемых операций и содержащий минимальное количество деталей, не связанных напрямую с решаемой им задачей. Сделанные изменения направлены на то, чтобы сделать код, имеющий дело с асинхронностью, максимально подобным обычному последовательному коду», – говорится в описании очередного нового релиза на страницах официального технологического блога «Заметки из Зазеркалья».

Близким аналогом новой асинхронности в «1С:Предприятие 8.3.18» является тип Promise и конструкции async/await языка JavaScript (тип Promise был добавлен в язык стандартом ECMAScript 6, а async/await – ECMAScript 2017). А одним из драйверов текущих изменений разработчики называют появление в свое время в технологической платформе веб-клиента, который потребовал поддержки асинхронной модели работы.

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

Как это будет работать

Сама суть асинхронности, уже реализованной в «1С:Предприятии», не меняется. Речь идет о новой форме работы с асинхронностью, в которую включены три составные части:

  • тип Promise/Обещание;
  • новые асинхронные функции платформы, возвращающие Обещание;
  • конструкции Асинх/Async и Ждать/Await во встроенном языке.

Разработчики утверждают, что основная магия скрыта в операторе Ждать: «Новое состоит в том, что в операторе Ждать выполнение Асинх процедуры/функции может приостанавливаться и возобновляться. Приостановка означает выход из процедуры/функции с возможностью последующего продолжения. Но элемент стека вызовов, соответствующий приостановленной процедуре/функции не очищается и не удаляется. И при возобновлении выполнение начинается с той же точки, где оно было приостановлено с тем же окружением, включая значения локальных переменных, что было до приостановки».

Таким образом, выполнение оператора Ждать выглядит следующим образом:

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

 

Новая и старая асинхронность. Источник: wonderland.v8.1c.ru

 

Иными словами, оператор Ждать позволяет организовать точку приостановки/возобновления выполнения в любом месте Асинх процедуры/функции без создания объекта ОписаниеОповещения() и отдельной процедуры обработчика оповещения.

Когда это будет работать

Предполагается, что новая модель асинхронной работы появится в релизе платформы «1С:Предприятие 8.3.18». Но выход нового релиза не будет означать автоматического перехода на «новые методы работы». Очевидно, потребуется рефакторинг кода, а также добрая воля разработчиков, которые должны будут начать использовать новые возможности. Если для этого перехода не будет применяться никаких стимулирующих мер, то процесс может очень существенно растянуться во времени.

Подробнее о новой форме работы с асинхронным кодом в платформе «1С:Предприятие 8.3.18» в технологическом блоге «Заметки из Зазеркалья»


Автор:
Обозреватель


См. также

Новость Зазеркалье

Официальный технологический блог фирмы «1С» объявил о новых функциях в 1С:Предприятие 8.3.28. Разработчики расширили возможности настройки двухфакторной аутентификации, сделав их более гибкими.

01.10.2024    2636    ЕленаЧерепнева    0       

1

Новость Зазеркалье

Официальный технологический блог разместил сообщение о новых возможностях релиза технологической платформы 1С:Предприятие 8.3.28. Разработчики собираются добавить новые возможности для работы с механизмом копий баз данных.

10.09.2024    1267    ЕленаЧерепнева    1       

2

Новость Платформа 1С v8.3 Зазеркалье

Фирма «1С» продолжает развивать механизм хранилищ двоичных данных. Разработчики обещают добавить в 8.3.28 горизонтальное масштабирование хранилища, а также возможность переносить данные из хранилища в базу данных и обратно.

23.08.2024    1155    ЕленаЧерепнева    0       

2

Новость Зазеркалье

Фирма «1С» объявила о начале программы бета-тестирования технологической платформы 1С:Предприятие версии 8.3.27. Присоединиться к испытаниям тестовой версии может любой партнер «1С» или компания-пользователь бесплатно.

16.08.2024    840    ЕленаЧерепнева    0       

1

Новость Платформа 1С v8.3 Зазеркалье

Фирма «1С» опубликовала актуальную версию плана задач для технологической платформы 1С:Предприятие 8.3.28. Некоторые задачи разработчики отложили, а какие-то отметили как выполненные. Рассказываем о возможностях будущего релиза 1С 8.3.28.

15.08.2024    1081    ЕленаЧерепнева    0       

2

Новость Зазеркалье

Фирма «1С» поделилась планами по развитию технологической платформы. В будущем релизе 8.3.27 будет увеличено предельное количество записей для табличной части. Сейчас максимальное число строк равно 99 999. Планируется увеличить лимит до 999 999 999.

06.08.2024    4803    ЕленаЧерепнева    6       

1

Новость Зазеркалье

В платформе 8.3.27 будет доступно: завершение сеансов внешних компонент, управление расширениями в конфигураторе базовой, отключение сессий при обновлении через агента конфигуратора, оценка срока действия ключа КЭП и асинхронное удаление логов ТЖ.

30.07.2024    2808    ЕленаЧерепнева    0       

2

Новость Платформа 1С v8.3 Зазеркалье

Фирма «1С» сообщила о запланированных на релиз 8.3.27 изменениях. От нового релиза платформы можно ожидать ускорения в работе, новых возможностей для управления хранилищем двоичных данных, а также асинхронного создания объектов внешних компонент.

23.07.2024    6988    ЕленаЧерепнева    1       

1
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. TreeDogNight 22 22.04.20 14:35 Сейчас в теме
Отличная новость! Теперь осталось дождаться появления асинхронной синхронности и будет всем счастье :)
o.nikolaev; +1 Ответить
23. Darklight 32 23.04.20 14:44 Сейчас в теме
(1)Так ведь именно асинхронную синхронность компания 1С и предложила в 18-релизе! Никакой параллельности в ней нет! Чистая квази-асинхронность!
unduty; TreeDogNight; +2 Ответить
2. user623969_dusa 22.04.20 15:00 Сейчас в теме
что теперь движок 1с пишут на яваскрипте - фишка с асинх функциями оттудова)
3. bobank 201 22.04.20 15:39 Сейчас в теме
(2) а веб клиент по твоему как должен работать. канешна оттудова.
4. VmvLer 22.04.20 16:27 Сейчас в теме
только привыкли в оповещениям и тут ветер переменился

этого никогда не было в реале...
отдел перспективных разработок возглавил жаваспритолог и тут же заявил

- Так, шо у вас за муть с оповещениями!?
- По просьбе трудящихся наваяли ассинхронный функционал.
- Шо, а где Promise и Await?
- Так это же те же яйца?!
- Чепуха - пусть будет вид сбоку, снизу и любом ракурсе одной и то же шняги.
- Зачем этот зоопарк?!
- Нубы должны страдать!
ikalmykia; mevgenym; asg.aleks; magdeevik; Yashazz; HystriX; Brawler; shard; suepifanov; TreeDogNight; +10 Ответить
7. akpaevj 206 22.04.20 18:57 Сейчас в теме
(4) Это дополнение к callback'ам, в статье не говорится о запрете использования старого механизма. Async/await - сахар, который существенно сокращает объем вызова асинхронного кода, но так-же имеющий свои недостатки в необходимости модификации всей цепочки вызовов как async/await. Пока непонятно как будет организована работа event'ов (возможно ли будет применение модификаторов к ним) и что с менеджерами task'ов. В целом, многие языки перенимают эти конструкции, в C# это прижилось как родное. Именно из-за необходимости модификации цепочек и переписки кода вызовов, перевод кодовой базы существующих решений займет, вероятно, очень длительное время.
Drivingblind; orfos; by_1Cnik; +3 Ответить
25. Darklight 32 23.04.20 14:54 Сейчас в теме
(7)Ну, например, в ожидаемой платформе MS .NET 5 от колбэк-функций полностью отказались в дизайне API - перейдя на модель async/await
Что мешает 1С сделать так в будущем - и если даже не уберут текущие функции "Начать...()" то все новые могут быть уже только "Асинх функция ....Асинх()"
Проблема в том, что в .NET и Java - нет проблем с многопоточностью и созданием собственных асинхронных функций, не основанных (тупо полусинхронно оборачивающих) на встроенных асинхронных функций.
А, вот, в JavaScript такая проблема - есть - там нет гибкой многопоточности - хоть и обходными путями её можно получить (чуть легче чем в 1С через фоновые задания на сервере) - но на клиенте (а в 1С на клиенте этого никак не получить даже обходными путями)! От чего польза от этих промисов в 1С крайне сомнительная! Хотя да - в ряде случаев чисто синтаксически они очень даже помогают писать программный код, вынуждено нуждающийся в применении встроенных асинхронных функций - но не более чем! То есть - по-прежнему пляшем от нужды - а не от эффективности, красоты и удобства!
28. akpaevj 206 23.04.20 15:24 Сейчас в теме
(25) Как я и сказал, показанные сниппеты довольно скудны. Вообще, я не пойму в чем Ваше негодование то?:) По-моему, это исключительно положительное веяние, но все зависит от того, как механизм task`ов будет реализован в платформе.
TreeDogNight; +1 Ответить
31. Darklight 32 23.04.20 16:55 Сейчас в теме
(28)Вянье положительное - я этого не отрицал. Просто опять предлагают "шило вместо мыла"! Одна сплошная "иллюзия обмана"!
52. Yashazz 4779 10.11.20 20:03 Сейчас в теме
(4) Когда я им N лет назад высказал, что все эти их оповещения - костыльная кромешная жуть, они обижались и твердили, что так-де и надо, а "эти ваши js-замашки идут лесом". И десяти лет не прошло.
5. leemuar 22.04.20 17:15 Сейчас в теме
Кажется *EvilBeaver напьется. Если уже не :)
6. Evil Beaver 8197 22.04.20 17:33 Сейчас в теме
(5) почему ты так решил?
8. leemuar 22.04.20 22:03 Сейчас в теме
(6) помню в какой-то ветке ты предлагал свою помошь разработчикам, чтобы сделать "нормальную" асинхронность, ругал оповещения. Подумал тебе понравится эта новость :)
12. Evil Beaver 8197 23.04.20 09:37 Сейчас в теме
(8) нет, они сделали всё через одно место обсуждалось в Телеграме. Я грущу
Darklight; +1 Ответить
9. Brawler 458 23.04.20 00:09 Сейчас в теме
Конечно эта новость интересна, но до 8.3.18 типовым конфигурациям еще как до луны и обратно.
Потом я лично ожидаю, что убогость по работе с торговым оборудованием перепишут под новый механизм, так как то что сейчас есть с оповещениями, это лютая жесть, которую отладить порой невозможно во вменяемые сроки чтобы найти причину ошибок оборудования...
distorshion; starik-2005; TreeDogNight; +3 Ответить
10. mr_best_23rus 31 23.04.20 04:13 Сейчас в теме
Ура! Дошло до до жёлтых, не прошло и пол века. Ещё бы нармальное ооп сделали бы. Хотя, ещё пол века не прошло...
13. Evil Beaver 8197 23.04.20 09:38 Сейчас в теме
(10) есть мнение, что людям, которые не умеют писать слова без ошибок, и нормальное ООП ни к чему... Все равно, что зайцу - микроскоп.
user1118428; Yashazz; TreeDogNight; HystriX; mpeg1989; o4karek; +6 Ответить
36. mr_best_23rus 31 24.04.20 03:30 Сейчас в теме
(13) Нармально все, ты сам папробуй ООП, мозет панравитса!
27. Darklight 32 23.04.20 15:14 Сейчас в теме
(10)Рано радуетесь - тут всё, как всегда, через ж...
11. vipetrov2 23.04.20 07:28 Сейчас в теме
Компания 1С ерундой занимается. По сути эти нововведения добавляют работы разработчикам конфигураций, а за все эти бесполезные манипуляции будут платить клиенты. Т.е. 1С придумала сама себе бесполезную работу и содрала за это деньги с клиентов.

После вызова НачатьКопированиеФайла() интерфейс заблокируется и смысла нет в этих асинхронных вызовах. Если бы интерфейс хотя бы был друхпоточный, т.е. использующий шаблон программирования Model-View, то было бы все хорошо, но в 1С на стороне клиента этого нет. И все эти функции Начать... и прочие только вред приносят, потому что вынуждают делать переработку кода конфигурации и делают его более сложным к прочтению.
14. Evil Beaver 8197 23.04.20 09:42 Сейчас в теме
(11) сижу и думаю, прокомментировать этот бред или не стоит... model-view, потоки, интерфейс заблокируется...ну и каша в голове у людей...
d4rkmesa; by_1Cnik; Isakov_Artem; HystriX; +4 Ответить
17. Darklight 32 23.04.20 12:57 Сейчас в теме
(14)Не - ну про блокировку интерфейса там здравые слова - вся эта асинхронность - пока очень бестолковая!
Смотрел финальный пример из зазеркалья (причём очень дурацкий и кривой пример) - там на клиенте стартовой функцией (вернее процедурой) является КопироватьФайлы(Команда) - судя по всему - некая команда обработчика нажатия кнопки (допустим это). Так вот, лично мне не понятно - будет ли эта команда обрабатываться с блокировкой всего интерфейса (или он будет блокироваться урывками). В старой модели "асинхронности" на каллбэк-функциях - можно было написать без блокировки (с кучей "НО").

С другой стороны - допустим мне нужно ассинхронно (оставив интерфейс незаблокированным только в этой части) выполнить только часть кода внутри команды - как мне тогда поступить?
19. TreeDogNight 22 23.04.20 13:39 Сейчас в теме
(17) Выводить эту часть кода в отдельную асинхронную процедуру. При этом процедура-обработчик команды асинхронной не будет.
21. Darklight 32 23.04.20 13:50 Сейчас в теме
(19)Не понимаю. Вот мне нужно сначала синхронно что-то изменить на форме - затем выполнить какую-то асинхронную операцию - не блокируя форму - а затем снова что-то сделать на форме, блокируя её до завершения операции Как?

Если команда, вызывающая асинхронный обработчик не будет блокировать форму на этот вызов - то и внутри я не смогу её заблокировать (разве что друступность = Ложь выставить - но это, как Вы, понимаете, немного другое - ведь речь о всём клиентском контексте).
Если команда вызывает асинхронный обработчик блокируя контекст формы - то тут он так и останется до конца выполнения заблокированным.
Если же вызывать не асинхронный обработчик - то в нём я уже не смогу ждать завершение асинхронной части - чтобы довыполнить не асинхронную Не - ну можно - кеонечно через подлкючение обработчиков ожидания выкрутиться - то это именно ВЫКРУТИТЬСЯ для определённого случая!

В классической модели асинхронности клиентского контекста 1С - асинхронная часть выполнялась асинхронно именно в момент вызова асинхронной функции - и далее завершение уже обрабатывалось как обработка события завершения асинхронности! Но самому создавать такие асинхронные функции было НЕЛЬЗЯ!
29. akpaevj 206 23.04.20 15:37 Сейчас в теме
(21) Опять же, все зависит от реализации механизма в платформе. Вообще, описанная Вами ситуация решается обычно довольно просто:
1. Меняешь значение на форме.
2. Запускается обработчик события с неблокирующим UI вызовом async куска кода.
3. После выполнения асинхронного кода управление возвращается в UI поток.
Это если не баловаться с вызовами, типа ".ConfigureAwait(false)", наличие которых, опять же, зависит от реализации механизма в платформе и насколько глубоко дадут управлять выполнением задач.
30. Darklight 32 23.04.20 16:53 Сейчас в теме
(29)Это я просто пример пытался привести сходу. Возможно он слишком уж натянутый. Просто нет времени сейчас придумывать более реалистичный пример. Так как из-за в привитом уже, 1С, синхронном мышлении - сходу и не сообразишь на тему хорошего асинхронного примера. Чаще всего мне требовали задачи какого-то фонового обновления формы, фонового контроля, и фонового-клиент серверного взаимодействия - когда запросы коротки и городить фоновоые задания просто не целесообразно (или это взаимодействие их никак не может иметь - например это вызов web-сервиса) - или нужно обработать результат их выполнения - не блокируя клиентского контекста (например формируя их на клиенте до фактического востребования пользователем).

Кстати:
1. Это что - синхронный (классический) обработчик команды GUI?
2. Тогда как из синхронного обработчика запустить асинхронный, который Асинх? Ну - вернее запустить то можно - остаётся только вопрос в получении результата его работы и продолжения синхронного выполнения после завершения асинхронной части. Ну - конечно полученное "Обещание" можно сохранить в клиентскую переменную - но всё-равно - нужно какое-то событие - чтобы обработать ожидание её завершения (причём само ожидание должно быть асинхронным, а обработка - уже должна блокировать основной поток выполнения).
3.
После выполнения асинхронного кода управление возвращается UI поток
- вот это мне вообще не понятно. Ведь задача стояла так - чтобы асинхронное выполнение как раз не блокировало GUI пока оно выполняется! А потом был выполнен синхронный код. И формально - на старом подходе через колбэк-функции я ограничено могу это реализовать!
35. akpaevj 206 23.04.20 23:38 Сейчас в теме
(30) Я имел ввиду при запуске из async обработчика команды. Но даже без этого можно корректно отработать Ваш сценарий (при условии наличия необходимого API), что-то вроде:
1. Запускается sync обработчик нажатия кнопки.
2. В нем запускается async метод без ожидания окончания.
3. В конце async метода вызывается метод обновления UI с переключением контекста на UI поток (допустим ThreadHelper.RunOnUI(...));
В общем, это гадание на кофейной гуще. Когда будет документация на механизм, тогда и все вопросы отпадут.
37. Darklight 32 24.04.20 13:02 Сейчас в теме
(35)
"ThreadHelper.RunOnUI(....)" такого в 1С не будет никогда! значит пункт 3. не выполним. Но... подумав над все этим я могу утверждать - что всё что я написал - всё так и будет работать на самом деле (за исключением одного "НО" - недостижимого желания) - всё дело в магии модели асинхронности асинх\ждать - вернее в её почти полном отсутствии!
1. Исходный обработчик команды должен быть Асинх(ронным) - но это по сути ничего не меняет - ведь он останется при его старте почти 100% произойдёт классическая блокировка клиентского контекста выполнения (потока GUI) что, собственно, и требовалось по задаче
2. Далее в этом методе (или любом вызываемом - но тоже асинхронном) запускается асинхронная операция. Вот тут и кроется НО! Во-первых, что мы будем подразумевать под асинхронной операцией? И вообще как они работают? Ответы на вопросы ниже. А пока просто будем считать асинхронной операцией у нас будет вызов функции "ВввестиДатуАсинх()" (мог выбрать и "НайтиФайлыАсинх" - это не принципиально: работу проверял на их асинхронных текущих аналогах "ПоказатьВвводДаты" и "НачатьПоискФайлов"). Вот тут и заключается Вся магия асинхронных функций - на экране появится диалог ввода даты - "в отдельной" форме. Или не совсем форме? Вот тут и подвох - поток GUI обоих "форм" (исходной и ввода даты, открытый "ПоказатьВвводДаты") - один и тот же - и если после открытия этой, якобы асинхронной операции, будет продолжаться выполнение в исходном методе - то эта асинхронная операция будет полностью заблокирована - пока этот код не выполнится (и не спасает даже никакая эмуляция сна). На самом деле с "НачатьПоискФайлов" всё то же самое - сам поиск файлов не начинается пока не завершится код в исходной операции - а пока идёт поиск файлов - форма остаётся заблокированной! То есть вся эта асинхронность - полнейший МИФ! Но да ладно. Суть не в этом. А в том, что ранее продолжение выполнения (после завершения асинхронной операции) нужно было писать в обработчике завершения - и он блокировал бы контекст формы. То сейчас нужно написать вот так "Ждать ВввестиДатуАсинх()" и размещать код продолжения сразу за асинхронной операцией! И он будет выполнен по её завершению - это и есть пункт 3.
Никакой асинхронности нет!
Уверен - что на этой строке "Ждать НайтиФайлыАсинх()" формат так же останется заблокированной - значит всё по-прежнему будет в один поток - строго синхронно! ВСЯ ЭТА АСИНХРОННОСТЬ - ЭТО ПРОСТО МИФ!
Именно об этом я написал ниже в посте (34).

Нет в ней никакого смысла. Как и нет смысла в функциях "НачатьПоискФайлов" или "НайтиФайлыАсинх". Они нужны только ПО ПРИНУЖДЕНИЮ в WEB-Клиенте. Они такие же синхронные - только применение колбэк-функций типа "НачатьПоискФайлов" сильно усложнило программирование алгоритмов с их применением.
Но если подумать, что реально зачем в 1С вся эта новая модель асинх/ждать если всё с ней остаётся синхронным - нужно было просто доработать исходные синхронные методы как НайтиФайлы() просто сделав их внутри асинхронными с ожиданием - для случая использования в WEb-клиенте (только):

Функция НайтиФайлы(параметры...) экспорт
#ЕСЛИ не WebКлиент ТОГДА
     возврат НайтиФайлыСинх(параметры...) ;
#ИНАЧЕ
         Обещание = НайтиФайлыАсинх();
         возврат ПодождатьНайтиФайлыАсинх(Обещание);
#КОНЕЦЕСЛИ
КонецФункции


Асинх фунукция ПодождатьНайтиФайлыАсинх(Обещание)
     Пока Обещание.Состояние = СостояниеОбещания.Выполняется Цикл
           КакоетоОжидание();
     КонецЦикла;
     возврат Ждать Обещание; //Получение результата - конечно на нормальном фреймворке это всё выглядело бы куда красивее
КонецФунукции
Показать


Формально мы превратили асинхронную функцию - в синхронную с ожиданием!
Возможно при трансляции в JavaScript такую обёртку не удастся сделать (чтобы отказаться от ключевого слова асинх) - но тогда можно просто все функции помечать так (при трансляции) и написать вот так

Асинх Функция НайтиФайлы(параметры...) экспорт
#ЕСЛИ не WebКлиент ТОГДА
     возврат НайтиФайлыСинх(параметры...) ;
#ИНАЧЕ
       возврат Ждать НайтиФайлыАсинх();
#КОНЕЦЕСЛИ
КонецФункции //Загвоздка тут видимо в том, что такая функция вернёт Обещание - и к нему всё равно придётся применить операцию "Ждать" - чтобы получить результат!
Показать


Правда аргументы все будут передаваться только по значению - а не как принято в 1С по ссылке (что - правда ужасно - лучше всегда по значению).

В общем - вся эта архитектура асинх/жать нужна только для WEB-Клиента чтобы не писать монструозные конструкции на колбэк-функция, а писать в классическом синхронном стиле - ведь по сути всё так и остаётся синхротронным - никакой асинхронности тут нет и в помине!


Справедливости ради, надо заметить - что обычным (не ВЭБ) клиентам это тоже может быть полезно - т.к. позволяет эмулировать модальную работу с формами без колбэк-функций - т.е. можно написать так
МояДата = '00010101';
Если Ждать ВввестиДатуАсинх(МояДата) Тогда //тут может быть асинхронное открытие любой формы
 //И тут продолжить обработку введёной даты
КонецЕсли;


Это, безусловно удобно - хотя не так критично как работа с рядом асинхронных функций как "НачатьПолучениеКаталогаВременныхФайлов()" когда под WEB-Клиентом невозможно использовать синхронный аналог!
Irbiz; user1118428; Roootru; +3 Ответить
32. Darklight 32 23.04.20 17:00 Сейчас в теме
(19)В примере - обработчик команды - асинхронная функция.
А вот если обработчик команды будет не асинхронным - то я конечно смогу вызвать в нём асинхронную функцию - условно асинхронно и смогу получить "Обещание", вот только (В текущей реализации) не смогу в этом синхронном обработчике запустить отложенное синхронное выполнение результата! Да и асинхронное тоже не смогут!
Смотри мой пост (22)
TreeDogNight; +1 Ответить
15. ImHunter 327 23.04.20 10:00 Сейчас в теме
Вот блин, сделали бы ОписаниеОповещения, рождаемое и на сервере. Можно было бы немного ФП привнести в код при желании.
unduty; Darklight; +2 Ответить
16. by_1Cnik 236 23.04.20 10:41 Сейчас в теме
Что говорить про хорошо/плохо реализовано... Осталось дождаться 8.3.18 и проверить. У Beta-тестов уже есть такая возможность. Код асинхронизации на 1с кому интересно
18. starik-2005 3080 23.04.20 13:32 Сейчас в теме
Вот читают походу 1С-неги инфостарт, где им про промисы только совсем уж ветхтий адинесник не намекал )))
20. starik-2005 3080 23.04.20 13:44 Сейчас в теме
В общем походу суть промисов так и не дошла до желтых, а суть в том, что на выходе тоже промис, который позволяет произвести конвейеризацию, а сам промис определен функциями для успешного и безуспешного завершения кода. По сцылке в 1С предлагают городить огород с ожиданием внутри блока попытка-исключение, что вообще с моей лично точки зрения какой-то бред, почти полностью нивелирующий выгоду от асинхронного исполнения кода, т.к. он тупо становится синхронным.

Хотя я не прав, ибо Ждать можно юзать только внутри асинхронных функций. Но все-равно что-то тут не так, ибо теперь нет колбэка ни для успешного, ни для безуспешного завершения операции (а он даже в старом механизме был), по крайней мере я не увидел.
HystriX; user1311038; +2 Ответить
22. Darklight 32 23.04.20 14:27 Сейчас в теме
Конечно - появление такой асинхронной модели - это шаг в перёд - хоть и скопировано всё с Java - не лучшее что есть в методологии синхронизации - да и не шаг - а пол шага вперёд - т.к. добавили настолько мизерную часть - что реального толка от неё не больше - чем от того что уже было в клиенте 1С.

Во-первых, русский термин - "Обещание" - звучит ужасно. Не буду разбираться в истоках становиления этого термина в Java. Но, вот, в C# аналог - Task - звучит по-русски куда лучше - "Задание" - да и есть уже в 1С похожая модель асинхронности - называется "ФоновоеЗадание" - зачем же вообще нужно было изобретать новую терминологию о совершенно той же модели использования. Ввели бы тогда "АсинхронноеЗадание" - когда асинхронность не требует открытия нового фонового сеанса на сервере. И всю модель использования (API) можно было бы сохранить (тем более она как раз очень похожа была на Task из C# - ну по-крайней мере в старой редакции .NET 4).

Ну а слова "Асинх" "Ждать" - если уж так хотелось ввести - то пожалуйста - но, на мой взгляд - это не более чем синтиаксический сахар. Причём Асинх - я бы уж точно делал бы аннотацией "&Асинх" (или даже полностью "&Асинхронно") - ибо такая запись "Асинх функция КопироватьФайлАсинх" выглядит уж очень криво.

А если честно - я в этой аннотации вообще не вижу большого смысла - я был не выделял функцию как асинхронную при её описании НИКАК! Если она вызывается как синхронная - то и выполняется как синхронная. Если вызывается с пометкой "Ждать" или "Асинх" - тогда вызывается как асинхронная. Ну для обработчиков тогда да - нужно будет помечать - как они должны вызывать такие функции.
Зачем плодить кучу одинаковых по функционалу функций и засорять ими API!

Один из самых главных недостатков подхода асинх/ждать - это то, что все функции, которые хотят использовать "Ждать" - должны быть "Асинх" - соответственно - это очень сильно накладывает ограничения на исходный код - в котором это всё выполняется. Так как вызывать такие функции становится очень затруднительно в текущем контексте (который не "Асинх"). От того, часто (в других языках) такие программы начинают проектироваться в асинхронном режиме прямо с первых фунций (с функции Main) - иначе в ней не вызывать другие асинхронные функции. Помощь тут - только интерфейсные события - которые тоже могут являться корнем для такой асинхроннгости - и, соответственно, какие-то могут быть асинхронными, какие-то могут не быть - но если какое-то событие не асинхронное изначально - об асинхронности внутри оно уже может забыть!
В отличии, скажем, от модели "колбэк-функций", применяемой в 1С ранее - где вызывать асинхронную функцию с оповещением (колбэк-функцией) можно было в любом месте контекста (правда только клиентского), главное, чтобы сама колбэк-функция была доступна по месту вызова!

В других языках (в частности в C#) это решается путём замены ключевого слова "Await" (Ждать) на просто объектную модель работы с асинхронными заданиями - так же как это реализовано в 1С у фоновых заданий - запустили задание - получили его описание и всё-никаких ограничений на исходный вызывающий код нет - нужно дождаться - ну вызываем ФоновоеЗадание.ОжидатьЗавершенияВыполнения() "MyTask.Wait()" - в любом месте, где захотим - вот там и ждём.

Отличие модели асинх/ждать в том - что сама по себе - это не асинхронность - это только особый подход к её обработке - где компилятор выстраивает
специальную машину обработки состояний - позволяющую гибко ПОСЛЕДОВАТЕЛЬНО выполнять в ней код, который изначально может быть очень разрозненно написан (в удобной для программиста форме). Здесь нет никакой магии действительно асинхронного - т.е. параллельного выполнения кода (но есть управление другими функциями - которые могут выполняться параллельно - но этим программист не управляет и не создаёт их).
Именно для этого функции помечаются как "Async" - чтобы по ним выстраивалась эта машина - перестраивая их код в другую структуру выполнения. Уж не знаю - делает ли это 1С в 18-ом релизе!

И вот, мы подошли к ещё трём главным недостаткам текущей реализации в 1С (ранее был первый - что все функции, использующие "Ждать" должны быть помечены как "Асинх" - а это накладывает особые условия на контекст применения такой модели, а в других языках это обходится заменой ключевого слова "Ждать" на объектную модель как у фоновых заданий):

1. Добавление ключевого слова "Асинх" - НЕ ДЕЛАЕТ ФУНКЦИЮ АСИНХРОННОЙ - В СМЫСЛЕ ПАРАЛЛЕЛЬНО ВЫПОЛНЯЮЩЕЙСЯ! По сути - она остаётся условно синхронной - т.к. все её части выполняются в том же потоке выполнения, что вызывающий её код! (хотя, возможно, команды формы - вызывающие асинхронные обработчики в 1С не будут блокировать основной поток выполнения формы). То есть, сделать свои параллельно выполняемые функции ПО-ПРЕЖНЕМУ – НЕЛЬЗЯ! В других языках это работает так же! НО! Там есть дополнительные средства – позволяющие начать асинхронное именно ПАРАЛЛЕЛЬНОЕ выполнение вообще произвольной части кода – используются подход, запускающий функции высшего порядка в отдельном потоке – с получением Promise/Task – и дальше работа с ним уже в модели асинх/ждать – именно в этом и раскрывается вся мощь данной модели! А в 1С , как я понял, это пока не ожидается :-( А ещё в других языках так вообще можно запустить произвольный код – просто налету (по месту его выполнения) описать его как анонимную функцию – что очень положительно сказывается на красоте, простоте и понятности всего асинхронного контекста выполнения – весь асинхронный и параллельный код описать в одном месте как один контекст выполнения, не разбивая его по куче функций, сохраняя лёгкость читаемости его логики выполнения!

2. Применение ключевого слова “Ждать” зачастую очень ущербно – т.к. тут нет возможности указать таймаут этого ожидания. То есть так ждать будем пока вызванная функция не вернёт управление. А зачастую – это очень плохой дизайн. В отличии от уже упомянутого сравнения с фоновыми заданиями - где у функции «ОжидатьЗавершенияВыполнения(Таймаут)» есть «Таймаут» ожидания. И возвращая она не результат, а «ФоновоеЗадание» - из которого результат можно извлечь в любой удобный момент и месте (а не обязательно прямо тут, где вызывали и/или ждали). Более того, часто бывает нужно ждать сразу несколько асинхронных операций (либо всех сразу, либо любую из них) – тут у менеджера фоновых заданий тоже есть такая функция - это очень удобно – гораздо удобнее чем применение слова «Ждать».

3. Насколько я понял – данная асинхронная модель, по-прежнему, доступна только на клиенте (причём, как выше показано, без обеспечения реальной параллельности, и обработки таймаутов). На сервере – её по-прежнему НЕТ! И там так и придётся создавать фоновые задания – чтобы сделать хоть какую-то параллельность! Так же нет и возможности делать серверные вызовы асинхронно! Ну а про асинхронные вызовы http/web-сервисов видимо ещё тоже долго придётся мечтать! А ведь именно такие клиентские вызовы чаще всего бывают асинхронными на других платформах и языках! Но факт остаётся фактом – таких асинхронных методов платформа 1С не предоставляет. Самим такие не сделать!

Тут, правда, надо сделать несколько замечаний:
1. Вся эта асинхронность пошла исключительно с подачи некоторых браузеров – которые её потребовали в своём API – если бы ни это – компания 1С бы с высока бы плевала на все эти потребности в асинхронности на клиентах

2. В Web-Клиенте весь код 1С преобразуется в JavaScript – и вот тут есть загвоздка – JavaScript не поддерживает параллельные потоки – т.к. в нём есть такая же ущербная асинхронность, какую нам навязывает 1С. Тем самым внося кучу ограничений и в обычные клиенты! Один WEB-Клиент (по сути не особо то уже и нужный) – тормозит развитие всех других (из-за совместимости – которой, к слову, всё равно особо то и нет; впрочем, смотри замечание 1 – так что Web-Клиент тут не причём)

3. Вообще-то параллельность в JavaScript ушлые программисты давно уже научились получать обходным путём – пусть он не самый простой – но он есть – как и есть куча фреймворков, упрощающие применение этой параллельности в Web-формах (но смотри замечание 1 – компании1С просто нет до этого никакого дела)

Так что, лично моё мнение, всё это применение модели «асинх/ждать» в клиентском контексте, вместо модели «колбэк-функции» – полная ерунда! По сути, не привносящее ничего действительно полезного! Ну разве что, делающая применение таких вызовов (где этого требует WEB-Клиент) более удобным и красивым чисто синтаксически. Ну а отсутствие применимости такого похода в серверном контексте – сильно снижает его применимость вообще – когда хочется написать универсальный код, который смог бы работать, в любом контексте, и не можешь этого сделать – из-за таких, вот, ограничений в использовании некоторых подходов в разных контекстах! Из-за ЧИСТО ФОРМАЛЬНЫХ ОГРАНИЧЕНИЙ!

В общем – как всегда – лозунг 1С – «оставь надежды всяк её изучающий и применяющий»!
Capitullo; user1118428; potoyalo; IllayDevel; Brawler; +5 1 Ответить
24. starik-2005 3080 23.04.20 14:54 Сейчас в теме
(22)
В общем – как всегда – лозунг 1С – «оставь надежды всяк её изучающий и применяющий»!
Многобукв )))

Вообще, 1С-негам нужны, походу, кейсы для применения этого механизма. Вот с копированием файла с помощью асинхронной функции они какие-то проблемы решают, но ведь файл-то зачем-то копируется, а не просто "мне так захотелось". Скопировали - обработали. Если бы мне, например, нужно было бы просто скопировать файл, то 1С я бы для этого юзать не стал - достаточно проводника (хотя я чаще пользуюсь "cp", а еще чаще вообще "ln" или даже "mv").

Для веба асинхронность часто используется функциями рендеринга DOM'а, загрузки тяжелого или дополнительного догружаемого контента, когда пользователь уже может начать работать с формой, а она асинхронно продолжает загружаться (появилась кнопка "почты" в яндексе, картинки еще не догрузились, а я уже в почте, уже первое письмо читаю, правда бесит, когда нажимаю на письмо, а в это время реклама вместо него как раз догрузиласьт и я попадаю не в письмо, а в рекламный блок - убил бы тех дебилов, которые так сделали!!!)
TreeDogNight; +1 Ответить
26. Darklight 32 23.04.20 14:59 Сейчас в теме
(24)
Многобукв )))

Зато всё по существу изложил! Хоть и далеко не всё, что хотел сказать! И букв здесь меньше - чем в оригинальной статье на зазеркалье. Причём один вступительный абзац (где я обсуждал именно пример из зазеркалья) я вообще умудрился потерять!

Всё остальное - что Вы выше написали - я вообще могу понять - что Вы этим хотели донести!
33. HystriX 23.04.20 18:03 Сейчас в теме
(26) Столько текста, а согласиться можно лишь с корявостью обрезанного слова "Асинх" и с необходимостью приписывать это слово перед любыми методами, вызывающими асинхронные методы. Могли бы сделать добавление в конец рядом с "Экспорт, а не в начало. Представляю, как придется переписывать любые парсеры кода.

По поводу остальных претензий - зачем в очередной раз говорить "какое говно, почему нет серверной произвольной асинхронности и параллельности"? Оповещения появились только из-за того, что браузеры перестали поддерживать обычные блокирующие методы. Больше никакой цели у них не было. И это на самом деле удобный инструмент, когда научишься им пользоваться. Да, поначалу выносит мозг, но затем можно делать великолепные вещи, передавая в какие-то общие методы произвольные ссылки на процедуры, которые нужно в разных формах вызывать после выполнения этих общих методов.

То, о чем ведете речь вы, многопоточность, фоновые задания, веб-сервисы, не имеет никакого отношения к клиентским асинхронным вызовам. Весь смысл изменения - упростить написание таких вызовов для разработчиков. Но даже эта тема достаточно сомнительна, опять можно быть тупорезом и лепить код последовательно вместо того, чтобы думать, что и как делаешь.
34. Darklight 32 23.04.20 19:15 Сейчас в теме
(33) Я вот ни слово не сказал что методология асинх/ждать - плоха и неудобна! Напротив - она прекрасна - когда она прекрасно реализована как в той же Java или C# - а то что предлагает 1С это очередная обёртка костыля в красивую но заплесневелую ленточку!

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

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

Ну и вот такая реализация модели асинхронности будет только запутывать неокрепшие умы программистов - давая иллюзию что у них теперь код более эффективный параллельный асинхронный - а это совсем не так - как был он последовательно выполняемым так и остался - с блокировкой контекста выполнения - а-ля - клиентского GUI
ИЛЛЮЗИЯ ОБМАНА - да и только!

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

И именно это я подчеркнул - чтобы читающим было это понятно - что всё это лишь ОБМАН! И нужно только для упрощения кодирования под WEB-клиент (и ТОЛЬКО ПОД WEB-Клиент) - без повышения эффективности самого кода - больше тут пользы нет! Один синтаксический сахар и никаких технологических плюшек!

а согласиться можно лишь с корявостью обрезанного слова "Асинх" и с необходимостью приписывать это слово перед любыми методами, вызывающими асинхронные методы. Могли бы сделать добавление в конец рядом с "Экспорт, а не в начало. Представляю, как придется переписывать любые парсеры кода.

Там всё коряво гназвано! И об этом я написал!
Нужно было анотацию "&Асинхронно" делать. И размещать рядом с кажем с анотацией "&НаКлиенте". Было бы всё красиво и логично. И парсеры текста нормально бы обрабатывали это.
А от ключевого слова "Экспорт" я вообще бы отказался. Перевёл бы тоже на анотацию "&Экспорт" а лучше на инвертированную "&Приватно" - когда наоборот нужно скрыть публичный доступ к функции.
А если бы ещё появилась анотация "&ПовторноеИспользование" (я бы назвал "&Кеширование") и так можно было бы анотировать любые функции, а не только в управляемых формах - вот это был бы прогресс лаконичности написания функций!
Capitullo; user1118428; portwein; TreeDogNight; +4 1 Ответить
38. I_G_O_R 69 26.04.20 16:21 Сейчас в теме
(34)
она прекрасно реализована как в той же Java

ссылочку не дадите?

И вы не понимаете что такое асинхронность, постоянно примешиваете туда многопоточность. Вот где здесь поток?:
Ответ = ждать Вопрос(...)

при этом интерфейс не заблокирован и другие открытые формы могут, например, выполнять свои обработчики ожидания.
Файловые операции действительно раньше блокировали основной поток, но ситуация сдвигается, какие-то из них уже не блокируют.
39. Darklight 32 27.04.20 09:59 Сейчас в теме
(38)
ссылочку не дадите?

Я не Java программист - спросите лучше у них, ну или поищите. По C# ссылочку могу дать, коли не найдёте сами (ну или это был саркастический вопрос - тогда поучите Java меня сами). По этому вопросу сейчас Java и C# постоянно передирают друг у друга фишки. Хотя в Java Promise-паттерн появился, вроде бы раньше, а вот модель async\await первой, вроде бы появилась в C# (возможно ранее в другом языке, ну Promise\Future - так вообще очень древняя придумка).

И вы не понимаете что такое асинхронность, постоянно примешиваете туда многопоточность. Вот где здесь поток?:
Ответ = ждать Вопрос(...)

Тогда уж: Ответ = ждать ВопросАсинх(...)
Я не спец по асинхронности. Но модель async\await понимаю хорошо. И я ни разу не утверждал, что тут есть многопоточность (даже в током коде "Ответ = ждать НайтиФайлыАсинх(...)") и что это об одном и том же. Просто без (дополнительного) применения техники многопоточности смысла в модели асинх\ждать в 1С не очень много (именно не очень много, т.к. смысл есть - в красоте кода - но лично я считаю, ради этого можно было и по другому перестроить компилятор - чтобы передать возможность писать условно синхронный код, выполняющийся условно асинхронно - но в том же потоке. То есть - считаю что можно было бы и так писать "Ответ = Вопрос(...)" - а уже компилятор бы сам разобрался - что тут применяется асинхронный вызов (именно когда нельзя применить синхронный из-за особенностей среды выполнения) - и перестроил бы результирующий скомпилированный код на асинхронную модель вызова - без всяких асинх\ждать конструкций - они тут лишние - ибо дополнительного толку (кроме указания перестроить результирующий скомпилированный код например в машину состояний) в них тут почти нет (без многопоточности). А если Вы читали мом посты в этой новости - то поняли бы - что технологии асинхрнности и многопоточностм я активно разделяю!

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

Я изменю своё мнение о полезности применения модели асинх\ждать в 1С - коли это будет так в 18-релизе (ну или в 17-релизе - тут ещё не проверял). В классической модели на колбэк-функциях я проверил в 16-релизе - тут все проверенные мной асинхронные функции (сморите мои посты в этой новости) - выполнялись в одном потоке - основном. И если основной поток был занят - то асинхронные методы останавливались и даже не выполнялись (файлы не начинали искаться, правда диалог формы всё-таки появлялся - но далее был заблокирован) пока не освободится основной поток (аналоично - начав выполняться - асинхронные методы полностью блокировали основной поток) - причина всего этого - полное отсутствие многопоточности в 1С. От того пока и не вижу большого смысла в такой квази-асинхронности. Ну и куча других недостатков мной тоже уже тут была описана!
40. IllayDevel 14 13.05.20 10:30 Сейчас в теме
В окно стучался 2021 год. Люди спорили можно ли на компьютере посчитать одновременно 2+2 и 3+3 дождаться расчета обоих вычислений и сложить результат первого и второго вычисления. Адепты высокоуровнивых языков говорили что легко и просто, а разработчики 1С все про какие-то ограничения платформы и о ненужности вообще такого действия.

Ничего не меняется ((( а жаль. Мне вот в 1с нужна реальная многопоточность для выполнения запросов в параллель. Вот как этими новомодными конструкциями получить итого из двух разных регистров (например остатки номенклатуры по складу и цены номенклатуры). Если все правильно понял, то никак. А тогда один простой вопрос ЗАЧЕМ ЭТО ВСЕ?
It-developer; Irbiz; Denanhel; 7OH; TreeDogNight; +5 Ответить
41. acanta 13.05.20 10:41 Сейчас в теме
(40)
реальная многопоточность

Легко, одна база данных - один поток. Четыре базы - четыре потока. Обрабатываются вместе быстрее чем один.
42. HystriX 25.05.20 16:34 Сейчас в теме
Ну вообще-то такое делается с помощью фоновых заданий, запускаемых в несколько потоков.
tremp; It-developer; +2 Ответить
43. It-developer 26 24.06.20 15:32 Сейчас в теме
На Javascript работал с асинхронностью. Не понравилось
44. 7OH 70 20.07.20 20:11 Сейчас в теме
Кто-то успел попробовать ?
Я что-то асинхронности не увидел.
Пока код не выполнится весь - весь интерфейс висит, как при обычном синхронном вызове ?
В чём суть этой поделки тогда ?
Да и очередь выполнения выдаёт на гора странные вещи.
Прикрепленные файлы:
45. tremp 3 22.07.20 12:58 Сейчас в теме
(44) Асинхронность <> другой поток. А вот если есть будут функции, реализованные на уровне Платформы в другом потоке (как выше писали, например, НачатьКопированиеФайла), то смысл во всем этом будет (именно такие функции "уходили" бы в другой поток и не блокировали основной). Надо проверять.
It-developer; +1 Ответить
46. 7OH 70 22.07.20 14:12 Сейчас в теме
(45) не - я ждал именно для любой функции, и думаю не один я.
Смысл давать делать асинхронной ЛЮБУЮ функцию, если профита от этого ровно ноль ?
А к разделению кода мы уже и привыкли.
It-developer; +1 Ответить
47. tremp 3 22.07.20 16:23 Сейчас в теме
(46)Ну, то что я описал выше - это не изобретение разработчиков платформы - в других языках тоже так. Подозреваю, что слишком большие затраты понадобились бы в общем случае, если бы интерпретатор анализировал бы все дерево вызываемых функций на наличие вызова другого потока.....
48. 7OH 70 22.07.20 16:27 Сейчас в теме
(47) то бишь нам предлагают кота шрёдингера использовать: вроде функция асинхронная любая, но работать будет только если внутри вызывать реально асинхронные, заложенные в платформу.
Ну издевательство же. Зачем давать любую делать ? Вызывайте платформенные прямо из обычных функций и всё - не будет путаницы и неопределенностей.
--
P.S.: лучше бы CAST-ы в запросы добавили.
49. tremp 3 22.07.20 16:35 Сейчас в теме
(48) "Вызывайте платформенные прямо из обычных функций и всё" - если, я правильно, понял, что вы предлагаете, то это был бы "залет" - сколько бы кода сразу перестало корректно работать).
50. 7OH 70 22.07.20 16:41 Сейчас в теме
(49) почему ? у всех новых асинхронных же новый постфикс\префикс
Чтобы работало по новому надо использовать новые функции.
Ничего не сломается.
Это как Вопрос и ПоказатьВопрос. Теперь будет ПоказатьВОпросАсинх.
Не вижу "залета"
51. tremp 3 22.07.20 16:49 Сейчас в теме
(50)согласен - по диагонали прочитал новость. Действительно, вроде, хотят новые функции ввести. Если они действительно будут заканчиваться на "Асинх", то это будет удобно и понятно. В общем получается стандартный подход - как и в других языках.
53. Yashazz 4779 10.11.20 21:16 Сейчас в теме
Почитал тему и понял - как люди путали асинхронность с многопоточностью, так и продолжают путать.
ArchLord42; +1 Ответить
57. ArchLord42 83 08.02.21 11:46 Сейчас в теме
(53) В желтых книгах про это не пишут :))
54. ksavetisyan 04.12.20 21:14 Сейчас в теме
Внесу свои 5 копеек.

Протестировал. Асинхронности как таковой нет.
Вызов последовательно 2х процедур БЕЗ ключего слова "ЖДАТЬ" вешает клиета намертво.


&НаКлиенте
Процедура Тест(Команда)
	
	ДобавитьСимвол("&&", "Реквизит1", 15);
	
	ДобавитьСимвол("!!", "Реквизит2", 3);
	
КонецПроцедуры

&НаКлиенте
Асинх Функция ДобавитьСимвол(Символ, Реквизит, Задержка)
	
	Для Сч1 = 0 по 100 цикл
		
		Для Сч2 = 1 по 100 * Задержка Цикл 		
			Объект[Реквизит] = Объект[Реквизит] + " " + Символ;
		КонецЦикла;
		
	КонецЦикла;
	Сообщить("Готово " + Задержка); 	
КонецФункции

Показать


Думаю комментарии излишне.
Справедливости ради следует признать синтетический сахар в виде отсутствия колбак вызовов - очень приятная штука.
Впрочем почему 1С не сделала так изначально?
55. kalyaka 1099 12.01.21 19:24 Сейчас в теме
(54) Тоже протестировал на копировании файлов, асинхронности не обнаружено, все строго последовательно.
В следующем примере пробовал копировать тяжелый и легкий файлы, затем наоборот - последовательность одинаковая.
&НаКлиенте
Асинх Процедура СкопироватьФайл1(Сообщения)
	ИмяФайлаИсточника = "Источник";
	ИмяФайлаПриемника = "Приемник";
	Ждать КопироватьФайлАсинх(ИмяФайлаИсточника, ИмяФайлаПриемника);
	Сообщения.Добавить("Скопирован файл 1");
	Сообщить("3:
	|"+СтрСоединить(Сообщения, Символы.ПС));
КонецПроцедуры

&НаКлиенте
Асинх Процедура СкопироватьФайл2(Сообщения)
	ИмяФайлаИсточника = "Источник";
	ИмяФайлаПриемника = "Приемник";
	Ждать КопироватьФайлАсинх(ИмяФайлаИсточника, ИмяФайлаПриемника);
	Сообщения.Добавить("Скопирован файл 2");
	Сообщить("4:
	|"+СтрСоединить(Сообщения, Символы.ПС));
КонецПроцедуры

&НаКлиенте
Процедура КомандаСкопироватьФайл(Команда)
	Сообщения = Новый Массив;
	СкопироватьФайл1(Сообщения);
	Сообщения.Добавить("Копирование файла 1");
	Сообщить("1:
	|"+СтрСоединить(Сообщения, Символы.ПС));
	СкопироватьФайл2(Сообщения);
	Сообщения.Добавить("Копирование файла 2");
	Сообщить("2:
	|"+СтрСоединить(Сообщения, Символы.ПС));
КонецПроцедуры
Показать
Аналогично для следующего фрагмента файлы также будут скопированы строго последовательно
&НаКлиенте
Асинх Процедура СкопироватьФайл(Файл, Индекс)
	ИмяФайлаИсточника = Файл.ПолноеИмя;
	ИмяФайлаПриемника = СтрЗаменить(ИмяФайлаИсточника, "Источник", "Приемник");
	Ждать КопироватьФайлАсинх(ИмяФайлаИсточника, ИмяФайлаПриемника);
	Сообщить(СтрШаблон("3. Скопирован файл %1 - %2", Индекс + 1, Файл.Имя));
КонецПроцедуры

&НаКлиенте
Асинх Процедура СкопироватьФайлы()
	НайденныеФайлы = Ждать НайтиФайлыАсинх("C:\Temp\Источник", "*.*");
	
	Для Индекс = 0 По НайденныеФайлы.ВГраница() Цикл
		СкопироватьФайл(НайденныеФайлы[Индекс], Индекс);
	КонецЦикла;
	
	Сообщить("2. Копирование файлов асинх");
КонецПроцедуры

&НаКлиенте
Процедура КомандаПаралельноеКопирование(Команда)
	СкопироватьФайлы();
	Сообщить("1. Копирование файлов");
КонецПроцедуры
Показать
56. ArchLord42 83 08.02.21 11:44 Сейчас в теме
(54)
(55)

Какое открытие!) Вам следуют разобрать что такое асинхронность и что такое многопоточность.
И про UI поток почитать заодно...
58. kalyaka 1099 08.02.21 11:48 Сейчас в теме
(56) Ну я немного знаком с моделью асинхронности в веб-браузере. От 1С я ожидал чего-нибудь подобного: отдельный приоритезированный поток UI, порционное исполнение стека обещаний, исполнение асинхронных функций в отдельном потоке операционной системы.
59. silberRus 73 04.05.21 20:19 Сейчас в теме
чет я не понял,
т.е. если я из обычной процедуры выозву асинхронную, то у меня процедура обычная завершится только после того как ожидание примет свой окончательный вид?
60. unduty 01.10.21 18:47 Сейчас в теме
Открываю бухгалтерию и иду пить кофе, пока вся эта асинхронность обновит рабочий стол. Потом весь день будет тупить на каждом всплывающем сообщении. Про мобильную платформу вообще молчу, видимо ее сделали под пентиум 3 и не знают, что сейчас все смартфоны многоядерные. Приложения уже давно используют десятки потоков на клиенте, это позор компании с таким бюджетом.
Оставьте свое сообщение