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

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С Бесплатно (free)

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

06.10.2023    14679    SeiOkami    46    

112

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

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

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

14.09.2023    8929    human_new    27    

68

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

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

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

28.08.2023    5541    YA_418728146    6    

119

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

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

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

20.08.2023    5094    sebekerga    54    

88

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    11159    SeiOkami    24    

90

Методы работы с универсальным отчетом в подсистеме "Варианты отчетов" на БСП

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

В данной статье рассмотрим типовую подсистему "Варианты отчетов" БСП на примере применения в универсальном отчете любой современной конфигурации.

30.05.2023    4018    quazare    4    

85

Расширение глобального поиска 1С, или Глобальный поиск "на максималках"

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

Мало кто знает, что поле "Глобального поиска" в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.

27.03.2023    6068    SeiOkami    10    

133

Версионирование объектов VS История данных

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

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    13368    dsdred    48    

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

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


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

ps из собственного опыта, если платформа позволят, то исключительно для более удобного чтения кода, асинх выигрывает, а так дело вкуса.
al.gerasimov; +1 Ответить
4. Shining_ninja 2136 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 85 01.02.22 09:55 Сейчас в теме
(4) оно так и работает, по сути п4 это синтаксический сахар для п2
13. demaxim 90 04.02.22 23:45 Сейчас в теме
(4)
Вариант 3 неправильный. Получается всего 3 варианта.
Вот третий вариант, который дает ту же картину сообщений как и второй:
&НаКлиенте
Асинх Процедура АсинхВызов(Команда)

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

Особенно забавно было и есть слышать от апологетов "немодальности", какое теперь всё продвинутое. А потом взять, к примеру, любой системный диалог платформы, вроде выбора варианта отчёта, или сохранения файла, или настройки дин.списка... И задуматься, а нафига было сражаться с окнами, блокирующими интерфейс приложения целиком, если их в самой платформе-то оставили...
10. le_ 212 02.02.22 13:27 Сейчас в теме
В JavaScript примерно так же с асинхронными вызовами работают.
12. Yashazz 4627 03.02.22 12:48 Сейчас в теме
(10) Да вы что?! Правда??? Это они, гады, идею "обещаний" у 1С спёрли, не иначе!
11. Yashazz 4627 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) который возвращает выполнение на след. сточку после каждого ожидания, когда то что ждем выполнилось. Т.е. грубо мы дошли до Ждать (а на самом деле "вышли" из процедуры и занимаемся другим кодом), после того, как ожидание готово, мы вернулись и продолжили код.
Оставьте свое сообщение