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