Имя: Пароль:
1C
1С v8
Блокируется форма во время асинхронной операции
0 pocketbeast
 
10.02.25
09:40
Всех горячо приветствую!

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

&НаКлиенте
Асинх Процедура Команда1(Команда)
	
	НовыеДанныеОбещание = ПолучитьНовыеДанныеАсинх();
	
	НоваяСтрока = ТЗ.Добавить();
	НоваяСтрока.Номер = ТЗ.Количество();
	НоваяСтрока.Данные = "Загрузка...";
	
	Если ТЗ.Количество() > 0 тогда
		Сообщить( ТЗ[ТЗ.Количество() - 1].Данные );	
	КонецЕсли;
	
	НовыеДанные = Ждать НовыеДанныеОбещание;
	
	НоваяСтрока.Данные = НовыеДанные;
	
КонецПроцедуры

&НаКлиенте
Асинх Функция ПолучитьНовыеДанныеАсинх()
	
	Ждать 1;
	
	Для Ин = 0 по 2000000 цикл
	КонецЦикла;
	
	Возврат "Новые данные";
	
КонецФункции


Причем, интересно, что работа кода не останавливается. В сообщить действительно выводится "Загрузка...", но вот на форме происходит долгое зависание (при котором она ни на что не реагирует), а только потом появляется строчка с данными "Новые данные". Почему так? Есть ли способ не блокировать форму при асинхронной операции?
1 Волшебник
 
10.02.25
09:40
Ждать 1; — это ждать 1 секунду что ли?
2 pocketbeast
 
10.02.25
09:48
(1) Нет, это чтобы асинхронная функция с этой строчки вернула управление той процедуре, из которой она была вызвана. В 1С просто такая система, что если асинхронная функция без оператора ждать, то она отработает как обычная, поэтому в этом тестовом примере это просто заглушка такая
3 arsik
 
гуру
10.02.25
09:51
Так вроде асинхронные функции не могут такое. Они просто упрощают разработку. Блокировка останется.
Вам нужны фоновые задания, а не асинхронные функции.
4 pocketbeast
 
10.02.25
10:04
(3) Честно говоря, больше всего такого ответа и боялся... В глубине сердца надежда еще теплилась из-за того, что код не блокируется, поэтому я и думал, что потоки автоматически будут разбиваться. Но, видимо, на саму форму и правда не распространяется. Спасибо большое за ответ! Тогда буду идти сложным путем
5 d4rkmesa
 
10.02.25
11:38
(0) &НаКлиенте используйте ПодключитьОбработчикОжидания(...) либо ВыполнитьВФоне через обвязку БСП (там опять-таки будет обработчик ожидания помимо фоновых заданий).
6 pocketbeast
 
10.02.25
11:57
(5) Да, так и делаю, спасибо. Просто сначала интересно было именно про асинхронность узнать. Потому что получается, что если поток формы все равно блокируется, то польза асинхронных функций во встроенном языке стремительно снижается. Грустно. Думал, что можно будет как в JavaScript с этим работать
7 Волшебник
 
10.02.25
14:50
(6) Директивы Асинх и Ждать нужны для веб-клиента и мобильного приложения, где нельзя подвиснуть на длительную операцию. Иначе браузер или мобильная ОС посчитает страницу/программу зависшей и предложит пользователю её закрыть.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший