Как программно скрыть стандартные команды на управляемой форме в 1С?

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

При переходе с обычных форм на управляемые разработчики часто сталкиваются с вопросом изменения стандартного состава команд. В обычном приложении кнопки командной панели представляли собой элементы коллекции, которые можно было напрямую удалить методом Удалить(). На управляемых формах архитектура работы с интерфейсом изменилась: стандартные команды формируются платформой динамически, и прямое удаление элементов вызывает ошибку или оказывается недоступным.

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

Ограничение платформы: почему нельзя просто удалить кнопку

В управляемом интерфейсе кнопки командных панелей и контекстных меню, создаваемые платформой автоматически при установленном свойстве Автозаполнение, не являются постоянными объектами метаданных формы. При попытке вызвать метод Элементы.Удалить() для стандартной команды платформа сгенерирует исключение. Управлять такими командами можно только через изменение их свойств (Видимость, Доступность) либо через свойства элементов управления, к которым эти команды привязаны.

Способ 1. Управление видимостью кнопок командной панели и контекстного меню

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

Проанализируем пример кода в процедуре ПриСозданииНаСервере:


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

    // Скрываем команду создания в контекстном меню динамического списка
    ЭлементКонтекстСоздать = Элементы.Список.КонтекстноеМеню.ПодчиненныеЭлементы.Найти("СписокКонтекстноеМенюСоздать");
    Если ЭлементКонтекстСоздать <> Неопределено Тогда
        ЭлементКонтекстСоздать.Видимость = Ложь;
    КонецЕсли;

КонецПроцедуры

Обратите внимание на особенность: если свойство Видимость = Ложь устанавливается на стороне сервера, платформа в целях оптимизации трафика не передает элемент клиенту. В результате эта кнопка полностью пропадет из окна пользовательской настройки «Изменить форму». Если требуется, чтобы кнопка оставалась доступной для включения пользователем через настройки, рекомендуется управлять свойством ПользовательскаяВидимость через метод УстановитьВидимость() либо изменять свойство Видимость на клиенте в обработчике ПриОткрытии.

Способ 2. Управление свойством «Доступность»

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

Посмотрим на пример установки доступности:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаСоздать.Доступность = Ложь;
    Элементы.Список.КонтекстноеМеню.ПодчиненныеЭлементы.СписокКонтекстноеМенюСоздать.Доступность = Ложь;

КонецПроцедуры

При таком подходе кнопка сохраняется в окне «Изменить форму», но пользователь не сможет выполнить действие.

Способ 3. Гарантированный запрет добавления через свойства таблицы

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

Разберем по шагам, как заблокировать добавление данных программно:

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

Способ 4. Отключение автозаполнения командной панели

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

  1. В свойствах командной панели формы или таблицы снимите флаг Автозаполнение (или установите программно Автозаполнение = Ложь).
  2. Добавьте вручную на командную панель только те стандартные или пользовательские команды, которые действительно должны быть доступны пользователю.

Способ 5. Ограничение прав на уровне ролей

Если бизнес-требование заключается в запрете создания элементов для определенных категорий сотрудников, наиболее правильным архитектурным решением является настройка прав доступа в конфигураторе. Снятие права «Интерактивное добавление» у роли автоматически скрывает кнопки создания в командных панелях, исключает их из контекстных меню и перехватывает нажатия горячих клавиш без необходимости писать программный код в каждой отдельной форме.

← На главную