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

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

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

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

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

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

Способ 1. Отключение автозаполнения в редакторе формы или расширении

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

  1. Откроем форму в конфигураторе или заимствуем ее в расширение конфигурации.
  2. Найдем в дереве элементов командную панель нужной таблицы.
  3. Снимем флаг «Автозаполнение» в свойствах командной панели.
  4. Перенесем необходимые стандартные команды таблицы (например, «Добавить», «Удалить», «Скопировать») вручную из окна стандартных команд в командную панель.

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

Способ 2. Полная программная замена командной панели

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

  1. Скрываем стандартную командную панель таблицы.
  2. Создаем новую группу формы с видом ВидГруппыФормы.КоманднаяПанель.
  3. Добавляем в созданную панель подменю с видом ВидГруппыФормы.Подменю.
  4. Создаем команду формы, процедуру-обработчик и кнопку, привязанную к команде.
  5. При необходимости вручную выносим на панель стандартные действия таблицы.

Посмотрим на пример кода, который выполняется в обработчике ПриСозданииНаСервере:


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

Способ 3. Дополнительная командная панель рядом со стандартной

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

Разберем по шагам, как настроить визуальное отображение:

  1. Создаем родительскую группу без отображения рамки (свойство Отображение = ОтображениеОбычнойГруппы.Нет) с горизонтальной группировкой элементов.
  2. Помещаем в нее дополнительную командную панель.
  3. Добавляем в созданную панель подменю и кнопки.
  4. Располагаем группу непосредственно перед таблицей.

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

Способ 4. Добавление подменю в контекстное меню таблицы

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

Посмотрим на пример добавления подменю в контекстное меню:


&НаСервере
Процедура ДобавитьПодменюВКонтекстноеМеню()
    
    РодительМеню = Элементы.СобранныеДанныеПодбор.КонтекстноеМеню;
    
    // Создаем подменю в контекстном меню
    ПодменюКМ = Элементы.Добавить("КМ_ПодменюЗаполнить", Тип("ГруппаФормы"), РодительМеню);
    ПодменюКМ.Вид = ВидГруппыФормы.Подменю;
    ПодменюКМ.Заголовок = "Заполнить";
    
    // Добавляем действие
    КнопкаКМ = Элементы.Добавить("КМ_КнопкаЗаполнить", Тип("КнопкаФормы"), ПодменюКМ);
    КнопкаКМ.ИмяКоманды = "КомандаЗаполнитьСнаряжение";
    
КонецПроцедуры

Важные правила программного создания команд и элементов

При программной работе с интерфейсом управляемых форм необходимо строго соблюдать следующие требования платформы:

  1. Контекст исполнения: Модификация структуры элементов через коллекции Элементы и Команды допустима исключительно на сервере и строго на этапе инициализации формы — в обработчике ПриСозданииНаСервере. После отображения формы клиенту менять состав элементов запрещено.
  2. Обработчики действий: В свойство Действие команды передается точное строковое имя процедуры. Сама процедура должна быть объявлена в модуле формы с директивой &НаКлиенте.
  3. Именование стандартных команд: Если требуется вызвать стандартное действие таблицы из собственной кнопки, имя команды формируется по правилу: ИмяТаблицы + ИмяСтандартногоДействия (например, СобранныеДанныеПодборДобавить, СобранныеДанныеПодборУдалить).
← На главную