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