Подменю в командной панели управляемой формы 1С: от настройки до кода
Содержание
Кнопка с выпадающим списком в управляемой форме 1С — это группа формы вида «Подменю». Внутрь неё кладутся обычные кнопки, привязанные к командам. Свою «кнопку-список» не нужно рисовать: достаточно добавить группу в командную панель, перетащить в неё команды и назначить им обработчики.
Новички часто ищут отдельный элемент «Выпадающий список» в палитре. Такого элемента нет, а поле выбора со списком — совсем другая история: оно хранит значение, а не запускает действие. Нам нужна именно командная кнопка с меню.
Описание ниже подходит для платформы 8.3 с интерфейсом «Такси» и управляемых форм. Работаем в Конфигураторе: открываем форму объекта (обработки, справочника, документа) в редакторе.
Что нужно знать до начала
Меню кнопки строится из трёх сущностей. Их связь важно понимать, иначе правки «не доходят» до экрана.
- 🧩 Команда формы — действие с именем и обработчиком. Живёт на закладке «Команды» редактора формы.
- 🔘 Кнопка — элемент формы, который ссылается на команду и показывает её пользователю.
- 📂 Группа «Подменю» — контейнер, который превращается в кнопку с раскрывающимся списком.
Кнопки можно привязать не только к командам формы, но и к стандартным (например, «Записать») и к глобальным командам конфигурации. Для своего сценария обычно нужны команды формы.
| Вид группы | Как выглядит | Когда брать |
|---|---|---|
| Командная панель | Ряд кнопок | Основные действия формы |
| Подменю | Одна кнопка со стрелкой, список при нажатии | Много однотипных действий |
| Кнопочная группа | Кнопки подряд, без списка | Визуально объединить кнопки |
| Обычная группа | Рамка или невидимый контейнер для полей | Для кнопок не нужна |
Если действий всего два-три и они часто нужны, лучше оставить обычные кнопки. Подменю оправдано, когда действий пять и больше или они нужны редко.
Шаг 1. Создаём группу-подменю
Откройте редактор формы. На закладке «Элементы» выделите командную панель, в которую хотите добавить кнопку. Если панели нет, создайте её: «Добавить» → группа вида «Командная панель».
Теперь добавьте группу:
- Выделите командную панель и нажмите «Добавить» (зелёный плюс над деревом элементов).
- В списке выберите «Группа — подменю». Платформа создаст элемент с именем вроде
ФормаПодменю1. - В палитре свойств задайте понятное имя, например
ПодменюДействия, и заголовок: «Действия». - Проверьте, что родитель — именно командная панель, а не форма целиком.
Заголовок виден на кнопке. Делайте его коротким: два слова максимум, иначе панель разъедется на узком экране.
Если нужна кнопка, которая сама выполняет действие и при этом открывает список дополнительных (как «Печать» в документах), заведите отдельную команду и поставьте её первым элементом в группе. Платформа сама не делает «кнопку по умолчанию» из подменю.
Шаг 2. Добавляем команды и кнопки
Перейдите на закладку «Команды» и нажмите «Добавить». Для каждого пункта будущего списка создайте свою команду.
Что заполнять в свойствах команды:
- Имя — латиницей или кириллицей без пробелов:
ЗаполнитьПоШаблону,ОчиститьТаблицу. - Заголовок — то, что увидит пользователь: «Заполнить по шаблону».
- Действие — имя процедуры-обработчика. Если оставить пустым, при двойном щелчке платформа предложит создать процедуру сама.
- Подсказка — всплывающий текст при наведении. Одна строка, без точки.
Теперь перетащите команду из списка «Команды» на группу ПодменюДействия на закладке «Элементы». Платформа создаст кнопку с автоматической привязкой. Повторите для каждой команды.
Порядок пунктов в списке — порядок кнопок в группе. Меняется стрелками «Вверх» и «Вниз» над деревом элементов.
Не создавайте кнопки перетаскиванием в обход группы, а потом «переносите» мышью: при плотной вложенности легко уронить кнопку в соседнюю группу. Проверяйте дерево после каждого действия.
Шаг 3. Пишем обработчики команд
Для каждой команды нужна процедура в модуле формы. Двойной щелчок по полю «Действие» создаёт заготовку:
&НаКлиенте
Процедура ЗаполнитьПоШаблону(Команда)
// действия на клиенте
ЗаполнитьПоШаблонуНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоШаблонуНаСервере()
// действия на сервере
КонецПроцедуры
Обработчик команды всегда клиентский, а работа с базой и объектами идёт через серверную процедуру. Прямой вызов серверного кода из клиентской процедуры без директивы невозможен.
Что учесть при написании:
- 📌 Параметр
Команда— объект самой команды, обычно он не нужен, но его нельзя убирать из сигнатуры. - 📌 Если обработчик общий для нескольких команд, различайте их по
Команда.Имя. - 📌 Для справочников и документов перед массовыми изменениями проверяйте
Объект.Ссылка.Пустая(): новый объект ещё не записан.
Общий обработчик пригодится, когда пунктов много и логика одинакова:
&НаКлиенте
Процедура ВыполнитьДействие(Команда)
Если Команда.Имя = "ОчиститьТаблицу" Тогда
Объект.Товары.Очистить();
ИначеЕсли Команда.Имя = "ПересчитатьИтоги" Тогда
ПересчитатьИтогиНаСервере();
КонецЕсли;
КонецПроцедуры
Одну процедуру можно указать в «Действии» у любого числа команд. Это быстрее, чем плодить заготовки, но следите, чтобы цепочка Если не превратилась в простыню.
Видимость и доступность пунктов
Часто часть пунктов нужна не всегда: «Провести» только для непроведённого документа, «Отменить» наоборот. Есть два уровня управления.
На уровне свойств в редакторе. У кнопки и группы есть флажки «Видимость» и «Доступность». Если снять «Видимость» у группы, исчезнет вся кнопка со списком целиком.
Программно, при открытии формы или после события:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.ПодменюДействия.Видимость = Не Объект.Проведен;
Элементы.ЗаполнитьПоШаблону.Доступность = Не ТолькоПросмотр;
КонецПроцедуры
Разница между свойствами простая. Невидимый элемент пользователь не найдёт вообще. Недоступный остаётся на экране, но серый и без реакции на нажатие. Для действий, которые «временно нельзя», удобнее доступность: человек видит, что функция есть.
Для ролей есть третий путь — права на объекты.
Если пункт нужен только в части конфигураций, привяжите его к функциональной опции. Пункты исчезнут сами, когда опцию выключат.
Заголовок, картинка и внешний вид
Кнопка со списком выглядит скучно, пока вы не настроили отображение. Основные свойства группы и кнопок:
| Свойство | Что даёт |
|---|---|
| Заголовок | Текст на кнопке |
| Картинка | Значок слева от текста |
| Отображение | Авто, только картинка, только текст, картинка и текст |
| Подсказка | Всплывающий текст |
| Только в меню «Все действия» | Прячет пункт с панели |
Картинку выбирайте из библиотеки картинок: она хранит стандартные иконки платформы, их масштаб подгоняется автоматически. Свою иконку добавьте в общую картинку конфигурации (раздел «Общие» → «Общие картинки») и выберите её в свойстве «Картинка».
Рабочие правила:
- 🎨 Для подменю с несколькими пунктами оставляйте картинку на самой группе, а внутри — только текст. Список читается легче.
- 🎨 Если панель узкая, переключите отображение группы на «Картинка». Заголовок сохранится как подсказка.
- 🎨 Не ставьте одинаковые значки на разные пункты: пользователь перестаёт их различать.
Свойство «Только в меню Все действия» полезно для редких команд: они уйдут из подменю на панели и останутся доступны через общее меню формы.
Программное создание подменю
Иногда состав пунктов неизвестен заранее: список зависит от данных, например от выбранного вида операции. Тогда кнопки создают в коде при открытии формы. Рабочая схема из трёх действий: создать команду, создать кнопку, связать их с обработчиком.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Подменю = Элементы.Добавить("ПодменюШаблоны", Тип("ГруппаФормы"), Элементы.ФормаКоманднаяПанель);
Подменю.Вид = ВидГруппыФормы.Подменю;
Подменю.Заголовок = "Шаблоны";
Для Каждого Шаблон Из ПолучитьШаблоны() Цикл
ИмяКоманды = "Шаблон_" + Формат(Шаблон.Код, "ЧГ=0");
НоваяКоманда = Команды.Добавить(ИмяКоманды);
НоваяКоманда.Действие = "ПрименитьШаблон";
НоваяКоманда.Заголовок = Шаблон.Наименование;
НоваяКнопка = Элементы.Добавить("Кнопка_" + ИмяКоманды, Тип("КнопкаФормы"), Подменю);
НоваяКнопка.ИмяКоманды = ИмяКоманды;
КонецЦикла;
КонецПроцедуры
Здесь ПолучитьШаблоны() — ваша функция, которая возвращает выборку или таблицу значений. Остальные вызовы — штатные методы управляемой формы.
На что обратить внимание:
- Общая командная панель формы называется
ФормаКоманднаяПанель, если вы не переименовывали её; проверьте имя в дереве элементов. - В
Действиеуказывается строка с именем процедуры, а процедура обязана существовать в модуле формы с директивой&НаКлиенте. - Имя команды должно быть уникальным и без пробелов; код выше собирает его из числового кода шаблона.
- В обработчике определяйте, какой пункт нажат, по
Команда.Имя, как в примере с общей процедурой выше.
Динамически созданные элементы живут только до закрытия формы. При каждом открытии их нужно создавать заново.
Когда подменю не появляется или не работает
Типичные ситуации, которые разбирают на форумах, и как их проверить:
- Подменю есть в редакторе, но на экране пусто. Проверьте видимость группы и родителя. Если командная панель скрыта или у неё включено автозаполнение другого содержимого, ваша группа не попадёт на экран.
- Кнопка серая. Либо у неё снята «Доступность», либо форма открыта «Только просмотр» и ваша логика выставляет доступность от этого флага.
- Нажатие ничего не делает. В «Действии» команды пусто, либо имя процедуры не совпало с реальным, либо процедура лишилась директивы
&НаКлиенте. - Платформа ругается при открытии формы про обработчик. Процедура существует, но с неверной сигнатурой: у обработчика команды единственный параметр
Команда. - Пункт пропал только у части пользователей. Смотрите права и функциональные опции, а не код.
Для всех случаев работает один приём: временно поставьте в обработчик вызов Сообщить("сработало"). Так вы быстро отделите «обработчик не вызывается» от «обработчик вызывается, но внутри ошибка».
Расширенные возможности
Когда базовое подменю уже работает, пригодятся несколько возможностей платформы.
Порядок и смысловые блоки. Команды, связанные по смыслу (заполнение, очистка, печать), держите рядом и в логичном порядке: сначала частые действия, потом редкие, опасные — в самом конце.
Вложенные группы. Внутри подменю можно создать ещё одно подменю. Больше двух уровней вложенности не делайте: мышью по таким меню тяжело попадать.
Страницы с закладками. Кнопки можно показывать только на нужной странице. Для этого родителем группы делают страницу, а не общую панель.
Расширения конфигурации . Если типовая форма закрыта от изменений, подменю добавляют расширением: в расширении создаётся та же группа и команды, а обработчики оформляются в модуле формы расширения. Расширения доступны начиная с платформы 8.3.6.
Глобальные команды. Команду, которая нужна в нескольких формах, заведите как общую команду конфигурации («Общие» → «Общие команды») и укажите, в каких формах она показывается. Копировать подменю по формам не придётся.
Для типовых конфигураций следуйте общему правилу: не правьте типовые формы напрямую, если есть возможность сделать расширение.
Мини-проверка перед сдачей
Перед тем как отдать форму пользователям, пройдитесь по короткому списку в режиме 1С:Предприятие.
Проверку под обычной ролью не пропускайте. Администратор видит всё, и ошибки с правами всплывают только у рядовых сотрудников, уже после внедрения. Запустите базу под тестовым пользователем с минимальными правами и пройдите все пункты. Заодно убедитесь, что серверные процедуры не требуют привилегий, которых у человека нет.