Как программно закрепить вкладку в 1С и запретить её закрытие?

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

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

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

Способ 1. Использование рабочей области начальной страницы

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

Разберем, как это сделать:

  1. Откроем конфигуратор и перейдем в корень дерева метаданных конфигурации.
  2. Нажмем правой кнопкой мыши и выберем пункт «Открыть рабочую область начальной страницы».
  3. В появившемся окне настройки мы можем добавить нужную нам форму (например, ФормаСписка документа ЗаказПокупателя).
  4. Система позволяет настроить распределение форм по колонкам (одна колонка или две разной ширины).

Преимущество этого метода: форма автоматически становится «неубиваемой». У неё отсутствует кнопка закрытия на панели вкладок, и она всегда доступна при запуске системы. Начиная с версии платформы 8.3.15, мы можем гибко управлять составом начальной страницы в зависимости от ролей пользователей, используя расширения или программную настройку интерфейса.

Способ 2. Управление свойством КнопкаЗакрытия

Если по каким-то причинам использование начальной страницы невозможно и нам нужно открывать обычную форму, которую пользователь не должен закрывать «простым движением руки», мы можем воздействовать на визуальные элементы заголовка. У управляемой формы существует свойство КнопкаЗакрытия (в англоязычном варианте — CloseButton).

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Убираем символ "X" с заголовка формы и вкладки
    ЭтаФорма.КнопкаЗакрытия = Ложь;
КонецПроцедуры

Проанализируем результат: после установки этого свойства в значение Ложь, на вкладке в панели открытых окон интерфейса «Такси» пропадет кнопка закрытия. Это визуально приблизит нашу форму к поведению системных окон. Однако стоит помнить, что это не запрещает закрытие формы полностью. Пользователь все еще может воспользоваться контекстным меню вкладки (нажать правую кнопку мыши и выбрать «Закрыть») или нажать сочетание клавиш Ctrl + F4.

Способ 3. Программная блокировка закрытия формы

Чтобы гарантированно запретить закрытие формы, даже если пользователь нашел способ инициировать это действие, мы должны использовать событие ПередЗакрытием. Это единственный надежный способ программно «удержать» окно открытым.

Рассмотрим пример реализации:


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

Важный нюанс: обязательно проверяйте параметр ЗавершениеРаботы. Если вы просто напишете Отказ = Истина, пользователь не сможет выйти из программы 1С вообще, так как форма будет блокировать закрытие всего приложения. Приложение будет бесконечно пытаться закрыть окна, а ваша форма будет отвечать отказом.

Способ 4. Комплексный подход через программное открытие

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

Разберем алгоритм действий в модуле управляемого приложения:


Процедура ПриНачалеРаботыСистемы()
    // Программное открытие формы списка документов при старте
    ПараметрыФормы = Новый Структура;
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы, , "УникальныйКлючЗакрепленнойВкладки");
КонецПроцедуры

Используя УникальныйКлючЗакрепленнойВкладки, мы гарантируем, что форма откроется в единственном экземпляре. В самой открываемой форме (в модуле формы) мы комбинируем методы, описанные выше:

  1. В ПриСозданииНаСервере устанавливаем ЭтаФорма.КнопкаЗакрытия = Ложь;
  2. В ПередЗакрытием прописываем Отказ = Истина; (с проверкой на завершение работы системы).

Способ 5. Использование расширений для изменения типовых форм

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

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

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

Мы проанализировали несколько способов имитации закрепленной вкладки. Подведем итоги:

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

← На главную