Синхронный и асинхронный вызов в новых версиях платформы

31.01.22

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

Начиная с платформы 8.3.18.1128 переработана технология работы с асинхронными вызовами. В данной статье хочу описать новые асинхронные вызовы и сравнить их с предыдущими на примере функции - Вопрос на клиенте.

 

1) Ранее синхронный вызов выглядел так:

&НаКлиенте
Процедура СинхронныйВызов(Команда)

	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	Ответ = Вопрос("Ваш ответ?", Ответы);
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
	
	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	
		
КонецПроцедуры

Данный вызов имеет ограничение на модальность - какой режим стоит в конфигурации по использованию модальности.

Выполнение данного кода выглядит так:

Функция - Вопрос будет ждать ответа от пользователя, а только после ответа будет выполняться весь последующей код.

 

2) Ранее Асинхсинхронный вызов выглядел так:

&НаКлиенте
Процедура АсинхронныйВызов(Команда)
	
	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	ОписаниеОповещения = Новый ОписаниеОповещения("АсинхронныйВызовЗавершение", ЭтотОбъект);
	ПоказатьВопрос(ОписаниеОповещения, "Ваш ответ?", Ответы);	
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
		
КонецПроцедуры

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

	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	

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

Выполнение данного кода выглядит так:

Весь код процедуры выполнится сразу, а код оповещения выполнится, только после ответа пользователя.

 

3) Новый Асинхронный вызов:

Функция - ВопросАсинх возвращает ответ нового типа - Обещание:

 

 

Код:

&НаКлиенте
Асинх Процедура АсинхВызов(Команда)

    Ответы = Новый СписокЗначений;
    Ответы.Добавить("Ответ1");
    Ответы.Добавить("Ответ2");
    
    ОтветАсинх = ВопросАсинх("Ваш ответ?", Ответы);
    ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
    
    Ответ = Ждать ОтветАсинх;
    Если Ответ = "Ответ2" Тогда
        ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
    Иначе
        ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
    КонецЕсли;    
    
КонецПроцедуры

Сама процедура имеет признак - Асинх.

Выполнение данного кода выглядит так:

При таком варианте, мы олучаем асинхронный вариант с возвратом к ожидаем в точке - Ждать.

ВопросАсинх возвращает тип - Обещание.

 

4) Новый асинхронный(синхронный) вызов:

Добавим в пункт 3 команду - Ждать.

Код будет выглядеть следующем образом:

&НаКлиенте
Асинх Процедура СинхронныййВызовНовый(Команда)

	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	Ответ = Ждать ВопросАсинх("Ваш ответ?", Ответы);
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
	
	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	
	
КонецПроцедуры

При такой конструкции код отработает следующем образом:

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

 

Вывод для себя сделал такой:

Если нужен синхронный вызов вопроса, то можно использовать 1 вариант (но тут нужно учитывать режим - модальности) или 4-й вариант (новый), а чтобы выполнить асинхронный вызов вопроса нужно использовать 3-й вариант или 2-й вариант (менее предпочтительный).

 

Тестирования проводились на платформе 8.3.18.1208.

См. также

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

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

23.06.2024    7448    bayselonarrend    20    

154

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

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

13.03.2024    5943    dsdred    16    

80

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

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

24.01.2024    17667    YA_418728146    26    

71

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

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

11.12.2023    11223    dsdred    44    

130

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

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

06.10.2023    23759    SeiOkami    48    

135

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

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

14.09.2023    18830    human_new    27    

80

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

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

28.08.2023    14732    YA_418728146    7    

166
Отзывы
13. demaxim 97 04.02.22 23:45 Сейчас в теме
(4)
Вариант 3 неправильный. Получается всего 3 варианта.
Вот третий вариант, который дает ту же картину сообщений как и второй:
&НаКлиенте
Асинх Процедура АсинхВызов(Команда)

	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	ОтветАсинх = ВопросАсинх("Ваш ответ?", Ответы);
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
	
	Ответ = Ждать ОтветАсинх;
	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	
	
КонецПроцедуры
Показать
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 6912 31.01.22 15:02 Сейчас в теме
Пока сам юзаю п.2, п.3 уже видел у кандидата на работу в коде (удивился), п.4 со Ждать увидел первый раз. Спасибо. Новый асинх надо обязательно попробовать.
3. Shining_ninja 2189 01.02.22 05:55 Сейчас в теме
(1)
Пока сам юзаю п.2, п.3 уже видел у кандидата на работу в коде (удивился),


как использовать п.3 - я особо не нашел ему применения?
7. sapervodichka 6912 01.02.22 11:20 Сейчас в теме
(3) я тогда код читал, и в режиме предприятия не пробовал, но вроде была у кандидата обработка документов, в динамическом списке, когда жали на кнопку обработки выбранных строк с асин вопросом, обработка делалась в фоновом задании (что-то дополнительное создавалось и отображалось на форме), потом пользователю надо было увидеть и зафиксировать факт успешно или нет, ответив на вопрос, если он отвечал что не достаточно, то что-то повторно дораспределлялось.... какая-то такая ситуация была не типичная....
8. eden 02.02.22 08:39 Сейчас в теме
(3) Получить Обещание, потом выполнять любой код, потом выполнить "Ждать Обещание".
https://wonderland.v8.1c.ru/blog/uluchsheniya-v-sintaksise-yazyka-1s-dlya-raboty-s-asinkhronnymi-funktsiyami/?sphrase_id=268505
2. burni4 89 31.01.22 17:30 Сейчас в теме
А в чем проблема для асинхронного вызова вопроса использовать 4ый вариант?
просто мне показалось что статья идет к тому что переходим на "Асинх" и "ждать", а в конце статьи вы говорите что используем вариант 2.

