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