Вход | Регистрация
 

ПоказатьВопрос() и асинхронность

ПоказатьВопрос() и асинхронность
Я
   123GO
 
21.01.19 - 09:21
Понадобилось в типовой конфигурации добавить возможность выбора пользователем решения. Сегодня я узнал про асинхронность выполнения некоторых процедур и функций, модальность, и то что ПоказатьВопрос() не ждет выбора, а продолжает выполнение.
Все такие молодцы, что пишут об этом в интернетах, а как все-таки заставить 1с ждать? Форму рисовать наверно как-то неправильно..
 
 
   Смотрящий
 
1 - 21.01.19 - 09:23
(0) Не использовать асинхронность - не православно.
Держи раскольника!
   FIXXXL
 
2 - 21.01.19 - 09:25
(0) не надо "ждать", выполнение кода продолжай после ответа на вопрос
   123GO
 
3 - 21.01.19 - 09:31
(2) чего-то мозгов не хватает(
   123GO
 
4 - 21.01.19 - 09:34
Процедура Типовая()
...
МояПроцедура()
...
КонецПроцедуры
Процедура МояПроцедура()
ПоказатьВопрос(ОповещениеБлаБла, "МойТекст",РежимДиалогаВопрос.ДаНетОтмена);
<<Вот тут 1С собака сама дальше идет, и выходит обратно в типовую процедуру
КонецПроцедуры

Функция ОповещениеБлаБла() Экспорт
БлаБла
КонецФункции
   oslokot
 
5 - 21.01.19 - 09:45
а если попробовать кликнуть на мужика в кепке?

Глобальный контекст.ПоказатьВопрос (Global context.ShowQueryBox)
Глобальный контекст (Global context)
ПоказатьВопрос (ShowQueryBox)
Синтаксис:

ПоказатьВопрос(<ОписаниеОповещенияОЗавершении>, <ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)
Параметры:

<ОписаниеОповещенияОЗавершении> (обязательный)

Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после закрытия окна ввода значения со следующими параметрами:
<РезультатВопроса> - результат выбора пользователя: значение системного перечисления или значение, связанное с нажатой кнопкой. В случае закрытия диалога по истечении времени - значение Таймаут,
<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
<ТекстВопроса> (обязательный)

Тип: Строка; ФорматированнаяСтрока. 
Текст задаваемого вопроса. 
<Кнопки> (обязательный)

Тип: РежимДиалогаВопрос; СписокЗначений. 
Задает состав и текст кнопок диалога, а также, связанные с кнопками значения.
При использовании типа СписокЗначений:
Значение – содержит значение, связанное с кнопкой. Это значение является возвращаемым значением при выборе кнопки. В качестве значения может использоваться значение перечисления КодВозвратаДиалога, а также другие значения; 
Представление – задает текст кнопки. Если представление не задано и в качестве значения используется значение перечисления КодВозвратаДиалога, то используется стандартное представление; 
Картинка – не используется (должна быть пустой); 
Пометка – не используется (должна быть пустой).
При использовании типа СписокЗначений список не должен быть пустым. 
<Таймаут> (необязательный)

Тип: Число.
Интервал времени в секундах, в течение которого система будет ожидать ответа пользователя. По истечении интервала окно вопроса будет закрыто. Если параметр не указан, то время ожидания не ограничено.
Если параметр имеет отрицательное значение, будет сгенерировано исключение.
Значение по умолчанию: 0.
<КнопкаПоУмолчанию> (необязательный)

Тип: Произвольный.
Определяет кнопку по умолчанию по типу кнопки или по связанному с ней значению.
<Заголовок> (необязательный)

Тип: Строка. 
Содержит заголовок окна вопроса. 
<КнопкаТаймаута> (необязательный)

Тип: Произвольный.
Определяет кнопку (по типу кнопки или по связанному с ней значению), на которой отображается количество секунд, оставшихся до истечения таймаута.
Возвращаемое значение:

Результат выбора пользователя будет передан в метод, описанный параметром <ОписаниеОповещенияОЗавершении>.
Описание:

Выводит на экран окно вопроса, при этом не ожидается завершения ответа пользователя.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение(клиент).
Пример:

Режим = РежимДиалогаВопрос.ДаНет;
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтаФорма, Параметры);
ПоказатьВопрос(Оповещение, НСтр("ru = 'Продолжить выполнение операции?';"
    + " en = 'Do you want to continue?'"), Режим, 0);
