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

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)

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

13.03.2024    2626    dsdred    16    

59

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    6076    dsdred    59    

86

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

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

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

24.01.2024    5977    YA_418728146    25    

68

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

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

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

11.12.2023    7072    dsdred    36    

113

1С-ная магия

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

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

06.10.2023    19181    SeiOkami    46    

118

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

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

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

14.09.2023    12903    human_new    27    

76

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

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

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

28.08.2023    9510    YA_418728146    6    

143

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

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

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

20.08.2023    6563    sebekerga    54    

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

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


как использовать п.3 - я особо не нашел ему применения?
7. sapervodichka 6805 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 87 31.01.22 17:30 Сейчас в теме
А в чем проблема для асинхронного вызова вопроса использовать 4ый вариант?
просто мне показалось что статья идет к тому что переходим на "Асинх" и "ждать", а в конце статьи вы говорите что используем вариант 2.

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

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


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

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

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

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

Источник: Синхронные и асинхронные вызовы в 1С
10. le_ 238 02.02.22 13:27 Сейчас в теме
В JavaScript примерно так же с асинхронными вызовами работают.
12. Yashazz 4725 03.02.22 12:48 Сейчас в теме
(10) Да вы что?! Правда??? Это они, гады, идею "обещаний" у 1С спёрли, не иначе!
11. Yashazz 4725 03.02.22 12:47 Сейчас в теме
Ну и кстати, это не "статья". Это как максимум заметка с четырьмя общеизвестными примерами. Ничего нового, ничего интересного.
15. Jimbo 9 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 1613 27.12.23 01:23 Сейчас в теме
2) Ранее Асинхсинхронный вызов выглядел так:

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