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

Процедура МояПроцедура()
ПоказатьВопрос(ОповещениеБлаБла, "МойТекст",РежимДиалогаВопрос.ДаНетОтмена);
<<Вот тут 1С собака сама дальше идет, и выходит обратно в типовую процедуру
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

    //...


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


См. также:

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

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

     Методическая информация
6 FIXXXL
 
21.01.19
09:47
(4) общий смысл: весь код, который после ПоказатьВопрос() выносишь в процедуру ПослеЗакрытияВопроса() Описания оповещения

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

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

&НаКлиенте
Процедура ВыполнитьОсновноеДействие();
  ...
КонецПроцедуры
10 123GO
 
21.01.19
10:42
(9) Разве в таком случае после ПоказатьВопрос(...) в процедуре ПредварительныеПрверки() программа не продолжит выполнение асинхронно? И не уйдет обратно в место, где вызывалась ПредварительныеПрверки()?
11 123GO
 
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 ПоказатьВопрос()
15 catena
 
21.01.19
10:50
(7)Это рекомендации 1С

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

Отказ=Отказ Или проверкаN()
Если Отказ Тогда Возврат;конецесли;
ПоказатьВопрос(Проц2,Вопрос);
конецесли;
непроверятьусловия=Ложь;


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

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

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