Асинхронное нечто, или так, как раньше!

23.10.22

Разработка - Механизмы платформы 1С

Все же знают, что раньше было лучше! Возврат к истокам и погружение в детали...

Я вот никак не хотел больше писать статьи, т.к. лениво, да и на работе много интересного. Но сердце все-равно рвется из груди в попытках донести крупицы мудрости (ну или глупости - все зависит от аудитории). И чтобы не растекаться мыслью по древу, перейду к сути...

 

ВВЕДЕНИЕ

Суть в том, что с какой-то (вроде бы 8.3.18+) версии платформы появились у 1С асинхронные варианты методов для диалоговых окон, копирования файлов, подключения внешних компонент и всего того, что немного раньше делалось при помощи объекта "ОписаниеОповещения", представляющего из себя организацию "промиса" (того самого "обещания" из асинхронного программирования). Но код с "коллбэками" (обратными вызовами) был несколько громоздким. Да, 1С сделала в конфигураторе опцию рефакторинга, который старый синхронный вызов автоматически преобразовывал в новый асинхронный, но все-равно кода стало больше, а больше - это запутаннее.  В том же менеджере работы с оборудованием передача "промисов" между функциями существенно затрудняла анализ и обратный инжиниринг для выколупывания протоколов работы с ВК.

Итак, "промисы" в первой итерации от 1С получились громоздкими, запутывали код, превращали его в "спагетти" без всех этих операторов безусловного перехода. И однажды 1С все же решила сделать тот самый await, который сразу и сильно упростил код, возвратив его обратно к линейной последовательности строк.

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

В путь!

 

ИСТОРИЧЕСКИЙ ЛИКБЕЗ

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

Дальше закон Мура стал тормозить, стало активно развиваться параллельное программирование, когда задача решалась сначала на множестве компьютеров, потом на множестве процессоров в одном компьютере, потом на множестве ядер в одном процессоре, а сейчас уже на множестве ядер на ускорителях (видеокартах и прочих специализированных устройствах). Наступила эра параллельного программирования, о которой я писал аж дважды: тыдыщь и тыдыщь.

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

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

Итак, к чему это я? К тому, чтобы читатель некоторым образом увидел историю развития и ощутил проблемы, которые решались в ходе развития, т.к. согласно ТРИЗ, все улучшения упираются в какие-то ухудшения, появляются качели эффективности, выражающиеся в том, что решение одной проблемы может породить несколько других проблем на другом уровне, которые нужно тоже как-то комплексно решать: разнести во времени (циклы чтения/записи памяти) или пространстве (ядра процессора), поменять отношение (50 градусов - когда-то это была высокая температура для процессора, а сейчас это вообще очень холодно, а 80 градусов стало почти нормой под нагрузкой).

Ну а дальше перейдем к асинхронности 1С.

 

РАНЬШЕ (за "миллион лет" до н.э.)

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

Результат = ОткрытьФормуМодально(ИмяФормы, Параметры, ...);

Ну и в переменной "Результат" появлялись данные выбора. Для диалогов использовалось что-то типа "Выбрать" или "Ввести" (ВвестиСтроку/Число/Дату/Значение). Таким образом код останавливался и ждал, когда пользователь что-то выберет, после чего можно было бы спокойно и без нервотрепки обработать результат.

Какие у этого минусы? Да, собственно, никаких для обычного разработчика. В то, что 1С не смогла прилично реализовать это для веб-клиента, я не верю. Единственный, на мой скромный взгляд, смысл в этом только как следование за трендами. Но в части диалогов модальный вызов ничем не отличается от немодального. В части подключения внешних компонент это уже оправдано, т.к. они вполне могут ожидать какие-то данные от оборудования при инициализации, которые при асинхронном подходе действительно будут сокращать время запуска 1С. То же самое и с копированием файлов - это позволяет пользователю не ждать завершения их копирования и перейти к другим задачам. Но тут экономия времени минимальна.

 

ПЕРВЫЙ БЛИН...

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

В общем, был ли этот блин комом или нет - решать вам, господа и товарищи читатели.

 

АСИНХ

