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