|   |   | 
| 
 | Функции и процедуры Асинх | ☑ | ||
|---|---|---|---|---|
| 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) вызов асинх функции так же передает управление следующей предопределенной, не дожидаясь завершения вызванной асинхронной (фактически игнорируется кусок кода после асинх)     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |