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

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

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

Метод 1. Использование функциональных опций для управления видимостью

Это самый «правильный» и производительный способ управления интерфейсом. Рассмотрим ситуацию: нам нужно скрывать или показывать разделы меню в зависимости от настроек в константах или параметрах сеанса. Проанализируем, как это реализовать.

Каждый раздел (подсистема) или команда может быть привязана к ФункциональнойОпции. Если значение опции «Ложь», платформа просто не отрисовывает соответствующий элемент интерфейса. Чтобы сделать это управление динамическим, мы можем использовать параметризуемые функциональные опции.

  1. Создадим ПараметрСеанса, например, ДоступныеРазделы.
  2. Создадим ФункциональнуюОпцию, которая считывает значение из этого параметра.
  3. В свойствах подсистемы укажем эту опцию.

Для программного изменения видимости нам достаточно изменить значение в параметре сеанса. Разберем пример кода:


ПараметрыСеанса.ИспользоватьРазделПродажи = Истина;
// После изменения параметра сеанса интерфейс обновится автоматически при следующем открытии или обновлении формы.
ОбновитьИнтерфейс();

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

Метод 2. Программная настройка клиентского приложения (Платформа 8.3.21+)

Если вы работаете на современных версиях платформы (8.3.21 и выше), у вас появляется гораздо больше свободы. Выясним, как использовать объект НастройкаИнтерфейсаКлиентскогоПриложения. Теперь мы можем не просто полагаться на метаданные, а программно описывать состав панелей.

Рассмотрим пример, как программно скрыть раздел через настройки интерфейса:


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

Для Каждого Элемент Из ПанельРазделов.Состав Цикл
    Если Элемент.ИмяПодсистемы = "Продажи" Тогда
        Элемент.Видимость = Ложь;
    КонецЕсли;
КонецЦикла;

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

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

Метод 3. «Закрепление» настроек через Хранилище системных настроек

Одна из проблем программного скрытия разделов заключается в том, что пользователь может зайти в «Настройку панели разделов» и вернуть все обратно. Проанализируем, как администратор может «навязать» свою волю интерфейсу.

Любые изменения интерфейса, сделанные пользователем, сохраняются в ХранилищеСистемныхНастроек. Мы можем программно записывать туда настройки при начале сеанса. Если делать это при каждом входе, любые ручные изменения пользователя будут сбрасываться до тех, которые определил разработчик.

Посмотрим на логику реализации:

  1. При старте системы (в модуле управляемого приложения) определяем набор доступных прав.
  2. Формируем структуру настроек интерфейса.
  3. Используем метод ХранилищеСистемныхНастроек.Сохранить() с ключом "Общее/ПанельРазделов/Настройки".

Таким образом, мы имитируем «жесткое» управление, которое невозможно обойти стандартными средствами настройки интерфейса.

Метод 4. Как «переименовать» раздел (Архитектурный хак)

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

Единственный рабочий способ «переименования» — это создание дублирующих подсистем. Например, нам нужно, чтобы раздел назывался либо «Склад», либо «Логистика» в зависимости от типа организации. Рассмотрим алгоритм:

Да, это увеличивает объем метаданных, но это единственный способ динамически менять заголовки в меню разделов на старых версиях платформы.

Метод 5. Кастомный «Рабочий стол» вместо меню разделов

Если стандартное меню разделов слишком ограничено для ваших задач, рассмотрим радикальный, но эффективный способ: программное формирование начальной страницы. Мы можем использовать метод УстановитьНастройкиНачальнойСтраницы().

Вместо того чтобы заставлять пользователя ходить по разделам, мы можем создать одну «Главную форму», на которой программно (через программное создание элементов формы) рисовать кнопки, имитирующие меню.

Преимущества такого подхода:

  1. Полный контроль над заголовками кнопок (Элемент.Заголовок = "Новое название";).
  2. Возможность динамически менять иконки.
  3. Возможность группировать команды так, как это невозможно в стандартной панели разделов.

Резюме и рекомендации

Подводя итог, выделим основные правила работы с «управляемым-неуправляемым» интерфейсом:

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

← На главную