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