|
Функции и процедуры Асинх | ☑ | ||
---|---|---|---|---|
0
patapum
05.12.23
✎
15:34
|
Кто работал с этим и использовал в реальных решениях? Что делали на этом?
Мне пока нужно было решить такую задачу. Перед записью в форме пользователю нужно задать несколько вопросов, если все ответы Да, то записать, если хоть один Нет, то отказаться. Писать их все через Описания оповещения просто трындец, и я не стал. В процедуре перед записью вызываю отказ от записи (если не взведен специальный флаг ВсеОтветыДа) и запускаю асинхронную процедуру болтовни с пользователем через вызовы ВопросАсинх. А в конце этой процедуры, если все ответы Да, то взвожу флаг - соответственно по нему пойдет нормальная запись, еще раз вызываю запись, и снимаю флаг обратно. Но выглядит как костыль, поэтому возникает вопрос, а что-то реально красивое можно сделать на этом механизме? |
|||
1
mikecool
05.12.23
✎
15:44
|
создай одну форму, где пользователь ответит на все вопросы и нажмет ОК
|
|||
2
patapum
05.12.23
✎
15:49
|
(1) Это как раз можно сделать. Но то, что здесь можно обойтись без Асинх, не решает заданного вопроса, а делает его только актуальнее. А что можно сделать через Асинх, что выглядит элегантно, и не может быть или сложно может быть решено без него? Есть варианты?
|
|||
3
mikecool
05.12.23
✎
15:52
|
(2) ничего через Асинх сделать элегантнее не получится ))
сначала надели калоши ,теперь натягиваем валенки |
|||
4
mikecool
05.12.23
✎
15:53
|
и я не предлагаю элегантнее, я предлагаю не издеваться над пользователями
|
|||
5
patapum
05.12.23
✎
15:59
|
(3) окей, понял, забил на это
(4) они заслужили. сами привыкли к этому на ОФ, теперь на УФ "хотим так же (с)". эти пользователи сами кого хочешь сожрут ))) |
|||
6
АнализДанных
05.12.23
✎
16:14
|
(0) Используй Асинх, сильно упрощает жизнь, меньше кода, код понятней.
Асинх Процедура ЗадатьВопросы() Ответ = Ждать ВопросАсинх("Вопрос 1", РежимДиалогаВопрос.ОКОтмена); Если Ответ <> КодВозвратаДиалога.ОК Тогда Возврат; КонецЕсли; Ответ2 = Ждать ВопросАсинх("Вопрос 2", РежимДиалогаВопрос.ОКОтмена); Если Ответ2 <> КодВозвратаДиалога.ОК Тогда Возврат; КонецЕсли; // Основной код КонецПроцедуры |
|||
7
АнализДанных
05.12.23
✎
16:38
|
Наверное не так прочитал вопрос из (0). Непонятно зачем ты 2 раза запись вызываешь? Ничего костыльного в таком коде нет, если он выполняется до записи и из-за долго ожидания ответа пользователя система ничего не блокирует. Получается довольно простой код.
МассивВопросов = Новый Массив; МассивВопросов.Добавить("Вопрос 1 ?"); МассивВопросов.Добавить("Вопрос 2 ?"); ... МассивВопросов.Добавить("Вопрос n ?"); Для Каждого ТекстВопроса Из МассивВопросов Цикл Ответ = Ждать ВопросАсинх(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); Если Ответ <> КодВозвратаДиалога.ОК Тогда Возврат Ложь КонецЕсли; КонецЦикла; Возврат Истина; |
|||
8
patapum
05.12.23
✎
16:46
|
(7) Попробуй это вызвать в процедуре Перед записью. Думаю, удивишься. Твоя функция вернется в вызывавшую ее процедуру на первом Ждать, и значение она вернет не булевого типа
|
|||
9
vde69
05.12.23
✎
16:53
|
(8)
Процедура призаписи() если не ВсеВопросы() тогда отказ = истина конецпроцедуры Асинх функция ВсеВопросы() МассивВопросов = Новый Массив; МассивВопросов.Добавить("Вопрос 1 ?"); МассивВопросов.Добавить("Вопрос 2 ?"); ... МассивВопросов.Добавить("Вопрос n ?"); Для Каждого ТекстВопроса Из МассивВопросов Цикл Ответ = Ждать ВопросАсинх(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); Если Ответ <> КодВозвратаДиалога.ОК Тогда Возврат Ложь КонецЕсли; КонецЦикла; Возврат Истина; конецфункции |
|||
10
patapum
05.12.23
✎
17:07
|
(9) Запускал?
|
|||
11
АНДР
05.12.23
✎
17:15
|
(0) "... красивое ..." - нарушить описанный в документации порядок выполнения предопределённых процедур.
|
|||
12
patapum
05.12.23
✎
17:57
|
(11) Нарушить описанный в документации порядок выполнения предопределённых процедур - вроде как невозможно? И не то чтобы я его нарушил. Впрочем, если у вас есть решение лучше - предлагайте?
|
|||
13
АнализДанных
05.12.23
✎
18:02
|
(8) Проверил, был не прав. Видимо ничего красивого не сделать.
Только не понял про "и значение она вернет не булевого типа", там все возвращается как надо, только "Отказ=Истина" игнорируется и запись объекта все равно происходит. |
|||
14
АНДР
05.12.23
✎
19:39
|
(12) вызов асинх функции так же передает управление следующей предопределенной, не дожидаясь завершения вызванной асинхронной (фактически игнорируется кусок кода после асинх)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |