Как правильно задать вопрос пользователю в процессе выполнения команды в 1С?

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

Часто при разработке в 1С перед программистами встает задача: выполнить действие (например, расчет скидки), но при определенных условиях сначала прервать процесс и спросить подтверждение у пользователя. Многие новички, столкнувшись с тем, что код «бежит дальше» и не дожидается ответа, пытаются использовать ПодключитьОбработчикОжидания. Разберем, почему это неверный путь и как реализовать такую логику правильно.

Почему обработчик ожидания — это плохая идея?

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

Правильный подход: разделение логики на два этапа

Чтобы корректно задать вопрос и дождаться ответа пользователя, необходимо разделить ваш алгоритм на два логических блока: инициация вопроса и обработка ответа.

  1. Этап 1: Инициация. Вы проверяете условия. Если нужно задать вопрос, вы вызываете асинхронный метод и сразу завершаете выполнение текущей процедуры командой Возврат.
  2. Этап 2: Обработка. В качестве параметра в метод вопроса вы передаете ОписаниеОповещения. Система сама вызовет эту процедуру (или функцию) после того, как пользователь нажмет кнопку в окне. Именно там вы продолжите выполнение основного кода.

Пример реализации решения

Рассмотрим, как это выглядит на практике. Допустим, мы находимся в процедуре нажатия кнопки РассчитатьСкидку.


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

    // Основной расчет
    ВыполнитьРасчетСкидки();
КонецПроцедуры

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

Использование расширений

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

Ключевые советы для программиста

Следуя этим правилам, вы сделаете код чистым, читаемым и предсказуемым. Такая архитектура является стандартом для современной платформы 1С:Предприятие 8.3.

← На главную