В процессе разработки интерфейсов на платформе 1С:Предприятие 8.3 часто возникает задача сделать определенную форму (например, список заказов или текущих задач) постоянно доступной пользователю. Разработчики хотят добиться эффекта, аналогичного поведению панелей «Обсуждения» или «Начальная страница», которые жестко закреплены в интерфейсе и не имеют стандартной кнопки закрытия («крестика»).
Рассмотрим подробнее, какими стандартными и программными средствами мы можем реализовать подобный функционал, проанализируем ограничения платформы и разберем по шагам наиболее эффективные способы решения задачи.
Проанализируем ситуацию: почему начальную страницу нельзя закрыть? Это системная особенность рабочей области. Если нам нужно, чтобы список документов всегда был перед глазами пользователя и не мог быть закрыт случайно, наиболее правильным архитектурным решением будет вынос этой формы на начальную страницу.
Разберем, как это сделать:
ФормаСписка документа ЗаказПокупателя).Преимущество этого метода: форма автоматически становится «неубиваемой». У неё отсутствует кнопка закрытия на панели вкладок, и она всегда доступна при запуске системы. Начиная с версии платформы 8.3.15, мы можем гибко управлять составом начальной страницы в зависимости от ролей пользователей, используя расширения или программную настройку интерфейса.
Если по каким-то причинам использование начальной страницы невозможно и нам нужно открывать обычную форму, которую пользователь не должен закрывать «простым движением руки», мы можем воздействовать на визуальные элементы заголовка. У управляемой формы существует свойство КнопкаЗакрытия (в англоязычном варианте — CloseButton).
Выясним, как это работает программно. Рассмотрим пример кода, который можно разместить в процедуре ПриСозданииНаСервере или вызвать непосредственно перед открытием формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Убираем символ "X" с заголовка формы и вкладки
ЭтаФорма.КнопкаЗакрытия = Ложь;
КонецПроцедуры
Проанализируем результат: после установки этого свойства в значение Ложь, на вкладке в панели открытых окон интерфейса «Такси» пропадет кнопка закрытия. Это визуально приблизит нашу форму к поведению системных окон. Однако стоит помнить, что это не запрещает закрытие формы полностью. Пользователь все еще может воспользоваться контекстным меню вкладки (нажать правую кнопку мыши и выбрать «Закрыть») или нажать сочетание клавиш Ctrl + F4.
Чтобы гарантированно запретить закрытие формы, даже если пользователь нашел способ инициировать это действие, мы должны использовать событие ПередЗакрытием. Это единственный надежный способ программно «удержать» окно открытым.
Рассмотрим пример реализации:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
// Если это не системное завершение работы (выход из 1С),
// то запрещаем закрытие конкретной формы
Если Не ЗавершениеРаботы Тогда
Отказ = Истина;
Сообщить("Данная вкладка закреплена администратором и не может быть закрыта!");
КонецЕсли;
КонецПроцедуры
Важный нюанс: обязательно проверяйте параметр ЗавершениеРаботы. Если вы просто напишете Отказ = Истина, пользователь не сможет выйти из программы 1С вообще, так как форма будет блокировать закрытие всего приложения. Приложение будет бесконечно пытаться закрыть окна, а ваша форма будет отвечать отказом.
Посмотрим на ситуацию со стороны пользователя. Ему важно, чтобы при старте системы нужная форма уже была открыта. Для этого используем модуль управляемого приложения.
Разберем алгоритм действий в модуле управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
// Программное открытие формы списка документов при старте
ПараметрыФормы = Новый Структура;
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы, , "УникальныйКлючЗакрепленнойВкладки");
КонецПроцедуры
Используя УникальныйКлючЗакрепленнойВкладки, мы гарантируем, что форма откроется в единственном экземпляре. В самой открываемой форме (в модуле формы) мы комбинируем методы, описанные выше:
ПриСозданииНаСервере устанавливаем ЭтаФорма.КнопкаЗакрытия = Ложь;ПередЗакрытием прописываем Отказ = Истина; (с проверкой на завершение работы системы).Если ваша задача — закрепить форму в типовой конфигурации, которую нельзя снимать с поддержки, воспользуйтесь расширением. Рассмотрим, как это упрощает работу:
Создайте расширение и заимствуйте в него нужную форму. В расширении вы можете в свойствах формы просто снять галочку «Кнопка закрытия» в палитре свойств. Это не потребует написания кода на сервере и будет работать стабильно. Также через расширение можно добавить форму в состав начальной страницы, даже если разработчик типового решения этого не предусмотрел.
Мы проанализировали несколько способов имитации закрепленной вкладки. Подведем итоги:
КнопкаЗакрытия для визуального эффекта и обработчик ПередЗакрытием для логической блокировки.-KioskMode), где интерфейс платформы скрыт, и пользователь работает только с вверенными ему окнами.Помните, что чрезмерное ограничение прав пользователя на управление окнами может негативно сказаться на юзабилити. Всегда оставляйте возможность штатного завершения работы системы.