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

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

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

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

Почему нельзя обратиться к панели навигации через коллекцию Элементы?

Проанализируем структуру управляемой формы. Все элементы, которые мы добавляем визуально (поля ввода, кнопки, таблицы), попадают в коллекцию Элементы. Однако панель навигации (командный интерфейс формы) вынесена за рамки этой коллекции. Попытка обратиться к ней по имени, например, Элементы.ГруппаПерейти, вызовет ошибку, так как такого объекта в коллекции не существует.

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

Способ 1. Использование функциональных опций

Это самый «правильный» и рекомендуемый фирмой «1С» способ управления видимостью элементов интерфейса. Функциональные опции позволяют привязать объект метаданных (или команду) к значению определенной настройки (константы, ресурса регистра сведений или реквизита справочника).

Разберем алгоритм настройки по шагам:

  1. Создадим объект метаданных Константа (например, ИспользоватьСвязанныеФайлы) с типом Булево.
  2. Создадим объект ФункциональнаяОпция, где в поле «Хранилище» укажем нашу константу.
  3. На закладке «Состав» функциональной опции отметим тот объект (например, подчиненный справочник), ссылка на который должна исчезать из панели навигации.

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

В коде формы мы можем форсировать обновление интерфейса при изменении параметров:


&НаСервере
Процедура ОбновитьИнтерфейсНаСервере()
    // Изменяем значение, влияющее на функциональную опцию
    Константы.ИспользоватьСвязанныеФайлы.Установить(Ложь);
    
    // Обновляем параметры функциональных опций, если это необходимо
    ОбновитьИнтерфейс();
КонецПроцедуры

Способ 2. Управление правами доступа (Роли)

Если задача стоит в том, чтобы скрыть панель «Перейти» для определенных категорий пользователей навсегда, лучшим решением будет использование системы прав — для этого подойдёт инструмент гибкой настройки прав и ролей пользователей. Если у пользователя в его Роли нет прав на «Просмотр» подчиненного объекта, то команда перехода к этому объекту просто не появится в панели навигации. Это базовый механизм безопасности платформы, который работает автоматически.

Способ 3. Статическая настройка в Конфигураторе

Рассмотрим ситуацию, когда нам не нужно программное управление, а достаточно просто скрыть лишнее для всех. В редакторе управляемой формы перейдем на закладку «Командный интерфейс». Здесь мы увидим дерево команд панели навигации.

В колонке «Видимость» мы можем снять галочки для тех объектов, которые не должны отображаться. Здесь же можно настроить видимость в разрезе ролей. Помните, что это статичная настройка: изменить её кодом в процессе работы формы невозможно.

Способ 4. Программное управление отображением всей панели

Если мы не можем управлять отдельными кнопками в панели, мы все же можем управлять всей панелью целиком. У объекта УправляемаяФорма существует свойство ОтображениеПанелиНавигации.

Посмотрим на пример кода, который скрывает всю панель навигации целиком:


&НаСервере
Процедура СкрытьПанельНавигацииНаСервере()
    // Варианты: Авто, Да, Нет
    ЭтаФорма.ОтображениеПанелиНавигации = ФормаОтображениеПанелиНавигации.Нет;
КонецПроцедуры

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

Способ 5. Альтернативный интерфейс: создание кастомной панели

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

  1. В конфигураторе на закладке «Командный интерфейс» полностью отключаем видимость всех стандартных команд панели навигации.
  2. В самой форме создаем обычную Группа с видом Командная панель или просто обычную группу с кнопками/гиперссылками.
  3. Для каждой кнопки создаем команду формы, которая будет открывать нужный связанный объект (например, через ОткрытьФорму с установленным отбором).

В этом случае мы получаем полный программный контроль. Теперь мы можем обращаться к кнопкам через коллекцию Элементы:


&НаКлиенте
Процедура ПриИзмененииДанных()
    // Теперь у нас есть полный доступ к видимости
    Элементы.ГруппаМояНавигацияСправочникФайлы.Видимость = (Объект.Статус = ПредопределенноеЗначение("Перечисление.Статусы.Активен"));
КонецПроцедуры

Выводы и рекомендации

Подводя итог, можно сказать, что прямого способа «достучаться» до стандартной панели навигации из модуля формы не существует. Платформа 1С разделяет данные формы и её командный интерфейс.

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

Такой подход позволит вам создавать гибкие и отзывчивые интерфейсы, соблюдая стандарты разработки на платформе 1С 8.3.

← На главную