ps из собственного опыта, если платформа позволят, то исключительно для более удобного чтения кода, асинх выигрывает, а так дело вкуса.
al.gerasimov; +1 Ответить
4. Shining_ninja 2189 01.02.22 05:56 Сейчас в теме
(2)
А в чем проблема для асинхронного вызова вопроса использовать 4ый вариант?
просто мне показалось что статья идет к тому что переходим на "Асинх" и "ждать", а в конце статьи вы говорите что используем вариант 2.

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


я возможно не разобрался, но как сделать вызов на подобия п.2 в п.4.

Чтобы появился вопрос и потом выполнился нужный код и только после ответа пользователя, вернулось выполнение к ответу вопроса.
5. AneJIbcuH 40 01.02.22 09:36 Сейчас в теме
(4) а для чего вам такой алгоритм может пригодиться ?
Как я понял, Асинх сделали, чтобы код стал похожим на прошлые модальные (синхронные) вызовы. Вы какие-то неверные пути ищите.
Риник; al.gerasimov; +2 1 Ответить
6. burni4 89 01.02.22 09:55 Сейчас в теме
(4) оно так и работает, по сути п4 это синтаксический сахар для п2
13. demaxim 97 04.02.22 23:45 Сейчас в теме
(4)
Вариант 3 неправильный. Получается всего 3 варианта.
Вот третий вариант, который дает ту же картину сообщений как и второй:
&НаКлиенте
Асинх Процедура АсинхВызов(Команда)

	Ответы = Новый СписокЗначений;
	Ответы.Добавить("Ответ1");
	Ответы.Добавить("Ответ2");
	
	ОтветАсинх = ВопросАсинх("Ваш ответ?", Ответы);
	ОбщегоНазначенияКлиент.СообщитьПользователю("Ждем ответа");
	
	Ответ = Ждать ОтветАсинх;
	Если Ответ = "Ответ2" Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю("Верно");
	Иначе
		ОбщегоНазначенияКлиент.СообщитьПользователю("Не верно");
	КонецЕсли;	
	
КонецПроцедуры
Показать
14. Shining_ninja 2189 07.02.22 07:12 Сейчас в теме
(13) Спасибо, изменил статью.
9. Yashazz 4790 02.02.22 12:26 Сейчас в теме
Я б поворчал на тему того, что есть модальность и что есть блокировка интерфейса... А равно и на тему того, чем асинхронность от многопоточности отличается... И что всё это "не муж и жена, а 4 разных человека"... Но толку-то.

Особенно забавно было и есть слышать от апологетов "немодальности", какое теперь всё продвинутое. А потом взять, к примеру, любой системный диалог платформы, вроде выбора варианта отчёта, или сохранения файла, или настройки дин.списка... И задуматься, а нафига было сражаться с окнами, блокирующими интерфейс приложения целиком, если их в самой платформе-то оставили...
19. RustIG 1747 27.12.23 01:38 Сейчас в теме
(9) Возможно, изначально асинхронность понадобилась только для работы с файлами и криптографией.
Нужно отметить, что все процедуры и функции встроенного языка работают как синхронные вызовы.

Источник: Синхронные и асинхронные вызовы в 1С
10. le_ 243 02.02.22 13:27 Сейчас в теме
В JavaScript примерно так же с асинхронными вызовами работают.
12. Yashazz 4790 03.02.22 12:48 Сейчас в теме
(10) Да вы что?! Правда??? Это они, гады, идею "обещаний" у 1С спёрли, не иначе!
11. Yashazz 4790 03.02.22 12:47 Сейчас в теме
Ну и кстати, это не "статья". Это как максимум заметка с четырьмя общеизвестными примерами. Ничего нового, ничего интересного.
15. Jimbo 10 07.02.22 16:21 Сейчас в теме
Для примера сойдёт, но смысла в 3-4 не особо вижу. Наверно эти методы для другого, надо бы Яву поизучать.
16. al.gerasimov 22.08.22 04:42 Сейчас в теме
Это для того, чтобы другие потоки могли выполняться.(за пределами этой ф-ий)
17. al.gerasimov 22.08.22 04:48 Сейчас в теме
П.4. не стал синхронным. Тут просто надо забыть про 1с и почитать про Таски или Обещания в других языках программирования. Там все намного хитрее под капотом. Если очень кратко - то каждая процедура Асинк в реальности - это несколько процедур (по количемтву ожиданий +1) и существует спец планировщик (state machine) который возвращает выполнение на след. сточку после каждого ожидания, когда то что ждем выполнилось. Т.е. грубо мы дошли до Ждать (а на самом деле "вышли" из процедуры и занимаемся другим кодом), после того, как ожидание готово, мы вернулись и продолжили код.
18. RustIG 1747 27.12.23 01:23 Сейчас в теме
2) Ранее Асинхсинхронный вызов выглядел так:

опечатка
Оставьте свое сообщение