Почему не работает отключение доступности кнопки «Отчеты» в 1С и как это исправить

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

При работе с обычными формами в 1С разработчики часто сталкиваются с ситуацией, когда стандартная команда установки доступности элемента не дает результата. Например, при выполнении кода ЭтаФорма.ЭлементыФормы.ДействияФормы.Кнопки.Отчеты.Доступность = Ложь; кнопка «Отчеты» на командной панели остается активной и нажимается. Разберем по шагам причины такого поведения платформы и проанализируем проверенные способы отключения этой кнопки.

Причины проблемы

Выясним, почему стандартный подход с изменением свойства Доступность не срабатывает для кнопки «Отчеты»:

  1. Тип элемента «Подменю»: В обычных формах 1С кнопка «Отчеты» представляет собой не одиночное действие, а выпадающий список (тип Подменю). Платформа игнорирует прямое изменение свойства Доступность для самой кнопки-контейнера, если внутри нее содержатся или динамически генерируются другие элементы.
  2. Динамическое заполнение отчетов: В типовых конфигурациях состав меню отчетов часто формируется программно при открытии формы или из модулей БСП. Если пользовательский код вызывать слишком рано (например, в обработчике ПередОткрытием), стандартные механизмы могут перерисовать кнопки заново.
  3. Автозаполнение командной панели: Если у командной панели включено свойство Автозаполнение, платформа автоматически поддержит активность стандартных команд.

Способ 1. Очистка подменю или отключение вложенных кнопок

Рассмотрим основной способ решения проблемы. Так как кнопка «Отчеты» является подменю, нам нужно либо очистить все вложенные кнопки, либо обойти их циклом и отключить доступность каждой из них.

Для полного удаления вложенных пунктов из выпадающего списка применим метод Очистить() для коллекции Кнопки нашего подменю:

ЭтаФорма.ЭлементыФормы.ДействияФормы.Кнопки.Отчеты.Кнопки.Очистить();

Если требуется сохранить состав пунктов визуально, но сделать их неактивными, обходим коллекцию кнопок в цикле:


Для Каждого КнопкаИзПодменю Из ЭлементыФормы.ДействияФормы.Кнопки.Отчеты.Кнопки Цикл
    КнопкаИзПодменю.Доступность = Ложь;
КонецЦикла;

Способ 2. Удаление кнопки с командной панели

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


КнопкаОтчеты = ЭлементыФормы.ДействияФормы.Кнопки.Найти("Отчеты");
Если КнопкаОтчеты <> Неопределено Тогда
    ЭлементыФормы.ДействияФормы.Кнопки.Удалить(КнопкаОтчеты);
КонецЕсли;

Способ 3. Перенос кода в правильное событие формы

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

Способ 4. Ограничение прав через роли

Проанализируем альтернативный метод без написания кода в форме. Самым правильным архитектурным решением в 1С является разделение прав доступа на уровне ролей. Если у роли пользователя отключить право Просмотр на соответствующие отчеты или связанные с ними объекты, платформа и стандартные механизмы автоматически скроют недоступные команды из меню «Отчеты» или сделают само подменю неактивным.

← На главную