Как реализовать динамическую надпись или статус в командном интерфейсе 1С

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

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

Ограничения платформы и почему прямое решение невозможно

Проанализируем ситуацию: командный интерфейс (панель разделов, панель навигации подсистемы) формируется платформой статично в момент запуска сеанса. Текст заголовков подсистем и команд берется из метаданных. Программно изменить свойство Синоним или Заголовок у объекта метаданных во время работы пользователя нельзя.

Многие разработчики пытаются использовать программное изменение ролей пользователя для переключения видимости разных подсистем (одна с надписью "Ок", другая — "Внимание"). Однако выясним причину, почему это не работает мгновенно: состав доступных ролей кэшируется при установке соединения. Метод ОбновитьИнтерфейс() перерисовывает окна, но не пересчитывает права доступа "на лету". Для вступления изменений в силу требуется перезапуск приложения.

Решение 1: Использование функциональных опций (ФО)

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

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

Пример программного переключения состояния:


// Устанавливаем значение параметра, от которого зависит ФО
НаборПараметров = Новый Структура("ТекущийСтатус", Истина);
УстановитьПараметрыФункциональныхОпцийИнтерфейса(НаборПараметров);

// Принудительно обновляем командный интерфейс
ОбновитьИнтерфейс();

Метод ОбновитьИнтерфейс() заставит платформу перепроверить видимость команд, и пользователь мгновенно увидит изменение в меню без перезагрузки системы.

Решение 2: Рабочая область начальной страницы (Dashboard)

Если версия платформы ниже 8.3.16 или использование ФО кажется избыточным, рассмотрим вариант с начальной страницей. Это стандарт индустрии для типовых конфигураций. Вместо того чтобы пытаться "втиснуть" надпись в узкое меню, создадим информативную форму.

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


Процедура ПриУстановкеНастроекНачальнойСтраницы(Настройки)
    СоставФорм = Новый СоставФормНачальнойСтраницы;
    
    Если РольДоступна("Программист") Тогда
        СоставФорм.ЛеваяКолонка.Добавить("Обработка.РабСтол_Программист.Форма.ФормаСтола");
    КонецЕсли;
    
    Если РольДоступна("МенеджерПоПродажам") Тогда
        СоставФорм.ПраваяКолонка.Добавить("Обработка.МониторПродаж.Форма.Форма");
    КонецЕсли;
    
    Настройки.УстановитьСоставФорм(СоставФорм);
КонецПроцедуры

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

Решение 3: Программное управление настройками интерфейса

Рассмотрим более гибкий, но трудоемкий метод — использование объекта НастройкиИнтерфейсаКлиентскогоПриложения. Мы можем программно скрывать или показывать целые разделы (подсистемы). Если создать две идентичные подсистемы с разными иконками или именами, мы сможем переключать их видимость.

Проанализируем пример кода для управления видимостью разделов:


Настройки = ТекущиеНастройкиИнтерфейсаКлиентскогоПриложения();
СоставПанелиРазделов = Настройки.СоставПанелиРазделов;

Для Каждого Элемент Из СоставПанелиРазделов Цикл
    Если Элемент.Имя = "Подсистема_ОК" Тогда
        Элемент.Видимость = (ТекущееСостояние = Истина);
    ИначеЕсли Элемент.Имя = "Подсистема_Внимание" Тогда
        Элемент.Видимость = (ТекущееСостояние = Ложь);
    КонецЕсли;
КонецЦикла;

УстановитьНастройкиИнтерфейсаКлиентскогоПриложения(Настройки);

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

Решение 4: Динамическое изменение заголовка системы

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

Выясним, как это реализовать:


// В модуле управляемого приложения
Процедура ОбновитьИндикаторСтатуса() Экспорт
    Статус = ПолучитьТекущийСтатусСервер(); // Функция получения данных
    ТекстЗаголовка = "Моя база - " + Статус;
    УстановитьЗаголовокСистемы(ТекстЗаголовка);
КонецПроцедуры

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

Особенности отображения картинок в командах

Разберем ситуацию, когда разработчик хочет вывести картинку-индикатор в командном интерфейсе. Помните, что в 1С отображение картинок в панели навигации (слева) сильно ограничено. Обычно там отображается только текст. Чтобы картинка команды стала видна, она должна находиться в панели действий (сверху), а в настройках интерфейса у пользователя должно быть включено отображение "Картинка и текст".

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

← На главную