Как убрать или заблокировать кнопку закрытия окна в 1С

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

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

Метод 1. Свойство Кнопка закрытия и режимы основного окна

Начиная с версии платформы 8.3.13, у управляемой формы появилось прямое свойство Кнопка закрытия. На первый взгляд кажется, что достаточно снять этот флаг в конфигураторе, и «крестик» исчезнет. Однако проанализируем нюансы: в обычном режиме работы приложения (вкладки или отдельные окна) платформа принудительно оставляет эту кнопку, чтобы избежать «зависания» интерфейса по вине разработчика.

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

  1. Рабочее место — форма занимает все пространство.
  2. Полноэкранное рабочее место — скрываются даже элементы управления операционной системы.
  3. Киоск — режим, предназначенный для терминалов самообслуживания. Также существует способ выполнить запуск 1С на полный экран без заголовка для обычных форм.

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

Метод 2. Программная блокировка через событие ПередЗакрытием

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

Рассмотрим по шагам реализацию этого механизма:

  1. Создадим реквизит формы РазрешитьЗакрытие с типом Булево (аналогично тому, как выполняется добавление реквизитов и элементов формы программно).
  2. В обработчике команды кнопки, которая должна закрывать форму, установим этот флаг в Истина.
  3. В обработчике события формы ПередЗакрытием пропишем логику отказа.

Посмотрим на пример кода (для удобства разработки можно использовать конструктор для программной модификации форм):


&НаКлиенте
Перем РазрешитьЗакрытие; // Можно использовать как переменную модуля или реквизит формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    РазрешитьЗакрытие = Ложь;
КонецПроцедуры

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

&НаКлиенте
Процедура КомандаЗавершить(Команда)
    // Проверяем заполнение данных
    Если ВсеДанныеЗаполнены() Тогда
        РазрешитьЗакрытие = Истина;
        Закрыть();
    КонецЕсли;
КонецПроцедуры

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

Метод 3. Трюк с подменой стандартных команд панели

Существует интересный интерфейсный хак, который позволяет заставить платформу скрыть системный «крестик». Проанализируем ситуацию: платформа 1С автоматически добавляет кнопку закрытия, если считает, что разработчик не обеспечил управление окном. Чтобы обойти это, выполним следующие действия:

  1. Создадим в форме новую команду, назовем ее, например, СкрытаяКнопкаЗакрытия.
  2. В свойствах команды выберем стандартное действие Закрыть.
  3. Разместим эту команду в командной панели формы.
  4. Установим свойство Видимость для этого элемента в значение Ложь.

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

Метод 4. Особенности мобильной платформы 1С

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

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

Метод 5. Режим блокировки всего интерфейса

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

Рассмотрим, как это реализовать программно при вызове формы:


ПараметрыФормы = Новый Структура;
ОткрытьФорму("ОбщаяФорма.ПомощникНастройки", ПараметрыФормы, ЭтаФорма, , , , , РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);

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

Резюме и рекомендации

Подводя итог, можно сказать следующее: универсального способа «просто нажать галочку» и убрать кнопку закрытия во всех режимах не существует из-за требований юзабилити платформы. Мы рекомендуем использовать комбинированный подход:

Проанализировав эти методы, вы сможете создать интерфейс, который будет вести пользователя по заданному бизнес-процессу, не давая ему возможности совершить ошибку или пропустить важный этап настройки системы.

← На главную