Как программно или через расширение скрыть кнопки в панели навигации «Важно» в 1С

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

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

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

Почему не получается скрыть кнопки напрямую через код?

Давайте проанализируем архитектуру управляемой формы. Разделы «Важно», «Перейти» и «См. также» формируют так называемый стандартный командный интерфейс формы. Эти переходы платформа генерирует автоматически на стороне сервера на основе связей между объектами метаданных (например, по структуре подчиненности или по ведущим измерениям регистров).

Поскольку эти элементы генерируются платформой динамически, они имеют ряд ограничений:

  1. Командный интерфейс не входит в коллекцию Элементы формы. Попытка обратиться к такой кнопке через конструкцию вида Элементы.ИмяКнопки.Видимость = Ложь вызовет ошибку выполнения, так как платформа просто не найдет элемент с таким именем в дереве управляемой формы.
  2. Обход коллекции ЭтаФорма.Команды также не принесет результата. В этой коллекции содержатся только команды, созданные разработчиком вручную (пользовательские команды формы), но не стандартные параметризуемые команды навигации.

Тем не менее решение этой задачи существует. Мы подготовили четыре надежных обходных пути (workarounds), которые помогут вам добиться желаемого результата.

Способ 1. Замена стандартных команд на пользовательские (Рекомендуемый способ)

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

Разберем этот процесс по шагам:

  1. Откройте нужную управляемую форму в конфигураторе (или в вашем расширении).
  2. Перейдите на вкладку «Командный интерфейс» (кнопка в нижней части редактора формы).
  3. Найдите стандартную команду, которую необходимо скрыть (например, команду перехода к связанному регистру в группе «Перейти» или «Важно»), и снимите с нее флаг видимости. Теперь платформа не будет выводить ее автоматически.
  4. Перейдите на вкладку «Команды» управляемой формы и создайте новую пользовательскую команду (например, ПереходКРегиструПользовательский).
  5. Перетащите созданную команду в дерево элементов формы, разместив её в нужной группе командной панели или панели навигации (например, перетащите в группу «Важно»).
  6. Поскольку созданная команда теперь является полноценным элементом формы, вы можете обращаться к ней напрямую из встроенного языка.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие роли у текущего пользователя и устанавливаем видимость кнопки
    ДоступностьРаздела = РольДоступна("ДоступКВажнымДанным");
    Элементы.ПереходКРегиструПользовательский.Видимость = ДоступностьРаздела;
    
КонецПроцедуры

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

Способ 2. Тонкая настройка видимости через расширение без написания кода

Иногда разработчики сталкиваются со странным поведением платформы: при добавлении новой роли в расширение кнопка в панели навигации внезапно пропадает для всех пользователей. Разберем причину этого явления.

У стандартных команд навигации по умолчанию активно свойство «Автовидимость». Платформа самостоятельно анализирует роли пользователей и решает, кому показывать кнопку. Как только в расширение добавляется новая роль (даже если она еще не связана с объектами), платформа перестраивает общую матрицу прав доступа. Если у новой роли нет явных прав на чтение объекта, к которому ведет кнопка, а пользователю назначена эта роль — автовидимость может сработать в значение Ложь.

Чтобы решить эту проблему без программирования, выполните следующие действия в расширении:

  1. Откройте редактор командного интерфейса формы в расширении.
  2. Найдите проблемную команду перехода.
  3. В таблице настроек видимости для конкретных ролей найдите вашу новую роль из расширения.
  4. Вместо автоматического определения снимите или установите флаг «Видимость» вручную (принудительно). Это переопределит поведение платформы и вернет кнопку тем пользователям, которым она действительно необходима.

Способ 3. Динамическое управление с помощью функциональных опций

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

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

Рассмотрим, как это реализовать:

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

Для конфигураций, разработанных на базе Библиотеки Стандартных Подсистем (БСП), разработчики могут применить встроенный механизм быстрой настройки интерфейса по параметрам:


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

Этот способ позволяет гибко управлять составом панели навигации без жесткого прописывания имен элементов в коде формы.

Способ 4. Перехват подключаемых команд БСП

В современных конфигурациях 1С многие кнопки в панели навигации и командных панелях (например, команды печати, заполнения, отправки) формируются динамически механизмами БСП при создании формы на сервере. Если вам нужно скрыть именно такую кнопку, то прямое редактирование формы не поможет.

В этом случае необходимо использовать расширение и перехватить процедуру формирования команд в модуле менеджера объекта. Рассмотрим пример для печатных форм:


&После("ДобавитьКомандыПечати")
Процедура Имя_ДобавитьКомандыПечати(КомандыПечати)
    
    // Ищем ненужную команду в коллекции, сформированной БСП
    НайденнаяКоманда = КомандыПечати.Найти("ИдентификаторЛишнейКоманды", "Идентификатор");
    
    // Если команда найдена, удаляем ее из коллекции до вывода на форму
    Если НайденнаяКоманда <> Неопределено Тогда
        КомандыПечати.Удалить(НайденнаяКоманда);
    КонецЕсли;
    
КонецПроцедуры

Этот метод гарантирует, что динамически подключаемая команда БСП просто не будет создана на форме для пользователя, что полностью решает задачу ее сокрытия. В качестве готового решения можно использовать расширение для управления видимостью команд печати и отчетов по условиям.

Подведем итоги

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

← На главную