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.