//...



&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
    Если Результат = КодВозвратаДиалога.Нет Тогда
        Возврат;
    КонецЕсли;

    //...



КонецПроцедуры
 

См. также:

Глобальный контекст, метод ПоказатьПредупреждение

--------------------------------------------------------------------------------

     Методическая информация
   FIXXXL
 
6 - 21.01.19 - 09:47
(4) общий смысл: весь код, который после ПоказатьВопрос() выносишь в процедуру ПослеЗакрытияВопроса() Описания оповещения
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтаФорма, Параметры);
   123GO
 
7 - 21.01.19 - 10:24
(6) Как-то не хочется весь код разработчика этой процедуры переносить в другое место
   ДенисЧ
 
8 - 21.01.19 - 10:32
(7) А придётся.
   Василий Алибабаевич
 
9 - 21.01.19 - 10:38
(7) Общая схема всего мероприятия примерно такая :
&НаКлиенте
Процедура ПредварительныеПрверки()
  Если ПроверкиВыполнены() Тогда
    ВыполнитьОсновноеДействие();
  Иначе
    Обработчик = Новый ОписаниеОповещения...
    ПоказатьВопрос(...)
  КонецЕсли;
  //ПоказатьВопрос последняя в теле основной процедуры

КонецПроцедуры

&НаКлиенте
Процедура ОбработчикВопроса(Результат, П) Экспорт
  Если Результат = КодВозвратаДиалога.Да Тогда
    //Получили положительный ответ от пользователя

    //выполним основные действия

    ВыполнитьОсновноеДействие();
  КонецЕсли;
  //При всех других результатах (отказ, таймаут, Нет)

  //тихонечко умрем и ничего делать не будем

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОсновноеДействие();
  ...
КонецПроцедуры
   123GO
 
10 - 21.01.19 - 10:42
(9) Разве в таком случае после ПоказатьВопрос(...) в процедуре ПредварительныеПрверки() программа не продолжит выполнение асинхронно? И не уйдет обратно в место, где вызывалась ПредварительныеПрверки()?
 
 Рекламное место пустует
   123GO
 
11 - 21.01.19 - 10:46
Иначе бы и тут
&НаКлиенте
Процедура Типовая()
...
МояПроцедура()
...
КонецПроцедуры 
Процедура МояПроцедура()
ПоказатьВопрос(ОповещениеБлаБла, "МойТекст",РежимДиалогаВопрос.ДаНетОтмена);
<<ТУТ бы процедура закончила выполнения и не выходила обратно в Типовую
КонецПроцедуры

Функция ОповещениеБлаБла() Экспорт
БлаБла
КонецФункции
   Мыш
 
12 - 21.01.19 - 10:48
(10) Продолжит. Поэтому там и написан комментарий://ПоказатьВопрос последняя в теле основной процедуры


Последняя. Повторю: последняя.
   ДенисЧ
 
13 - 21.01.19 - 10:48
(10) Комментарий прочитай. После ПоказатьВопрос() процедура закончилась, там больше делать нечего
   Вафель
 
14 - 21.01.19 - 10:49
await ПоказатьВопрос()
   catena
 
15 - 21.01.19 - 10:50
(7)Это рекомендации 1С

https://its.1c.eu/db/metod8dev#content:5272:hdoc
   PR
 
16 - 21.01.19 - 10:58
(0) Никак
   Asmody
 
17 - 21.01.19 - 11:01
(14) Смешно
   123GO
 
18 - 21.01.19 - 11:15
Слишком накладно для "приятной фичи пользователям"
Переделывать
Процедура Проц1()
Процедура Проц2()
...
Процедура ПроцN()
Отказ = ПроверкаУсловия1()
Отказ = ПроверкаУсловияN()
Отказ = ПровекаМоегоУсловия(Условие выполнено - ПоказатьВопрос(Пользователь должен сам решить))
Если Не Отказ Тогда ПробейЧек() КонецЕсли;
   MyNick
 