И вот появился тот самый Асинх, ради которого я снова решил писать много букв. С одной стороны, этот суффикс получили все старые диалоговые методы/функции. Т.е. вот как-то так менялись названия: "Выбор*" -> "ПоказатьВыбор*" -> "Выбор*Асинх". Помимо этого у процедур и функций появился префикс "Асинх", который указывает, что процедура асинхронная.

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

Итак, работает это все просто.

1. Вы вызываете асинхронную функцию.

2. Асинхронная функция помещается в очередь на выполнение.

3. Вместо результата планировщик (или как его там назвать) возвращает объект типа "Обещание" (промис), фактически адрес структуры состояния функции.

4. Чтобы получить результат, вам надо подождать. В 1С сделали тот самый "Ждать Обещание".

И вроде бы что это дает? Да вот нифига пока* не дает, но позволяет вернуться к старому, т.е. делать все почти также, как делали это в стародревние времена.

* Жду асинхронных запросов к HTTP-сервисам - там резон действительно есть.

 

ПРИМЕРЫ

Давайте разберем "исторические" примеры превращения кода из модального в асинхронный.

Модальный код:

Диалог = Новый ДиалогВыбораФайлов(Режим);
Если Диалог.Выбрать() Тогда
  ИмяФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;

Код с описанием оповещения:

Диалог = Новый ДиалогВыбораФайлов(Режим);
Диалог.Показать(Новый ОписаниеОповещения("ПриВыбореФайла", "ЭтаФорма", ДополнительныеПараметры));
...
&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДополнительныеПараметры) Экспорт

  Если ЗначениеЗаполнено(Результат) Тогда
    ИмяФайла = Результат[0];
  КонецЕсли;

КонецПроцедуры

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

Асинхронно:

&НаКлиенте
Асинх Процедура ВыбратьИмяФайла(Команда)

  Диалог = Новый ДиалогВыбораФайлов(Режим);
  Результат = Ждать Диалог.ВыбратьАсинх();
  Если ЗначениеЗаполнено(Результат) Тогда
    ИмяФайла = Результат[0];
  КонецЕсли;

КонецПроцедуры

Смотрите, если мы вызываем этот код, как команду, то в стандартной процедуре обработки команды нужно прописать префикс "Асинх". Это связано с тем, что оператор "Ждать" можно вызывать только в асинхронных процедурах и функциях.

Кстати, смотрел один ролик, в котором автор говорил, что смысла в асинхронных процедурах вроде как нет, ибо "Ждать" возвращает результат обещания, а он имеет смысл только в функциях. Я, лично, считаю наоборот, т.к. "самописная" асинхронная функция ничего не дает, если внутри нее не вызывается асинхронный диалог или копирование файлов, подключение внешних компонент и все такое прочее асинхронное. А вот асинхронная процедура позволяет использовать "Ждать"*.

: Асинх / Async представляет собой модификатор, который может применяться к процедуре или функции, написанной на встроенном языке. Использование данного модификатора делает процедуру или функцию асинхронной. Важной особенностью является также то, что оператор Ждать может использоваться только внутри Асинх процедур/функций.

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

Кстати, заметил, что если в диалоге нажать отмену, то код после "Ждать" не выполняется. Таким образом можно вообще не проверять переменную на заполненность, а отмена выбора в цепочке вопросов приведет к дальнейшей отмене всей оставшейся цепочки. Но тут могу быть неправ - проверяйте.

 

ОСОБЕННОСТИ

Основной особенностью новой жизни (ну помимо дописывания префикса "Асинх" к событиям формы) является то, что 1С будет исполнять асинхронную функцию уже после того, как отработает "базовое событие" формы. Что под этим подразумевается? То, что если у вас есть событие с аргументом "СтандартнаяОбработка", то вне зависимости от того, что там внутри этого кода произошло, система после выхода из процедуры будет смотреть на этот флаг, и если он в Истина, то будет произведена стандартная отработка. Например, для таблицы значений будет открыто значение, для табличного документа тоже. С асинхронными функциями сложнее, т.к. они будут работать уже после того, как стандартное событие отработает. И если Вы внутри такой функции поставите "СтандартнаяОбработка = ложь", то система это не увидит, ибо она обработает стандартное событие до того, как асинхронная функция вернет хоть какой-то результат.

Как бороться? Правильно, вызывать асинхронную процедуру из синхронного обработчика событий.

 

ВЫВОД

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

ВСЕМ ДОБРА!

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7443    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5942    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    17663    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11221    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23756    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18828    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14729    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. lmnlmn 69 24.10.22 14:00 Сейчас в теме
Кстати, заметил, что если в диалоге нажать отмену, то код после "Ждать" не выполняется.

Не знаю как просто в диалогах, а про ПолучитьФайл(ы)ССервераАсинх в СП есть следующая ремарка: "Результат выполнения обещания заполняется сразу (в веб-клиенте - до показа диалога, в остальных клиентах - после показа диалога) значением Неопределено."
По человечески это означает то что в веб-клиенте Обещание выполняется сразу как и последующий код в то время как диалог мозолит пользователю глаза. Будьте внимательны, коллеги.
starik-2005; +1 Ответить
2. Hans 3 24.10.22 14:04 Сейчас в теме
Почему нельзя было Асинх писать в конце заголовка процедуры?
ong1990; tech96; goracio_99; Yashazz; Brunnen G; +5 Ответить
16. ixijixi 1913 25.10.22 08:35 Сейчас в теме
(2) Тоже резануло. Или инструкцией препроцессора &Асинх
Revachol; Yashazz; 0x00; +3 Ответить
3. sikuda 677 24.10.22 14:10 Сейчас в теме
Шутка: "Обращение в службу поддержки 1С — Здравствуйте, а не подскажите где поставить флажок в 1С чтобы не переписывать функцию Вопрос на Ждать ВопросАсинх и убрать непонятную приставку Асинх в функции?
Ответ от телеграмм канала 1С: «А что непонятного то? Уж куда проще, чем ОписаниеОповещения»… "
Ну и примерно об этом статья...

Для себя же пока не реализовал подобное в браузере не понял как это в принципе может реализоваться, только тогда и понимание встало на место - https://blog.sikuda.ru/?p=3257
NikusXXZ; +1 Ответить
4. Serg O. 297 24.10.22 14:12 Сейчас в теме
По теме Асинх - было неплохое видео от Андрея Овсянкина
https://www.youtube.com/watch?v=vt1aoPXx9fY
mrChOP93; starik-2005; +2 Ответить
8. starik-2005 3087 24.10.22 14:21 Сейчас в теме
(4)
было неплохое видео
Я как раз с ним и не согласен в плане асинхронных функций )))
А видео - да, отличное! Очень рекомендую всем посмотреть.
5. Strobe 24.10.22 14:12 Сейчас в теме
Жду асинхронных запросов к HTTP-сервисам - там резон действительно есть.


точно так же, без них приходится за помощью к внешним скриптам бегать
9. NikeeNik 79 24.10.22 14:32 Сейчас в теме
(5) таки в 21 версии асинх методы для HTTP-запросов есть:

ВызватьHTTPМетодАсинх
ЗаписатьАсинх
ИзменитьАсинх
ОтправитьДляОбработкиАсинх
ПолучитьАсинх
ПолучитьЗаголовкиАсинх
УдалитьАсинх
starik-2005; Jimbo; Serg O.; +3 Ответить
11. starik-2005 3087 24.10.22 14:50 Сейчас в теме
6. Sashares 35 24.10.22 14:17 Сейчас в теме
И если Вы внутри такой функции поставите "СтандартнаяОбработка = ложь", то система это не увидит, ибо она обработает стандартное событие до того, как асинхронная функция вернет хоть какой-то результат.


Не так.
В асинхронные процедуры и функции параметры передаются по значению, а не по ссылке, поэтому менять значения параметров, в том числе ставить СтандартнаяОбработка = Ложь в асинхронных процедурах/функциях не имеет смысла, т.к. они никуда не вернутся.
7. starik-2005 3087 24.10.22 14:20 Сейчас в теме
10. NikeeNik 79 24.10.22 14:36 Сейчас в теме
С одной стороны, этот суффикс получили все старые диалоговые методы/функции

Вот только сегодня с утра пытался вспомнить - есть ли асинх метод для ОткрытьФорму() и таки его нет, хотя тут возникает вопрос - возможно ли это вообще?
12. Alxby 1113 24.10.22 16:51 Сейчас в теме
(10)Нет такого метода. И что-то мне подсказывает, что появится нескоро (если вообще появится).
13. starik-2005 3087 24.10.22 17:14 Сейчас в теме
(10)
ОткрытьФорму()
Чтобы получить вариант модального выбора вместо процедуры из описания оповещения? Видимо сложность с тем, что в форме свои синхронные процедуры и функции.
18. NikeeNik 79 25.10.22 09:09 Сейчас в теме
(13) Немного потыкал на примерах - в асинх процедуре вполне вызываются другие асинх процедуры, процедуры на сервере с контекстом формы, можно открывать другие формы со своими серверными вызовами, обработчиками ожидания и тп. Так что наверное можно ожидать появления ОткрытьФормуАсинх(), хотя кто его знает.
22. Darklight 33 26.10.22 18:19 Сейчас в теме
Хм... асинх методы появились в 18-ом релизе платформы - но я думал для их исользования
(18)Попробовал вот так
&НаКлиенте
асинх функция ОткрытьФормуАсинх(ПутьКФрме, ПараметрыФормы=неопределено)                                
	Поток = Новый ПотокВПамяти();
	оп = Новый ОписаниеОповещения("ОткрытьФормуЗавершение",ЭтаФорма,
		Новый Структура("ДополнительныеПараметры, Семафор, Результат",
		?(ТипЗнч(ПараметрыФормы)=Тип("Структура") И ПараметрыФормы.Свойство("ДополнительныеПараметры"), ПараметрыФормы.ДополнительныеПараметры,неопределено),
		Поток));
	ОткрытьФорму(ПутьКФрме,ПараметрыФормы,?(ТипЗнч(ПараметрыФормы)=Тип("Структура") И ПараметрыФормы.Свойство("Владелец"), ПараметрыФормы.Владелец,неопределено),,,,оп);
	Пока ждать Поток.РазмерАсинх()=0 Цикл
		
	КонецЦикла;
	
КонецФункции

&НаКлиенте
асинх процедура ОткрытьФормуЗавершение(Результат, ДополнительныеПараметры) экспорт
	ДополнительныеПараметры.Вставить("Результат", Результат);
	ждать ДополнительныеПараметры.Поток.ЗаписатьАсинх(Новый БуферДвоичныхДанных(1),0,1);
Конецпроцедуры
Показать


Но не получилось - просто
Пока ждать Поток.РазмерАсинх()=0 Цикл
		
КонецЦикла;


блокируете ГУИ намертво.

Хотя в других ЯП await на одном асинхронном методе позволяет выполняться "параллельном" асинхронному методу - но ГУИ - это особый случай, хотя ничто особо не должно было мешать 1С сделать так, чтобы ожидание не блокировало ГУИ - хоть какая-то значимая польза была бы!
14. triviumfan 97 24.10.22 20:48 Сейчас в теме
Очень сухо. Мало примеров и объяснений. Про функцнии и процедуры ничего не понял. Про особенности подавно - там вообще не разобраться без пол-литра. Не ожидал. Думал, может хоть "Старик" сможет нормально объяснить, но нет.
Сергей, халтура.
mshi; Krotov_Valery; tolyan_ekb; ixijixi; bulpi; mrChOP93; r2d255; +7 Ответить
15. starik-2005 3087 25.10.22 00:57 Сейчас в теме
(14)
халтура
Ну так я честно написал, что для кого-то мудрость вековая, для других глупость, какой свет не видывал. Вся суть этой асинхронности для 1С смысла особого не имеет, вот в этом и есть основной посыл.
17. starik-2005 3087 25.10.22 09:01 Сейчас в теме
(14)
сухо
Ладно, расскажу подробнее.
Вот, допустим, есть у тебя код какой-нить, который дважды два считает. Этот код выполняется на твоем процессоре, а не на сервере лунном. В итоге ты думаешь, что асинхронно он у тебя может несколько дважды два сразу считать, но нет - не может. Т.е. он каждые дважды два будет считать последовательно, даже если ты обернешь это в "асинх".
А теперь допустим второе - у тебя дважды два считает сервер лунный, но две секунды - это к Луне и обратно. Ты сделал запрос, он улетел через роутеры на лунный сервер, твой комп ничего не делает - ждет. И вот тут если ты синхронно сто запросов обработаешь, то как минимум на ожидание сигнала ты потратишь по две секунды с каждого запроса, что выльется в два на сто, т.е. двести секунд. Но если ты сделаешь это асинхронно, то ты создашь за некоторое мгновение сто запросов лунному серверу, не ожидая ответа. В стародревние времена у тебя был бы коллбэк, который для каждых из этих ста запросов сработал бы, и ты вынужден бы был обрабатывать это все отдельно, хотя на джавах и прочем есть лямбда, поэтому функцию можно прописать прям в вот здесь. Но асинхронность дает тебе положить все результаты асинхронных функций в массив, т.е. как-то так:
Для А = 1 ПО 100 Цикл
  Ресурс = "/лунный.сервер.рф/"+А;
  МассивОжиданий(Запрос.ПолучитьАсинх(Ресурс, Заголовки));
КонецЦикла;
Для Каждого Ответ ИЗ МассивОжиданий Цикл
  РеальныйОтвет = Ждать Ответ;
  РазобратьсяСОтветом(РеальныйОтвет);
КонецЦикла;
Все. Ты не ждешь две секунды перед каждым следующим вызовом лунного сервера. И ты получаешь более простой вариант кода, чем с коллбэками, хотя, по-сути, ничего не поменялось.
gmw; VladimirElohov; Darklight; +3 Ответить
19. Somebody1 69 25.10.22 09:57 Сейчас в теме
Вот здесь у проекта "Курсы по 1С" есть достаточно исчерпывающая статья. Один раз прочитал — всё понял.

P.S. Никак ссылку не получается нормально вставить. Инфостарт, что ты делаешь, с конкурентами борешься?
gmw; oninfostart; starik-2005; +3 Ответить
20. starik-2005 3087 25.10.22 10:47 Сейчас в теме
(19)
достаточно исчерпывающая статья
Могу сказать только, что статья содержит ну просто невменяемо много букв и не содержит ничего из того, чего бы не было в этой статье с минимальным количеством букв, если не считать раздел про обработку исключений. Фактически статья ограничивает кейсы диалогами и высосанным из пальца копированием файла. В новых версиях 1С появился и асинхронный HTTP-запрос, что уже делает асинхронность чуть-чуть полезнее. В остальном ее полезность в том, чтобы тот самый callback hell преодолеть при последовательных вопросах, но сам по себе диалог, который задает последовательно больше одного вопроса, так себе, если, конечно, это не тест какой-нить, но там каждый вопрос - это отдельный фрейм, а не асинхронное нечто над формой...
23. lmnlmn 69 27.10.22 00:05 Сейчас в теме
(20) В лунном свете избавление от Callback Hell маленький шажок для человечества, но большой для 1С ))
24. starik-2005 3087 27.10.22 10:11 Сейчас в теме
(23) В этот ад только программисты-грешники, которые реализуют плохую архитектуру, попадали.
21. Indgo 414 25.10.22 12:06 Сейчас в теме
Как то писал я кошелек Etherium для 1С
Есть у меня такая процедура
&НаКлиенте
Процедура Баланс()
	элементы.ГиперсслкаКошелек.Заголовок = "Получение данных!";
	 Документ = Элементы.ДокументHTML.Документ;
	 //Объект.БалансКошелькаETH=АсинхронныеВызовы.БалансАсинхронно(Документ);	
	 Документ.defaultView.Check_balance();
	 БалансКошелькаETH =  Документ.defaultView.async_balance();
	 Если БалансКошелькаETH="Nll" тогда
		 ПодключитьОбработчикОжидания("Баланс",1);
	 иначе                                         
		 объект.БалансКошелькаETH=БалансКошелькаETH; 
		 ОтключитьОбработчикОжидания("Баланс");
		 элементы.ГиперсслкаКошелек.Заголовок = Документ.defaultView.GetWallet();
		Документ.defaultView.return_OK() 

	 КонецЕсли;	 
