Асинхронная функция. Выводит на экран окно вопроса, при этом не ожидает завершения ответа пользователя.
Синтаксис
ВопросАсинх(<ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)Примеры платформы
Асинх Процедура ЗадатьВопросОПродолжении()
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Ждать ВопросАсинх(НСтр("ru = 'Продолжить выполнение операции?';"
+ " en = 'Do you want to continue?'"), Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
КонецПроцедурыПолное описание, параметры и ограничения
Глобальный контекст.ВопросАсинх (Global context.DoQueryBoxAsync)
Глобальный контекст (Global context)
ВопросАсинх (DoQueryBoxAsync)
Доступен, начиная с версии 8.3.18.
Синтаксис:
ВопросАсинх(<ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)
Параметры:
<ТекстВопроса> (обязательный)
Тип: Строка, ФорматированнаяСтрока.
Текст задаваемого вопроса.
<Кнопки> (обязательный)
Тип: РежимДиалогаВопрос, СписокЗначений.
Задает состав и текст кнопок диалога, а также, связанные с кнопками значения.
При использовании типа СписокЗначений:
Значение – содержит значение, связанное с кнопкой. Это значение является возвращаемым значением при выборе кнопки. В качестве значения может использоваться значение перечисления КодВозвратаДиалога, а также другие значения;
Представление – задает текст кнопки. Если представление не задано и в качестве значения используется значение перечисления КодВозвратаДиалога, то используется стандартное представление;
Картинка – не используется (должна быть пустой);
Пометка – не используется (должна быть пустой).
При использовании типа СписокЗначений список не должен быть пустым.
<Таймаут> (необязательный)
Тип: Число.
Интервал времени в секундах, в течение которого система будет ожидать ответа пользователя. По истечении интервала окно вопроса будет закрыто. Если параметр не указан, то время ожидания не ограничено.
Если параметр имеет отрицательное значение, будет сгенерировано исключение.
Значение по умолчанию: 0.
<КнопкаПоУмолчанию> (необязательный)
Тип: Произвольный.
Определяет кнопку по умолчанию по типу кнопки или по связанному с ней значению.
<Заголовок> (необязательный)
Тип: Строка.
Содержит заголовок окна вопроса.
Если не установлен, то у диалога заголовок не отображается.
<КнопкаТаймаута> (необязательный)
Тип: Произвольный.
Определяет кнопку (по типу кнопки или по связанному с ней значению), на которой отображается количество секунд, оставшихся до истечения таймаута.
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - результат выбора пользователя: значение системного перечисления или значение, связанное с нажатой кнопкой.
Если диалог закрыт по истечении времени - значение свойства Таймаут.
Описание:
Асинхронная функция. Выводит на экран окно вопроса, при этом не ожидает завершения ответа пользователя.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
Примечание:
Ширина всех кнопок диалога одинакова и равна ширине самой широкой кнопки.
Ширина текста в диалоге ограничена 40 символами.
Пример:
Асинх Процедура ЗадатьВопросОПродолжении()
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Ждать ВопросАсинх(НСтр("ru = 'Продолжить выполнение операции?';"
+ " en = 'Do you want to continue?'"), Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
КонецПроцедуры
См. также:
Глобальный контекст, метод Вопрос
Глобальный контекст, метод ПоказатьВопрос
Использование в версии:
Доступен, начиная с версии 8.3.18.
Методическая информация
Практические примеры
Получить рабочий каталог своей базы только после подтверждения
Функция может создать отсутствующий каталог текущего пользователя и базы. Сначала явно спрашиваем разрешение; отказ завершает урок до обращения к функции.
Где и как запускать
Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте внешнюю обработку УчебныйПланФайла с пустой управляемой основной формой. Для этого урока используйте тонкий клиент Windows.
В свойствах формы → События назначьте ПриСозданииНаСервере. Вставьте весь код на уровне модуля формы, включая Перем Занято и асинхронный обработчик команды.
Не создавайте кнопку вручную: она добавляется серверным обработчиком. Каждый урок запускайте в отдельной копии формы, сохранённой в своей EPF.
Кнопка получает настоящий каталог клиентского компьютера и составляет план собственного текстового отчёта о трёх книгах по 250. Она не записывает, не открывает и не удаляет этот файл.
Объект Файл описывает путь, но его создание в коде не создаёт файл на диске. Проверки существования и типа каталога используют асинхронные методы с Ждать.
РабочийКаталогДанныхПользователяАсинх может сам создать отсутствующий пользовательский каталог этой базы. Для соответствующего урока сначала показывается вопрос с Нет по умолчанию.
Веб-клиенту для этих методов нужно предварительно подключённое расширение работы с файлами; данный урок не устанавливает его и не обещает работу в браузере без расширения.
Запуск в 1С не проверен. Пути зависят от текущего клиента и пользователя; не копируйте чужой абсолютный путь и не публикуйте личные пути из сообщений.
Перем Занято;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
КомандаДействия.Действие = "УчебноеДействие";
КомандаДействия.Заголовок = "Составить собственный план файла без записи";
КомандаДействия.Подсказка = "Действие только над данными учебной формы";
КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = КомандаДействия.Имя;
Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры
&НаКлиенте
Асинх Процедура УчебноеДействие(Команда)
Если Занято = Истина Тогда
Возврат;
КонецЕсли;
Занято = Истина;
Элементы.КнопкаУчебноеДействие.Доступность = Ложь;
Попытка
Ответ = Ждать ВопросАсинх("В отдельной учебной базе разрешить получение рабочего каталога? Платформа может создать отсутствующий каталог пользователя. Файл отчёта записан не будет.",
РежимДиалогаВопрос.ДаНет, 0, КодВозвратаДиалога.Нет, "Только собственный учебный каталог");
Если Ответ <> КодВозвратаДиалога.Да Тогда
Занято = Ложь;
Элементы.КнопкаУчебноеДействие.Доступность = Истина;
Сообщить("Получение рабочего каталога отменено до вызова функции");
Возврат;
КонецЕсли;
ИмяКаталога = Ждать РабочийКаталогДанныхПользователяАсинх();
Если ТипЗнч(ИмяКаталога) <> Тип("Строка") Тогда
ВызватьИсключение "Каталог должен быть строкой, а не объектом Обещание";
КонецЕсли;
Если ПустаяСтрока(ИмяКаталога) Тогда
ВызватьИсключение "Клиент не вернул каталог для учебного плана";
КонецЕсли;
Каталог = Новый Файл(ИмяКаталога);
СуществуетКаталог = Ждать Каталог.СуществуетАсинх();
Если Не СуществуетКаталог Тогда
ВызватьИсключение "Полученный каталог отсутствует: вручную создавать его этот урок не будет";
КонецЕсли;
ЭтоКаталог = Ждать Каталог.ЭтоКаталогАсинх();
Если Не ЭтоКаталог Тогда
ВызватьИсключение "Полученный путь не соответствует каталогу";
КонецЕсли;
Разделитель = ПолучитьРазделительПутиКлиента();
Если Разделитель <> "\" И Разделитель <> "/" Тогда
ВызватьИсключение "Неожиданный разделитель клиентского пути";
КонецЕсли;
Если Прав(ИмяКаталога, 1) <> Разделитель Тогда
ИмяКаталога = ИмяКаталога + Разделитель;
КонецЕсли;
СобственноеИмя = "guide-owned-" + Строка(Новый УникальныйИдентификатор) + ".txt";
ПолноеИмя = ИмяКаталога + СобственноеИмя;
ПланФайла = Новый Файл(ПолноеИмя);
ИмяЗанято = Ждать ПланФайла.СуществуетАсинх();
Если ИмяЗанято Тогда
ВызватьИсключение "Имя уже занято: не открываем и не перезаписываем чужой файл";
КонецЕсли;
Количество = 3;
Цена = 250;
Сумма = Количество * Цена;
ТекстОтчета = СтрШаблон("Учебные книги: %1 шт. по %2; сумма %3", Количество, Цена, Сумма);
Сообщить(Сумма = 750);
Сообщить(ПланФайла.Имя = СобственноеИмя);
Сообщить(ПланФайла.Расширение = ".txt");
Сообщить("Планируемый собственный путь, файл не создан: " + ПланФайла.ПолноеИмя);
Сообщить(ТекстОтчета);
Сообщить("Проверка свободного имени не резервирует его. Перед будущей записью требуется безопасное создание нового файла");
Исключение
Занято = Ложь;
Элементы.КнопкаУчебноеДействие.Доступность = Истина;
ВызватьИсключение;
КонецПопытки;
Занято = Ложь;
Элементы.КнопкаУчебноеДействие.Доступность = Истина;
КонецПроцедуры
Разбор по шагам
Сначала занимаем команду и задаём асинхронный вопрос с Нет по умолчанию. Этот вопрос предупреждает о возможном создании каталога самой платформой.
При Нет или любом ответе кроме Да разблокируем кнопку и возвращаемся до вызова РабочийКаталогДанныхПользователяАсинх.
После явного Да получаем строку каталога текущего пользователя именно этой базы. Если каталог отсутствовал, платформа может создать его.
Асинхронно проверяем существование каталога и свободное имя собственного отчёта. Содержимое чужих файлов и каталогов не читается.
Вычисляем план отчёта на 750 без записи; занятость и доступность кнопки восстанавливаются при успехе, отказе и исключении.
Как проверить результат
Сначала выберите Нет: ожидается сообщение об отмене, функция рабочего каталога не вызывается и файл не создаётся.
Повторите и выберите Да в отдельной учебной базе: ожидаются три Истина и собственный план. Каталог мог быть создан платформой; файл отчёта не записывался.
Ожидаемый результат
Показаны контекст пользователя и базы, реальный побочный эффект функции и безопасная ветка отказа до её вызова.
На что обратить внимание
Это не полностью немутирующая функция: её собственный контракт предусматривает создание отсутствующего каталога.
Не удаляйте рабочий каталог после урока: он принадлежит платформе и может содержать данные пользователя.
Рабочий каталог разных баз или пользователей не обязан совпадать. Путь не является переносимым идентификатором базы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Дождаться ответа на вопрос и сбросить только учебное количество
Асинхронная команда спрашивает подтверждение. Нет, закрытие вопроса и любой результат кроме Да ничего не меняют.
Где и как запускать
Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.
Подготовка
Создайте отдельную учебную внешнюю обработку с пустой управляемой основной формой. Каждую задачу запускайте в своей копии формы.
Не добавляйте вручную реквизит ЗначениеПримера, поле ПолеПримера и команду УчебноеДействие: их создаст код.
В свойствах формы → События свяжите ПриСозданииНаСервере с одноимённой процедурой. Вставьте весь модуль, включая клиентские и серверные процедуры.
Сохраните учебную EPF и откройте через Файл → Открыть в тонком или толстом клиенте Windows. Рабочие данные не читаются и не записываются.
Этот урок хранит только собственное целое учебное количество 0–9: начальное 3, сброс в 0. Это не универсальный тип количества товаров.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Новые = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный));
Новые.Добавить(Новый РеквизитФормы("ЗначениеПримера", ТипРеквизита));
ЭтаФорма.ИзменитьРеквизиты(Новые);
ЭтаФорма.ЗначениеПримера = 3;
Поле = Элементы.Добавить("ПолеПримера", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "ЗначениеПримера";
Поле.Заголовок = "Учебное количество";
КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
КомандаДействия.Действие = "УчебноеДействие";
КомандаДействия.Заголовок = "Сбросить с подтверждением";
КомандаДействия.Подсказка = "Действие только над данными учебной формы";
КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = КомандаДействия.Имя;
Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры
&НаКлиенте
Асинх Процедура УчебноеДействие(Команда)
ДоВопроса = ЗначениеПримера;
Элементы.КнопкаУчебноеДействие.Доступность = Ложь;
Попытка
Ответ = Ждать ВопросАсинх("Сбросить количество только этой учебной формы?",
РежимДиалогаВопрос.ДаНет, 0, КодВозвратаДиалога.Нет, "Учебное подтверждение");
Исключение
Элементы.КнопкаУчебноеДействие.Доступность = Истина;
ВызватьИсключение;
КонецПопытки;
Элементы.КнопкаУчебноеДействие.Доступность = Истина;
Если Ответ <> КодВозвратаДиалога.Да Тогда
Сообщить("Количество не изменено");
Возврат;
КонецЕсли;
Если ЗначениеПримера <> ДоВопроса Тогда
Сообщить("Данные изменились за время вопроса. Повторите подтверждение.");
Возврат;
КонецЕсли;
ЗначениеПримера = 0;
Сообщить("Сброшено только количество собственной формы");
КонецПроцедуры
Разбор по шагам
КвалификаторыЧисла(1, 0, Неотрицательный) дают один разряд без дробной части. ОписаниеТипов без числовых квалификаторов не разрешает хранить числа.
Асинх стоит перед Процедура обработчика. Ждать используется внутри асинхронной процедуры.
ВопросАсинх возвращает Обещание; после Ждать переменная Ответ содержит результат вопроса, не объект обещания.
Нет назначено кнопкой по умолчанию. Таймаут 0 не ограничивает время ответа.
Кнопка запуска недоступна на время ожидания и снова доступна после завершения либо при исключении.
Продолжаем только при точном Да. Дополнительно сравниваем исходное значение, чтобы не обработать изменившиеся данные по устаревшему подтверждению.
Снимок ДоВопроса хранит уже типизированное значение реквизита. При собственном изменении 3 → 4 до завершения вопроса исходный снимок остаётся 3; ответ Да не должен сбросить новое 4.
Сброс меняет единственный реквизит учебной формы; нет удалений объектов и записей в базу.
Как проверить результат
При Нет число остаётся 3. При Да становится 0.
После закрытия вопроса без Да не должно быть сброса.
Кнопка после ответа снова доступна, повторные учебные вызовы работают.
До вызова вопроса задайте 9: Нет сохраняет 9, Да сбрасывает в 0. После сброса повторный вопрос с исходным 0 должен оставить 0 при любом ответе.
Отдельная проверка ветки в отладчике собственной формы: при снимке 3 и фактическом значении 4 или 9 к моменту ответа Да сброс не выполняется. Это не проверка доступности интерактивного ввода в модальном вопросе.
Ожидаемый результат
Показан безопасный законченный шаблон подтверждения с Обещание/Ждать и проверкой неизменности данных.
На что обратить внимание
Нельзя использовать Ждать в обычной неасинхронной процедуре.
Квалификаторы ограничивают уже типизированное значение, но не проверяют первоначальный текст. Первоначальный текст с дробной частью или большей точностью может измениться при приведении к типу; исходный текст здесь не анализируется.
Модальный вопрос может блокировать ввод в поле. Проверка изменения данных не обещает, что пользователь сможет напечатать новое число во время ожидания.
Факт ответа Да не заменяет проверку прав, текущего состояния и серверную транзакцию реального действия.
Вопрос используется только для собственной формы, не для массового удаления рабочих документов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.