Как сделать активными кнопки «Да» и «Нет» через временную задержку в диалоге 1С?

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

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

Ограничения стандартного режима диалога

Рассмотрим возможности платформы 1С при работе со стандартными функциями вызова диалоговых окон, такими как Вопрос, ПоказатьВопрос и системным перечислением РежимДиалогаВопрос. Стандартные системные окна отрисовываются клиентом 1С автономно. Из кода платформы невозможно напрямую управлять состоянием элементов управления системного окна — например, динамически изменить заголовок кнопки или установить свойство Доступность = Ложь для отдельной кнопки во время ожидания ответа.

Для решения задачи паузы перед выбором используются два основных подхода: каскадный вызов встроенных диалогов или создание собственной управляемой формы.

Способ 1. Последовательный вызов предупреждения с таймаутом и вопроса

Разберем самый простой способ заставить пользователя сделать паузу перед выбором, не создавая новых объектов в конфигураторе. Метод заключается в цепочке из двух системных вызовов: сначала выводится окно предупреждения с таймаутом, а затем — диалог с вопросом.

Проанализируем пример реализации с использованием асинхронных функций:


ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПредупреждения", ЭтотОбъект);
ПоказатьПредупреждение(ОписаниеОповещения, "Внимательно прочтите информацию! Выбор ответа станет доступен через 10 секунд.", 10);

В процедуре обработки завершения предупреждения ПослеПредупреждения вызываем сам вопрос:


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

В данном случае окно предупреждения автоматически закроется по истечении 10 секунд (или по нажатию пользователем), после чего открывается диалог выбора ответа.

Способ 2. Создание кастомной управляемой формы с обратным отсчетом

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

Разберем по шагам алгоритм реализации:

  1. Создание формы: В конфигураторе создаем отдельную управляемую форму с текстовым сообщением и собственными кнопками управления.
  2. Блокировка при открытии: В событии ПриОткрытии задаем целевой кнопке свойство Доступность = Ложь и инициализируем реквизит-счетчик секундами задержки (например, 10 секунд).
  3. Подключение обработчика ожидания: В клиентском коде вызываем процедуру ПодключитьОбработчикОжидания с интервалом в 1 секунду.
  4. Обратный отсчет: Каждую секунду процедура уменьшает значение счетчика и обновляет заголовок кнопки.
  5. Разблокировка: При достижении нуля вызываем ОтключитьОбработчикОжидания, возвращаем кнопке свойство Доступность = Истина и восстанавливаем стандартный заголовок.

Посмотрим на пример кода управляемой формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Элементы.КнопкаДа.Доступность = Ложь;
    ОсталосьСекунд = 10;
    Элементы.КнопкаДа.Заголовок = "Да (" + Строка(ОсталосьСекунд) + " сек.)";
    ПодключитьОбработчикОжидания("ОбновитьТаймерКнопки", 1, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьТаймерКнопки()
    ОсталосьСекунд = ОсталосьСекунд - 1;
    Если ОсталосьСекунд > 0 Тогда
        Элементы.КнопкаДа.Заголовок = "Да (" + Строка(ОсталосьСекунд) + " сек.)";
    Иначе
        ОтключитьОбработчикОжидания("ОбновитьТаймерКнопки");
        Элементы.КнопкаДа.Заголовок = "Да";
        Элементы.КнопкаДа.Доступность = Истина;
    КонецЕсли;
КонецПроцедуры

Возврат выбранного пользователем решения из такой формы выполняется вызовом метода Закрыть(Результат) и обрабатывается в вызывающем коде через ОписаниеОповещения.

Альтернативные способы защиты от быстрых кликов

Помимо временной задержки, существуют другие практические способы защиты от осознанного или случайного пропуска предупреждения:

  1. Изменение кнопки по умолчанию: Установка свойства КнопкаПоУмолчанию на вариант, отменяющий действие (например, «Нет» или «Отмена»). В таком случае случайное нажатие клавиши Enter не приведет к выполнению операции.
  2. Ввод подтверждающего текста: На кастомной форме размещается поле ввода, а кнопка активируется только после того, как пользователь вручную введет ключевое слово (например, «ПОДТВЕРЖДАЮ»).
  3. Динамический выбор из списка: Использование функции ПоказатьВыборИзСписка, где порядок элементов меняется случайным образом или требует текстового подтверждения смыслового утверждения.
← На главную