При разработке интерфейсов на управляемых формах 1С часто возникает задача динамически добавить выпадающее меню с действиями в командную панель таблицы формы. Однако разработчики сталкиваются с ситуацией, когда метод добавления элементов формы не позволяет внедрить новую группу или подменю непосредственно в стандартную командную панель таблицы. Разберем причины такого поведения платформы и подробно рассмотрим проверенные способы решения этой задачи.
Проанализируем архитектуру элементов управляемой формы. У таблицы формы командная панель по умолчанию создается с включенным свойством «Автозаполнение». В этом режиме состав кнопок генерируется платформой 1С динамически в момент отрисовки пользовательского интерфейса.
В иерархии элементов формы автозаполняемая панель таблицы не является полноценной группой, доступной для произвольного программного добавления дочерних элементов через методы Элементы.Вставить() или Элементы.Добавить(). Платформа блокирует внедрение элементов внутрь динамически генерируемого контейнера. Кроме того, программно переключить режим автозаполнения так, чтобы сохранить стандартные кнопки и добавить к ним свое меню, невозможно.
Если конфигурация доступна для редактирования или задача решается с помощью механизма расширений, рассмотрим наиболее правильный вариант с точки зрения архитектуры метаданных:
После снятия флага автозаполнения командная панель становится статической группой формы. Теперь к ней можно обращаться программно на сервере и свободно добавлять новые подменю и кнопки.
Если форму нельзя менять статически и все манипуляции должны выполняться исключительно в коде, разберем вариант с отключением встроенной панели и созданием собственной. Посмотрим на алгоритм реализации:
ВидГруппыФормы.КоманднаяПанель.ВидГруппыФормы.Подменю.Посмотрим на пример кода, который выполняется в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Отключаем штатную командную панель таблицы
Элементы.СобранныеДанныеПодбор.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
// 2. Создаем новую командную панель перед таблицей
ИмяПанели = "STR_КоманднаяПанельСтраницаПодбор";
НоваяКоманднаяПанель = Элементы.Вставить(ИмяПанели, Тип("ГруппаФормы"), Элементы.грПодбор, Элементы.СобранныеДанныеПодбор);
НоваяКоманднаяПанель.Вид = ВидГруппыФормы.КоманднаяПанель;
// 3. Создаем выпадающее подменю внутри созданной панели
ИмяПодменю = "STR_ПодменюПодбор";
НовоеПодменю = Элементы.Добавить(ИмяПодменю, Тип("ГруппаФормы"), НоваяКоманднаяПанель);
НовоеПодменю.Вид = ВидГруппыФормы.Подменю;
НовоеПодменю.Заголовок = "Заполнить";
// 4. Добавляем команду формы и связываем ее с обработчиком
ИмяКоманды = "КомандаЗаполнитьСнаряжение";
НоваяКоманда = Команды.Добавить(ИмяКоманды);
НоваяКоманда.Заголовок = "Снаряжение клиента";
НоваяКоманда.Действие = "Подключаемый_ВыполнитьЗаполнение";
// 5. Создаем кнопку внутри подменю
Кнопка = Элементы.Добавить("КнопкаЗаполнитьСнаряжение", Тип("КнопкаФормы"), НовоеПодменю);
Кнопка.ИмяКоманды = ИмяКоманды;
// 6. Добавляем стандартную кнопку таблицы (например, Добавить)
КнопкаДобавить = Элементы.Добавить("КнопкаДобавитьСтроку", Тип("КнопкаФормы"), НоваяКоманднаяПанель);
КнопкаДобавить.ИмяКоманды = "СобранныеДанныеПодборДобавить";
КонецПроцедуры
Рассмотрим случай, когда требуется сохранить весь состав типовых кнопок таблицы без ручного переноса каждой команды, но при этом добавить выпадающее подменю. В такой ситуации мы можем оставить встроенную командную панель активной, а рядом с ней разместить отдельную компактную командную панель.
Разберем по шагам, как настроить визуальное отображение:
Отображение = ОтображениеОбычнойГруппы.Нет) с горизонтальной группировкой элементов.В результате пользователь видит стандартную панель таблицы со всеми штатными функциями и расположенное рядом дополнительное подменю.
Проанализируем еще одну альтернативу. Если команды логически связаны со строками таблицы, их можно поместить в контекстное меню. В отличие от командной панели таблицы, контекстное меню не имеет жестких ограничений на программное добавление групп.
Посмотрим на пример добавления подменю в контекстное меню:
&НаСервере
Процедура ДобавитьПодменюВКонтекстноеМеню()
РодительМеню = Элементы.СобранныеДанныеПодбор.КонтекстноеМеню;
// Создаем подменю в контекстном меню
ПодменюКМ = Элементы.Добавить("КМ_ПодменюЗаполнить", Тип("ГруппаФормы"), РодительМеню);
ПодменюКМ.Вид = ВидГруппыФормы.Подменю;
ПодменюКМ.Заголовок = "Заполнить";
// Добавляем действие
КнопкаКМ = Элементы.Добавить("КМ_КнопкаЗаполнить", Тип("КнопкаФормы"), ПодменюКМ);
КнопкаКМ.ИмяКоманды = "КомандаЗаполнитьСнаряжение";
КонецПроцедуры
При программной работе с интерфейсом управляемых форм необходимо строго соблюдать следующие требования платформы:
Элементы и Команды допустима исключительно на сервере и строго на этапе инициализации формы — в обработчике ПриСозданииНаСервере. После отображения формы клиенту менять состав элементов запрещено.Действие команды передается точное строковое имя процедуры. Сама процедура должна быть объявлена в модуле формы с директивой &НаКлиенте.ИмяТаблицы + ИмяСтандартногоДействия (например, СобранныеДанныеПодборДобавить, СобранныеДанныеПодборУдалить).