При разработке интерфейсных решений в 1С часто возникает задача защитить критически важные операции от автоматических или невнимательных действий пользователя. Стандартная реакция большинства пользователей на любые всплывающие окна — как можно быстрее нажать «Да» или «OK», не вникая в текст сообщения. В этой статье мы разберем, как ограничить мгновенный выбор и реализовать задержку активности кнопок подтверждения.
Рассмотрим возможности платформы 1С при работе со стандартными функциями вызова диалоговых окон, такими как Вопрос, ПоказатьВопрос и системным перечислением РежимДиалогаВопрос. Стандартные системные окна отрисовываются клиентом 1С автономно. Из кода платформы невозможно напрямую управлять состоянием элементов управления системного окна — например, динамически изменить заголовок кнопки или установить свойство Доступность = Ложь для отдельной кнопки во время ожидания ответа.
Для решения задачи паузы перед выбором используются два основных подхода: каскадный вызов встроенных диалогов или создание собственной управляемой формы.
Разберем самый простой способ заставить пользователя сделать паузу перед выбором, не создавая новых объектов в конфигураторе. Метод заключается в цепочке из двух системных вызовов: сначала выводится окно предупреждения с таймаутом, а затем — диалог с вопросом.
Проанализируем пример реализации с использованием асинхронных функций:
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПредупреждения", ЭтотОбъект);
ПоказатьПредупреждение(ОписаниеОповещения, "Внимательно прочтите информацию! Выбор ответа станет доступен через 10 секунд.", 10);
В процедуре обработки завершения предупреждения ПослеПредупреждения вызываем сам вопрос:
Процедура ПослеПредупреждения(ДополнительныеПараметры) Экспорт
ОписаниеОповещенияВопрос = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
ПоказатьВопрос(ОписаниеОповещенияВопрос, "Вы действительно хотите выполнить операцию?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
В данном случае окно предупреждения автоматически закроется по истечении 10 секунд (или по нажатию пользователем), после чего открывается диалог выбора ответа.
Если требуется полноценный контроль над интерфейсом, блокировка конкретной кнопки и отображение динамического таймера обратного отсчета, создадим собственную управляемую форму.
Разберем по шагам алгоритм реализации:
ПриОткрытии задаем целевой кнопке свойство Доступность = Ложь и инициализируем реквизит-счетчик секундами задержки (например, 10 секунд).ПодключитьОбработчикОжидания с интервалом в 1 секунду.ОтключитьОбработчикОжидания, возвращаем кнопке свойство Доступность = Истина и восстанавливаем стандартный заголовок.Посмотрим на пример кода управляемой формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.КнопкаДа.Доступность = Ложь;
ОсталосьСекунд = 10;
Элементы.КнопкаДа.Заголовок = "Да (" + Строка(ОсталосьСекунд) + " сек.)";
ПодключитьОбработчикОжидания("ОбновитьТаймерКнопки", 1, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьТаймерКнопки()
ОсталосьСекунд = ОсталосьСекунд - 1;
Если ОсталосьСекунд > 0 Тогда
Элементы.КнопкаДа.Заголовок = "Да (" + Строка(ОсталосьСекунд) + " сек.)";
Иначе
ОтключитьОбработчикОжидания("ОбновитьТаймерКнопки");
Элементы.КнопкаДа.Заголовок = "Да";
Элементы.КнопкаДа.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Возврат выбранного пользователем решения из такой формы выполняется вызовом метода Закрыть(Результат) и обрабатывается в вызывающем коде через ОписаниеОповещения.
Помимо временной задержки, существуют другие практические способы защиты от осознанного или случайного пропуска предупреждения:
КнопкаПоУмолчанию на вариант, отменяющий действие (например, «Нет» или «Отмена»). В таком случае случайное нажатие клавиши Enter не приведет к выполнению операции.ПоказатьВыборИзСписка, где порядок элементов меняется случайным образом или требует текстового подтверждения смыслового утверждения.