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