Как обновить интерфейс программы при включении функциональной опции без перезапуска?

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

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

Основное решение: метод ОбновитьИнтерфейс()

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

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


&НаКлиенте
Процедура НастройкаВключенияСправочникаПриИзменении(Элемент)
    
    // Сначала сохраняем значение константы на сервере
    ЗаписатьНастройкуНаСервере();
    
    // Обновляем командный интерфейс текущего сеанса
    ОбновитьИнтерфейс();
    
КонецПроцедуры

&НаСервере
Процедура ЗаписатьНастройкуНаСервере()
    
    Константы.ИспользоватьМойСправочник.Установить(Объект.ИспользоватьМойСправочник);
    
КонецПроцедуры

Рассмотрим ключевые особенности работы этого метода:

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

Что делать, если функциональная опция использует параметры?

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

Для корректного перестроения интерфейса с учетом параметров выполним следующую последовательность действий:

  1. Сформируем структуру параметров функциональных опций.
  2. Передадим эту структуру в клиентский метод УстановитьПараметрыФункциональныхОпцийИнтерфейса(...).
  3. Если опция привязана к периодическому регистру сведений, платформа считывает срез последних. При необходимости учитывать конкретный момент времени обязательно передадим параметр Период.

Посмотрим на пример установки параметров для интерфейса на клиенте:


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

Почему справочник может не появиться даже после вызова метода?

Бывают ситуации, когда команда ОбновитьИнтерфейс() отработала без ошибок, значение опции действительно равно Истина, но справочник по-прежнему отсутствует в командном интерфейсе. Проанализируем возможные причины:

  1. Свойство «Использовать стандартные команды»: перейдем в конфигуратор и проверим свойства проблемного справочника. Если флаг Использовать стандартные команды снят, платформа не сформирует стандартную команду открытия списка в командном интерфейсе подсистем.
  2. Привязка к подсистемам: убедимся, что справочник включен в состав хотя бы одной подсистемы, для которой установлено свойство Включать в командный интерфейс. Если сама подсистема скрыта другой выключенной опцией или правами, вложенные объекты отображаться не будут.
  3. Права доступа (роли): функциональные опции управляют только видимостью элементов интерфейса, но не заменяют систему безопасности. Если у текущего пользователя нет роли с правом Просмотр на справочник или саму подсистему, команда не появится.
  4. Пользовательские настройки панелей: если пользователь ранее вручную настраивал панель навигации подсистемы или панель разделов, платформа сохраняет персональный состав команд. Вновь ставшая доступной команда может остаться в списке скрытых. В этом случае пользователю необходимо открыть меню настройки панели навигации и нажать кнопку Установить стандартные настройки.

Поведение уже открытых форм объектов

Важно помнить, что вызов метода ОбновитьИнтерфейс() воздействует на глобальные командные панели приложения (панель разделов, панель навигации, рабочую область), но не перезапускает обработчики ПриСозданииНаСервере или ПриОткрытии в уже открытых пользователем формах объектов. Если отображение реквизита или табличной части внутри открытой формы зависит от функциональной опции, потребуется либо закрыть и снова открыть форму, либо вызвать локальный метод УстановитьПараметрыФункциональныхОпцийФормы(...) непосредственно в контексте этой формы.

← На главную