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