Как программно изменить состав команд и кнопок у создаваемого элемента таблицы

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

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

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

Метод 1. Управление через свойства поведения таблицы

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

Рассмотрим пример кода при создании элемента на сервере:


// Создаем таблицу формы
ЭлементТаб = ЭтаФорма.Элементы.Добавить("ИспользуемыеФильтры", Тип("ТаблицаФормы"), ГруппаФильтров);
ЭлементТаб.ПутьКДанным = "ИспользуемыеФильтры";

// Отключаем возможность добавления, удаления и копирования строк
// Это автоматически уберет соответствующие кнопки из командной панели и контекстного меню
ЭлементТаб.ИзменятьСоставСтрок = Ложь;

// Включаем возможность изменять порядок строк
// Это оставит в командной панели кнопки-стрелки (Переместить вверх / Переместить вниз)
ЭлементТаб.ИзменятьПорядокСтрок = Истина;

Преимущества этого метода:

  1. Комплексность: Команды исчезают везде — в командной панели, в контекстном меню (правая кнопка мыши) и перестают работать через горячие клавиши (например, Insert или Delete).
  2. Надежность: Нам не нужно знать внутренние имена кнопок, которые генерирует платформа.
  3. Производительность: Это стандартные свойства объекта, управление которыми не требует обхода коллекций.

Метод 2. Программный перебор элементов автоматической командной панели

Иногда требуется более тонкая настройка, когда стандартных свойств недостаточно. Например, если нужно оставить кнопку «Справка» или «Настройка списка», но скрыть всё остальное. В этом случае нам придется обратиться к коллекции дочерних элементов командной панели.

Важно помнить, что если для таблицы свойство ПоложениеКоманднойПанели установлено в значение Авто или Верх (по умолчанию), платформа автоматически создает объект командной панели. Его имя формируется по шаблону: [ИмяТаблицы]КоманднаяПанель.

Проанализируем алгоритм скрытия лишних кнопок:


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

Разберем важный нюанс, упомянутый в обсуждениях: доступность элементов в момент создания. При вызове Элементы.Добавить в процедуре ПриСозданииНаСервере, платформа регистрирует новый элемент, но автоматические дочерние кнопки могут быть не полностью инициализированы в коллекции для перебора в ту же секунду. Однако, как показывает практика, обращение по полному имени Элементы.ИспользуемыеФильтрыКоманднаяПанель обычно работает корректно в конце процедуры создания.

Метод 3. Явное создание командной панели

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

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

  1. Установите у таблицы свойство ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет.
  2. Создайте новый элемент типа ГруппаФормы с видом КоманднаяПанель.
  3. Свяжите эту группу с таблицей через свойство ИсточникКоманд.
  4. Добавьте в эту группу только те кнопки, которые связаны с нужными стандартными командами.

Пример реализации кода:


// 1. Создаем таблицу
Таблица = Элементы.Добавить("МояТаблица", Тип("ТаблицаФормы"), ЭтаФорма);
Таблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;

// 2. Создаем свою панель
МояПанель = Элементы.Добавить("МояПанельКоманд", Тип("ГруппаФормы"), ЭтаФорма);
МояПанель.Вид = ВидГруппыФормы.КоманднаяПанель;
// Указываем, что панель черпает команды из нашей таблицы
МояПанель.ИсточникКоманд = Таблица; 

// 3. Добавляем только нужные кнопки, обращаясь к стандартным командам таблицы
КнопкаВверх = Элементы.Добавить("КнопкаВверх", Тип("КнопкаФормы"), МояПанель);
КнопкаВверх.ИмяКоманды = "МояТаблицаПереместитьВверх";

КнопкаВниз = Элементы.Добавить("КнопкаВниз", Тип("КнопкаФормы"), МояПанель);
КнопкаВниз.ИмяКоманды = "МояТаблицаПереместитьВниз";

Проблема контекстного меню

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

Чтобы полностью ограничить пользователя, проанализируем ситуацию с объектом АвтоматическоеКонтекстноеМеню. Если вы хотите полностью управлять списком команд в меню, вам нужно создать его явно или очистить существующее:


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

Выводы и рекомендации

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

1. Если задача — стандартное ограничение прав (запрет редактирования), всегда используйте свойства ИзменятьСоставСтрок и ИзменятьПорядокСтрок. Это самый «чистый» код.

2. Если нужно оставить нестандартный набор кнопок (например, только «Поиск» и «Стрелки»), используйте метод с перебором ПанельКоманд.ПодчиненныеЭлементы, но делайте это в самом конце процедуры ПриСозданииНаСервере или используйте явное создание панели через ИсточникКоманд.

3. Помните о свойстве ТолькоПросмотр. Установка ЭлементТаб.ТолькоПросмотр = Истина — это радикальный способ скрыть все редактирующие команды, но он также может заблокировать и сортировку, поэтому используйте его осмотрительно.

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

← На главную