Имя: Пароль:
1C
 
Функции и процедуры Асинх
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) вызов асинх функции так же передает управление следующей предопределенной, не дожидаясь завершения вызванной асинхронной (фактически игнорируется кусок кода после асинх)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан