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

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)

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

13.03.2024    3139    dsdred    16    

65

Как готовить и есть массивы

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

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

24.01.2024    7271    YA_418728146    25    

69

Планы обмена VS История данных

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

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

11.12.2023    7654    dsdred    36    

115

1С-ная магия

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

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

06.10.2023    20002    SeiOkami    46    

124

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

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

14.09.2023    13917    human_new    27    

77

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    10269    YA_418728146    7    

147

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6963    sebekerga    54    

99
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 1812 25.10.22 08:35 Сейчас в теме
(2) Тоже резануло. Или инструкцией препроцессора &Асинх
Revachol; Yashazz; 0x00; +3 Ответить
3. sikuda 676 24.10.22 14:10 Сейчас в теме
Шутка: "Обращение в службу поддержки 1С — Здравствуйте, а не подскажите где поставить флажок в 1С чтобы не переписывать функцию Вопрос на Ждать ВопросАсинх и убрать непонятную приставку Асинх в функции?
Ответ от телеграмм канала 1С: «А что непонятного то? Уж куда проще, чем ОписаниеОповещения»… "
Ну и примерно об этом статья...

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


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

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


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

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

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


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


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

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

P.S. Никак ссылку не получается нормально вставить. Инфостарт, что ты делаешь, с конкурентами борешься?
gmw; oninfostart; starik-2005; +3 Ответить
20. starik-2005 3046 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 3046 27.10.22 10:11 Сейчас в теме
(23) В этот ад только программисты-грешники, которые реализуют плохую архитектуру, попадали.
21. Indgo 410 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 1058 28.10.22 06:34 Сейчас в теме
28. starik-2005 3046 28.10.22 19:19 Сейчас в теме
(25) Даже писал там слова.
26. kser87 2444 28.10.22 17:01 Сейчас в теме
Никто так и не смог объяснить, зачем все это сделали
27. starik-2005 3046 28.10.22 19:16 Сейчас в теме
(26) Для, прости-хоспади, простоты. Типа пишешь теперь без колбэков. Все. Никакой многопоточности.
29. acrk 750 30.10.22 23:31 Сейчас в теме
В третьем примере (асинхронно) есть только описание процедуры. А где код, который приведет в попаданию в эту процедуру ?

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Практически вернулись к привычной модальной записи, но имеем асинхронность, которую требует современное программное окружение 1С, вроде браузеров.
38. starik-2005 3046 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 750 04.11.22 17:53 Сейчас в теме
Оставьте свое сообщение