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