19 - 21.01.19 - 11:20
(18) такова жизнь
   Мыш
 
20 - 21.01.19 - 11:26
(18) Забей, не переделывай. Скажи всем, что эта фича никому не нужна.
   Fish
 
21 - 21.01.19 - 11:29
(20) Правильно! Хорошая программа принимает решения сама, без вопросов :)
   Eiffil123
 
22 - 21.01.19 - 11:46
(18) если вэб-интерфейс не используется (а с чеками это скорее всего так), то можно на уровне всей конфигурации отключить проверку модальности и пользоваться старыми методами
   FIXXXL
 
23 - 21.01.19 - 12:22
(18) как вариант: перед ключевым моментом собери ответы пользователя да хоть в реквизит формы, внутри типового только анализируй результаты ответов
   SUA
 
24 - 21.01.19 - 12:23
См типовые документы с такой реализацией - будет что-то типа
  >>НеПроверятьУсловия - Булево
Проц1
Если НеПроверятьУсловия = Ложь Тогда
Отказ=проверка1()
…
Отказ=Отказ Или проверкаN()
Если Отказ Тогда Возврат;конецесли;
ПоказатьВопрос(Проц2,Вопрос);
конецесли;
непроверятьусловия=Ложь;


Проц2
Если ПользовательСогласен Тогда
  НеПроверятьУсловия = Истина;
Проц1();
КонецЕсли;
КонецПроцедуры
   Fish
 
25 - 21.01.19 - 12:45
(22) " можно на уровне всей конфигурации отключить проверку модальности и пользоваться старыми методами" - Можно, но имхо лучше так не делать.
   Скиурус
 
26 - 21.01.19 - 13:01
>>Слишком накладно для "приятной фичи пользователям"

Да в принципе, когда привыкнешь, не так уж и накладно.
   Вафель
 
27 - 21.01.19 - 13:02
(25) ну в бп до сих пор разрешена модальность (по карйней мере в УХ)
   Fish
 
28 - 21.01.19 - 16:44
(27) Ну если разрешена - это другое дело. Но если запрещена, то не стоит это менять.
   Вафель
 
29 - 21.01.19 - 17:16
(28) вполне можно менять. разрешена > запрещена. Сломать ничего нельзя.
кроме веб клиента
   123GO
 
30 - 22.01.19 - 03:58
Ничего-себе вы тут наотвечали) Всем спасибо!) У нас просто вчера уже ночь наступила)

Вкратце, суть задачи: Есть сеть магазинов франчей, т.е. у каждого свой владелец. Они начали возражать по поводу подарочных сертификатов. Мол, почему, если клиент заплатил сертификат другому магазину, должен получать товар у меня бесплатно?. Руководство решило, что сертификат можно погасить только в магазине, где купили (странно по отношению к покупателю). Из РМК вызывается БСПшный модуль МаркетинговыеАкции, где сертификаты проверяются на реализацию и погашение, я добавил проверку на реализацию в другом магазине. Но хочу добавить возможность выбора, потому как, зная руководство, этот вопрос в скором поднимется.
   catena
 
31 - 22.01.19 - 05:13
(30)Как вариант, чтобы не разбивать модули, можно заставить принимать решение до обработки. Например, галочка на форме: НЕ проверять владельца сертификата.
   123GO
 
32 - 22.01.19 - 05:25
(31) Проверять или нет сделал реквизитом справочника Магазины.  Сейчас попробую привязать проверку к форме подбора оплат, а не в процедуру пробития чека, после момента добавления сертификата в ТЧ оплат.
   123GO
 
33 - 25.01.19 - 04:27
Плюнул(20)
 
 
   OpKc
 
34 - 25.01.19 - 04:49
(30) А по условиям франшизы разве не обязателен приём подарочных сертификатов во всех магазинах сети, независимо от места приобретения? Странная франшиза какая-то.
   123GO
 
35 - 25.01.19 - 05:02
(34) Вот и я говорю


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует