При разработке сложных интерфейсов, например, помощников настройки (визардов) или форм обязательного ввода данных, часто возникает задача: запретить пользователю закрывать окно до завершения процесса. В системе 1С:Предприятие 8.3 смена интерфейса пользователя на компактный или обычный влияет на отображение элементов, а решение этой задачи зависит от типа платформы и режима отображения окна. Рассмотрим подробнее все доступные методы — от изменения свойств формы до программного перехвата события закрытия.
Начиная с версии платформы 8.3.13, у управляемой формы появилось прямое свойство Кнопка закрытия. На первый взгляд кажется, что достаточно снять этот флаг в конфигураторе, и «крестик» исчезнет. Однако проанализируем нюансы: в обычном режиме работы приложения (вкладки или отдельные окна) платформа принудительно оставляет эту кнопку, чтобы избежать «зависания» интерфейса по вине разработчика.
Разберем, при каких условиях это свойство действительно работает. Выясним причину: кнопка закрытия физически пропадает только в том случае, если свойство конфигурации Режим основного окна установлено в одно из следующих значений:
Если ваше приложение работает в обычном режиме, снятие флага Кнопка закрытия не даст визуального эффекта, и нам придется прибегнуть к программным методам.
Это самый надежный способ, который гарантирует, что пользователь не покинет форму, пока не выполнит все необходимые действия. Суть метода заключается в использовании переменной-флага, которая разрешает закрытие только при нажатии определенной кнопки (например, «Готово» или «Завершить»).
Рассмотрим по шагам реализацию этого механизма:
РазрешитьЗакрытие с типом Булево (аналогично тому, как выполняется добавление реквизитов и элементов формы программно).Истина.ПередЗакрытием пропишем логику отказа.Посмотрим на пример кода (для удобства разработки можно использовать конструктор для программной модификации форм):
&НаКлиенте
Перем РазрешитьЗакрытие; // Можно использовать как переменную модуля или реквизит формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
РазрешитьЗакрытие = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Если Не РазрешитьЗакрытие Тогда
Отказ = Истина;
ПоказатьПредупреждение(, "Пожалуйста, завершите настройку помощника!");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КомандаЗавершить(Команда)
// Проверяем заполнение данных
Если ВсеДанныеЗаполнены() Тогда
РазрешитьЗакрытие = Истина;
Закрыть();
КонецЕсли;
КонецПроцедуры
Данный подход работает на всех типах платформ, включая мобильную, и является эталонным для реализации обязательных шагов настройки.
Существует интересный интерфейсный хак, который позволяет заставить платформу скрыть системный «крестик». Проанализируем ситуацию: платформа 1С автоматически добавляет кнопку закрытия, если считает, что разработчик не обеспечил управление окном. Чтобы обойти это, выполним следующие действия:
СкрытаяКнопкаЗакрытия.Закрыть.Ложь.В некоторых версиях платформы наличие в составе команд активной (пусть и невидимой) команды Закрыть заставляет систему убрать стандартную кнопку из заголовка окна. Однако стоит помнить, что это поведение не является официально задокументированным и может меняться от релиза к релизу.
При работе с мобильными устройствами задача усложняется, так как кнопка «Назад» на корпусе устройства или в системном баре Android/iOS также инициирует закрытие формы. Выясним, как с этим бороться. В мобильной платформе 1С нажатие аппаратной кнопки «Назад» всегда вызывает событие ПередЗакрытием. Поэтому реализация через флаг РазрешитьЗакрытие, описанная во втором методе, является обязательной.
Дополнительно для мобильных приложений мы можем использовать свойство формы Шапка. Если отключить отображение шапки формы, то вместе с заголовком исчезнет и кнопка закрытия (крестик). Но в этом случае нам придется самостоятельно отрисовать заголовок внутри формы с помощью декораций или групп, чтобы пользователь понимал, где он находится.
Если помощник настройки открывается из другой формы, мы можем использовать свойство Режим открытия окна формы. Установив значение Блокировать весь интерфейс, мы добьемся того, что пользователь не сможет переключиться на другие окна приложения, пока не разберется с текущим.
Рассмотрим, как это реализовать программно при вызове формы:
ПараметрыФормы = Новый Структура;
ОткрытьФорму("ОбщаяФорма.ПомощникНастройки", ПараметрыФормы, ЭтаФорма, , , , , РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
Важный момент: использование блокирующего режима не убирает саму кнопку закрытия, но в сочетании с обработкой события ПередЗакрытием оно создает максимально строгий сценарий работы пользователя, исключая возможность случайного обхода алгоритма настройки.
Подводя итог, можно сказать следующее: универсального способа «просто нажать галочку» и убрать кнопку закрытия во всех режимах не существует из-за требований юзабилити платформы. Мы рекомендуем использовать комбинированный подход:
ПередЗакрытием — это дает 100% гарантию результата.РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс.Кнопка закрытия.Проанализировав эти методы, вы сможете создать интерфейс, который будет вести пользователя по заданному бизнес-процессу, не давая ему возможности совершить ошибку или пропустить важный этап настройки системы.