Как правильно реализовать интерактивный вопрос «Да/Нет» в управляемом приложении 1С без модальности?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке под управляемые формы 1С часто возникает задача прервать выполнение алгоритма для получения подтверждения от пользователя. В отличие от «толстого» клиента, где существовала блокирующая функция Вопрос(), в современной архитектуре 1С мы сталкиваемся с асинхронностью. Давайте разберем, почему попытки «заставить» систему ждать привычными способами не работают и как организовать код правильно.

Почему старые методы не подходят?

В управляемом приложении любой интерактивный вызов (например, ПоказатьВопрос) является асинхронным. Это архитектурное решение, принятое для обеспечения работы веб-клиента и кроссплатформенности. Когда вы вызываете ПоказатьВопрос, платформа не приостанавливает выполнение вашего кода — она отправляет команду на клиент и сразу же переходит к исполнению следующей строки. Попытки использовать циклы или «заморозку» сеанса приведут к зависанию интерфейса, а в веб-клиенте — к ошибке исполнения.

Основные принципы правильной реализации

Единственный верный способ «дождаться» ответа пользователя — изменить логику работы программы. Весь код, который должен выполняться после получения ответа, необходимо вынести в отдельную процедуру-обработчик.

  1. Разделите ваш алгоритм на две части: подготовку (до вопроса) и выполнение (после выбора пользователя).
  2. Используйте объект ОписаниеОповещения для связи диалога с процедурой-обработчиком.
  3. Спроектируйте код так, чтобы после вызова ПоказатьВопрос выполнение текущего метода завершалось естественным образом.

Разберем на примере

Допустим, у нас есть процедура, которая выполняет какое-то действие, но перед этим мы должны спросить пользователя, уверен ли он в своих намерениях. Рассмотрим пошаговую реализацию.

Шаг 1: Подготовка диалога

В основной процедуре мы инициализируем оповещение и вызываем окно вопроса:


// Инициализируем оповещение, указывая имя процедуры-обработчика
// ЭтотОбъект указывает, что обработчик находится в текущем модуле
Обработчик = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект);

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

Шаг 2: Создание процедуры-обработчика

Теперь создадим процедуру ПослеЗакрытияВопроса. Обратите внимание, что система автоматически передаст в нее результат выбора пользователя:


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

Советы по рефакторингу

Если ваша процедура большая и содержит много логики после вызова диалога, не пытайтесь вставить весь код прямо в обработчик. Лучше вынесите этот код в отдельный метод (процедуру или функцию), который будет вызываться из обработчика результата.

Полезный совет: В редакторе кода конфигуратора 1С можно упростить работу. Напишите ПоказатьВопрос, выделите текст, который должен идти после вопроса, и воспользуйтесь инструментом рефакторинга «Создать обработку оповещения». Платформа автоматически создаст процедуру-обработчик и перенесет туда ваш код.

Частые ошибки

Соблюдение этого простого подхода позволит сделать ваш код чистым, предсказуемым и готовым к работе в любых современных средах: от тонкого клиента до веб-обозревателей.

← На главную