КонецПроцедуры
Показать


В свою очередь имеется асихронный вызов функции JavaScript
async function Check_balance() {
	  let balancePromise  = wallet.getBalance();
	  balancePromise.then((balance) => {
		 let parsed_balance = ethers.utils.formatEther(balance);
		 window.balance = parsed_balance;
		 document.write(JSON.stringify(balance))
	    return parsed_balance;

Так вот я не смогу добиться асихронного вызова функции:
Объект.БалансКошелькаETH=АсинхронныеВызовы.БалансАсинхронно(Документ);	

Пришлось делать через
ПодключитьОбработчикОжидания("Баланс",1) 
с плясками и бубенами с перезаписью переменной window.balance
25. Lapitskiy 1061 28.10.22 06:34 Сейчас в теме
28. starik-2005 3087 28.10.22 19:19 Сейчас в теме
(25) Даже писал там слова.
26. kser87 2470 28.10.22 17:01 Сейчас в теме
Никто так и не смог объяснить, зачем все это сделали
27. starik-2005 3087 28.10.22 19:16 Сейчас в теме
(26) Для, прости-хоспади, простоты. Типа пишешь теперь без колбэков. Все. Никакой многопоточности.
29. acrk 670 30.10.22 23:31 Сейчас в теме
В третьем примере (асинхронно) есть только описание процедуры. А где код, который приведет в попаданию в эту процедуру ?

Я понимаю так:
1.
...
Диалог = Новый ДиалогВыбораФайлов(Режим);
Если Диалог.Выбрать() Тогда
  ИмяФайла = Диалог.ПолноеИмяФайла;
  ... ОБРАБОТКА ФАЙЛА ...
КонецЕсли;


2.
...
Диалог = Новый ДиалогВыбораФайлов(Режим);
Диалог.Показать(Новый ОписаниеОповещения("ПриВыбореФайла", "ЭтаФорма", ДополнительныеПараметры));
// ЭТОТ КОД ПРИВЕДЕТ НАС В ПРОЦЕДУРУ "ПриВыбореФайла"
...
&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДополнительныеПараметры) Экспорт

  Если ЗначениеЗаполнено(Результат) Тогда
    ИмяФайла = Результат[0];
   ... ОБРАБОТКА ФАЙЛА ...
  КонецЕсли;

КонецПроцедуры
Показать

3.
... где тот код, который приведет в асинхронную процедуру ?
30. starik-2005 3087 31.10.22 21:04 Сейчас в теме
(29)
.. где тот код, который приведет в асинхронную процедуру ?
Э... А это что?
&НаКлиенте
Асинх Процедура ВыбратьИмяФайла(Команда)

  Диалог = Новый ДиалогВыбораФайлов(Режим);
  Результат = Ждать Диалог.ВыбратьАсинх();
  Если ЗначениеЗаполнено(Результат) Тогда
    ИмяФайла = Результат[0];
  КонецЕсли;

КонецПроцедуры
Показать
Эта процедура асинхронна уже, кода никакого не надо - достаточно юзать "Ждать".

ЗЫ: Сдается мне, что Вы слишком переоцениваете асинхронность вообще. Она - это тот самый выход из того самого ада коллбэков, в который попадают плохие программисты. Все, больше она ни для чего не нужна.
31. acrk 670 02.11.22 12:12 Сейчас в теме
Я не понимаю, что значит "юзать "Ждать""?
Напишите ту строчку кода, которая "юзает "Ждать"".
Или программа сама как-то это делает, в смысле "ждет"? Как часто?
32. starik-2005 3087 02.11.22 18:50 Сейчас в теме
(31)
Напишите ту строчку кода, которая "юзает "Ждать"".
Э...
Результат = Ждать Диалог.ВыбратьАсинх();
Это ровно то, что и...
Обещание = Диалог.ВыбратьАсинх(); // открыли диалог
Результат = Ждать Обещание; // ждем, пока в нем что-то нажмут, в переменной "Результат" то, что там нажали.
33. acrk 670 02.11.22 22:41 Сейчас в теме
(32) Это я понимаю....

А зачем было вот это:
Асинх Процедура ВыбратьИмяФайла(Команда)
...

?
Что изменилось бы, если бы не было "Асинх" ?
34. starik-2005 3087 02.11.22 23:20 Сейчас в теме
(33)
Что изменилось бы, если бы не было "Асинх" ?
Так черным же по белому, что нельзя использовать "Ждать" в неасинхронных процедурах и функциях...
35. acrk 670 02.11.22 23:42 Сейчас в теме
(34) Да. Пришлось опять погрузиться в изучение вопроса (Давно делал, забыл уже)
Собственно претензия моя состоит в том, что правильно было бы так написать:

1. Модальный код:
&НаКлиенте
Процедура ВыбратьИмяФайла(Команда)
Диалог = Новый ДиалогВыбораФайлов(Режим);
Если Диалог.Выбрать() Тогда
ИмяФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры

2. Код с описанием оповещения:
&НаКлиенте
Процедура ВыбратьИмяФайла(Команда)
Диалог = Новый ДиалогВыбораФайлов(Режим);
Диалог.Показать(Новый ОписаниеОповещения("ПриВыбореФайла", "ЭтаФорма", ДополнительныеПараметры));
КонецПроцедуры
...
&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
ИмяФайла = Результат[0];
КонецЕсли;
КонецПроцедуры

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

3. Асинхронно:
&НаКлиенте
Асинх Процедура ВыбратьИмяФайла(Команда)
Диалог = Новый ДиалогВыбораФайлов(Режим);
Результат = Ждать Диалог.ВыбратьАсинх();
Если ЗначениеЗаполнено(Результат) Тогда
ИмяФайла = Результат[0];
КонецЕсли;
КонецПроцедуры

Практически вернулись к привычной модальной записи, но имеем асинхронность, которую требует современное программное окружение 1С, вроде браузеров.
38. starik-2005 3087 05.11.22 11:51 Сейчас в теме
(35)
которую требует современное программное окружение 1С, вроде браузеров
Ну алерт ничего такого не требует. Вот лямбды - да, было бы прикольно в 1С увидеть, т.к. в всех этих браузерах асинхронность через код или прописанный в промисах прямо, или через авайт тот самый. Второе само по себе проще выглядит. А UB (неопределенное поведение) - это далеко не бич современных систем, по крайней мере по сравнению с CH (адом коллбэков).
36. ovasiliev 6 03.11.22 18:41 Сейчас в теме
Ну не знаю, я привык к технологии с описаниями оповещения. Именно потому, что она логически законченная, надёжная и работает без неожиданностей. Пусть и кода в два раза больше, но для меня он читается лучше, потому что логически структурированнее.
Как по мне, технология Асинх введена в 1С всё же для любителей синхронно выглядящего кода. И чтобы было модно, "как в C#".
Xershi; mrsmrv; d_sdr; +3 Ответить
37. acrk 670 04.11.22 17:53 Сейчас в теме
39. lev6975 27.06.24 19:30 Сейчас в теме
Не работает Ваш пример, ув. ТС!
Ошибку пишет:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(12,10)}: Оператор Ждать (Await) может употребляться только в асинхронных процедурах или функциях
Ответ = <<?>>Ждать Диалог .ВыбратьАсинх();
А нужно слово асинх фпереди писать...
Слона не заметил...
Синтакс фуфельный, хоть бы написали по человечьи...
40. starik-2005 3087 27.06.24 20:58 Сейчас в теме
(39)
Слона не заметил...
Бывает:
Асинхронно:
&НаКлиенте
Асинх Процедура ВыбратьИмяФайла(Команда)
Оставьте свое сообщение