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

0. starik-2005 2829 23.10.22 21:30 Сейчас в теме
Все же знают, что раньше было лучше! Возврат к истокам и погружение в детали...

Перейти к публикации

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

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

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


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

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


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

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

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


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


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

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

P.S. Никак ссылку не получается нормально вставить. Инфостарт, что ты делаешь, с конкурентами борешься?
oninfostart; starik-2005; +2 Ответить
20. starik-2005 2829 25.10.22 10:47 Сейчас в теме
(19)
достаточно исчерпывающая статья
Могу сказать только, что статья содержит ну просто невменяемо много букв и не содержит ничего из того, чего бы не было в этой статье с минимальным количеством букв, если не считать раздел про обработку исключений. Фактически статья ограничивает кейсы диалогами и высосанным из пальца копированием файла. В новых версиях 1С появился и асинхронный HTTP-запрос, что уже делает асинхронность чуть-чуть полезнее. В остальном ее полезность в том, чтобы тот самый callback hell преодолеть при последовательных вопросах, но сам по себе диалог, который задает последовательно больше одного вопроса, так себе, если, конечно, это не тест какой-нить, но там каждый вопрос - это отдельный фрейм, а не асинхронное нечто над формой...
23. lmnlmn 67 27.10.22 00:05 Сейчас в теме
(20) В лунном свете избавление от Callback Hell маленький шажок для человечества, но большой для 1С ))
24. starik-2005 2829 27.10.22 10:11 Сейчас в теме
(23) В этот ад только программисты-грешники, которые реализуют плохую архитектуру, попадали.
21. Indgo 323 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 2829 28.10.22 19:19 Сейчас в теме
26. kser87 2358 28.10.22 17:01 Сейчас в теме
Никто так и не смог объяснить, зачем все это сделали
27. starik-2005 2829 28.10.22 19:16 Сейчас в теме
(26) Для, прости-хоспади, простоты. Типа пишешь теперь без колбэков. Все. Никакой многопоточности.
29. acrk 728 30.10.22 23:31 Сейчас в теме
В третьем примере (асинхронно) есть только описание процедуры. А где код, который приведет в попаданию в эту процедуру ?

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Практически вернулись к привычной модальной записи, но имеем асинхронность, которую требует современное программное окружение 1С, вроде браузеров.
38. starik-2005 2829 05.11.22 11:51 Сейчас в теме
(35)
которую требует современное программное окружение 1С, вроде браузеров
Ну алерт ничего такого не требует. Вот лямбды - да, было бы прикольно в 1С увидеть, т.к. в всех этих браузерах асинхронность через код или прописанный в промисах прямо, или через авайт тот самый. Второе само по себе проще выглядит. А UB (неопределенное поведение) - это далеко не бич современных систем, по крайней мере по сравнению с CH (адом коллбэков).
36. ovasiliev 6 03.11.22 18:41 Сейчас в теме
Ну не знаю, я привык к технологии с описаниями оповещения. Именно потому, что она логически законченная, надёжная и работает без неожиданностей. Пусть и кода в два раза больше, но для меня он читается лучше, потому что логически структурированнее.
Как по мне, технология Асинх введена в 1С всё же для любителей синхронно выглядящего кода. И чтобы было модно, "как в C#".
37. acrk 728 04.11.22 17:53 Сейчас в теме
Оставьте свое сообщение
Вакансии
Программист/тестировщик
Москва
зарплата от 130 000 руб. до 150 000 руб.
Полный день

Ведущий разработчик 1С / Team lead отдела разработки 1С
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 130 000 руб. до 150 000 руб.
Полный день