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