К статье
Практический материал

Разработка и Конфигурация · 12 мин

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

Разбираем, как программно добавить кнопку в подменю командной панели формы 1С: создание команды, группы, свойства кнопки, примеры кода и типичные ошибки.

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

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

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

Где выполняется код и какие объекты участвуют

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

Иерархия элементов выглядит так: командная панель → группа-подменю (элемент вида ГруппаКнопок с видом группы Подменю) → кнопка. Каждый добавляемый элемент получает родителя через свойство Родитель, которое передаётся параметром в методе Элементы.Добавить() либо назначается отдельно. Если родитель не указан, кнопка попадёт в корень формы, а не в командную панель.

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

Создание команды формы

Кнопка командной панели всегда связана с командой. Без команды у кнопки не будет ни действия, ни корректного заголовка. Команда добавляется методом Команды.Добавить("ИмяКоманды"), после чего ей назначаются свойства: Действие (имя процедуры-обработчика в модуле формы), Заголовок, при необходимости Картинка, Отображение и Подсказка.

Имя обработчика в свойстве Действие указывается строкой без скобок и параметров. Сама процедура должна существовать в модуле формы с директивой &НаКлиенте (если действие выполняется на клиенте) и принимать один параметр — Команда. Если процедуры с таким именем нет, при нажатии кнопки пользователь получит ошибку о невозможности применить действие.

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	НоваяКоманда = Команды.Добавить("КомандаПечатьАкта");
	НоваяКоманда.Действие = "Подключаемый_ПечатьАкта";
	НоваяКоманда.Заголовок = "Печать акта";
	НоваяКоманда.Подсказка = "Сформировать печатную форму акта";
КонецПроцедуры

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

Создание подменю в командной панели

Подменю — это группа кнопок. Создаётся она методом Элементы.Добавить("ИмяПодменю", Тип("ГруппаФормы"), Родитель), где родителем выступает командная панель. После добавления группе задаётся свойство Вид = ВидГруппыФормы.Подменю и заголовок, который будет отображаться на панели.

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

bsl
ГруппаПодменю = Элементы.Добавить("ПодменюОтчеты", Тип("ГруппаФормы"), ЭтаФорма.КоманднаяПанель);
ГруппаПодменю.Вид = ВидГруппыФормы.Подменю;
ГруппаПодменю.Заголовок = "Отчёты по документу";

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

Добавление кнопки в подменю

Когда команда и подменю готовы, остаётся добавить саму кнопку. Используется метод Элементы.Добавить("ИмяКнопки", Тип("КнопкаФормы"), ГруппаПодменю) — третьим параметром передаётся именно группа-подменю, а не командная панель. Затем кнопке назначаются свойства ИмяКоманды (строкой, имя ранее созданной команды) и при необходимости ВидКнопки.

Полный фрагмент кода, объединяющий все шаги, выглядит следующим образом.

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

&НаКлиенте
Процедура Подключаемый_ПечатьАкта(Команда)
	// Логика формирования печатной формы
КонецПроцедуры

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

Особенности для форм списков, документов и расширений

В формах динамических списков и объектов состав командной панели часто формируется типовым кодом конфигурации (например, подсистемами печати и дополнительных отчётов в БСП). Программно добавленная кнопка в ПриСозданииНаСервере может оказаться перекрытой последующими вызовами типовых процедур. В таких случаях добавление выполняют в конце обработчика, после всех типовых вызовов, либо используют предусмотренные конфигурацией переопределяемые процедуры.

При доработке через расширение конфигурации механика та же: код размещается в заимствованной форме, обработчик ПриСозданииНаСервере расширяется с аннотацией &После или &ИзменениеИКонтроль. Вариант &После предпочтительнее, когда нужно просто добавить свою кнопку, не меняя типовую логику.

Если кнопка должна появляться только при определённых условиях (роль пользователя, вид операции документа, режим открытия формы), проверку условия выполняйте до создания команды и элементов. Создавать элементы, а потом скрывать их через Видимость = Ложь — допустимо, но менее чисто: невидимые элементы всё равно занимают место в структуре формы.

Проверка результата и типичные ошибки

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

Контрольные точки

Как проверить результат

Подменю на панели
Норма

Подменю видно с заданным заголовком и раскрывается

Тревожный признак

Подменю отсутствует — проверьте родителя группы и место вызова кода

Кнопка внутри подменю
Норма

Кнопка отображается с заголовком команды

Тревожный признак

Кнопка попала в корень панели — неверно указан родитель при добавлении

Нажатие кнопки
Норма

Выполняется процедура-обработчик

Тревожный признак

Ошибка о применении действия — имя в свойстве Действие не совпадает с именем процедуры

Типичные ошибки
01
Кнопка добавлена в командную панель напрямую, а не в группу-подменю — кнопка оказывается снаружи подменю
02
Группе не задан вид Подменю — вместо выпадающего меню получается обычная группа кнопок
03
Имя процедуры в свойстве Действие указано с ошибкой или процедура объявлена без директивы &НаКлиенте — при нажатии возникает исключение
04
Добавление выполняется в ПриОткрытии на клиенте — часть серверных коллекций недоступна, код падает или не срабатывает
05
Имя команды совпадает с существующей — метод Добавить выбрасывает исключение и прерывает создание остальных элементов

Отдельная категория проблем — конфликт с типовыми механизмами. Если конфигурация использует подсистему «Подключаемые команды» из БСП, она может перестраивать состав панели после вашего кода. Признак: кнопка появляется и исчезает при обновлении формы. Решение — добавлять кнопку через предусмотренные подсистемой переопределяемые процедуры либо после завершения её работы.

Альтернатива: добавление через конфигуратор без кода

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

Сравнение вариантов

Программное добавление

Подходит, когда кнопка появляется по условию, в расширении с динамической логикой или при массовом создании однотипных кнопок. Требует аккуратности с именами и порядком вызовов

Добавление в конфигураторе

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

Механизмы БСП (печать, доп. отчёты)

Подходит, если задача — печатная форма или внешняя обработка. Не требует изменения формы вообще, но привязывает решение к составу подсистем конфигурации

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

Итог

Что важно запомнить

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

Частые вопросы

Можно ли добавить кнопку в существующее типовое подменю, например «Печать»?

Да, если подменю доступно как элемент формы: найдите его через Элементы.Найти("ИмяПодменю") и передайте как родителя при добавлении кнопки. Однако если подменю заполняется типовой подсистемой (например, подсистемой печати БСП), она может перестроить состав при обновлении, и ваша кнопка исчезнет. Надёжнее регистрировать печатную форму штатным механизмом подсистемы.

Почему кнопка появляется в корне командной панели, а не в подменю?

Причина почти всегда в неверно указанном родителе: в метод Элементы.Добавить третьим параметром передана командная панель вместо группы-подменю. Проверьте также, что группе действительно задан вид ВидГруппыФормы.Подменю и что кнопка не перемещается позже другим кодом.

Как добавить кнопку в подменю командной панели табличной части?

Логика та же, но родителем подменю должна быть командная панель конкретной таблицы: Элементы.ИмяТаблицы.КоманднаяПанель. Сначала создаётся группа-подменю в этой панели, затем в неё добавляется кнопка. Учтите, что обработчик команды должен учитывать контекст текущей строки таблицы.

Нужно ли удалять программно созданные кнопки при закрытии формы?

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

Можно ли добавить кнопку в подменю в обычных формах (обычное приложение)?

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

Как сделать, чтобы кнопка в подменю отображалась с картинкой?

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