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

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

Как сделать кнопку с выпадающим списком в 1С

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

Кнопка с выпадающим списком — стандартный элемент интерфейса 1С: пользователь видит одну кнопку, а при нажатии на неё (или на стрелку рядом) открывается меню с несколькими командами. Так оформляют, например, кнопку «Печать» с выбором печатной формы или «Создать на основании» с перечнем документов. Реализовать её можно тремя способами: через подменю в командной панели формы, через кнопку с видом «Кнопка с выпадающим списком» и программно, с показом меню из кода.

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

Все примеры ориентированы на управляемые формы платформы 1С:Предприятие 8.3. Для обычных форм механика отличается, и в конце статьи это отдельно оговорено. Перед изменениями в конфигураторе убедитесь, что у вас есть резервная копия информационной базы или работа ведётся в тестовой копии.

Какие варианты реализации существуют и что выбрать

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

Второй подход — программный: в обработчике команды формируется объект СписокЗначений, заполняется пунктами и показывается пользователю через ПоказатьВыборИзМеню или ПоказатьВыборИзСписка. Выбранное значение возвращается в оповещение, где выполняется нужное действие. Этот способ нужен, когда состав пунктов зависит от контекста: например, для менеджера и для администратора список разный.

Третий вариант — поле ввода с кнопкой списка выбора. Технически это не кнопка, а поле с выпадающим списком значений, но визуально пользователи часто называют его именно «кнопкой со списком». Он подходит, когда нужно не выполнить команду, а выбрать и сохранить значение в реквизит.

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

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

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

ПоказатьВыборИзМеню программно

Динамический состав пунктов, полный контроль. Требует кода и обработки оповещения.

Поле ввода со списком выбора

Нужно сохранить выбранное значение в реквизит. Не подходит для запуска команд.

Создаём кнопку с выпадающим списком через конфигуратор

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

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

Далее перетащите мышью нужные команды из списка команд внутрь созданного подменю — в дереве элементов они появятся как кнопки, вложенные в подменю. Порядок кнопок внутри подменю определяет порядок пунктов в выпадающем списке; менять его можно перетаскиванием или кнопками перемещения вверх/вниз.

Порядок действий в конфигураторе
  1. 1
    Откройте форму объекта в конфигураторе
  2. 2
    На вкладке «Команды» создайте нужные команды и их обработчики
  3. 3
    В дереве элементов добавьте в командную панель группу вида «Подменю»
  4. 4
    Задайте подменю заголовок и при необходимости картинку
  5. 5
    Перетащите команды внутрь подменю в нужном порядке
  6. 6
    Обновите конфигурацию базы данных и проверьте форму в режиме Предприятия

Настройка внешнего вида подменю

У подменю есть несколько свойств, влияющих на отображение. Свойство «Заголовок» — текст на кнопке. «Картинка» — пиктограмма слева от текста; для стандартных действий удобно использовать картинки из библиотеки платформы. Свойство «Отображение» позволяет показать только картинку, только текст или оба элемента.

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

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

Программное создание выпадающего списка

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

Меню показывается методом ПоказатьВыборИзМеню. Первым параметром передаётся описание оповещения — процедура, которая получит выбранный элемент списка. Вторым — сам список значений. Третьим, необязательным, — элемент формы, у которого показать меню; обычно это текущая кнопка, чтобы меню появилось рядом с ней.

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

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

Обратите внимание на обязательную проверку ВыбранныйЭлемент = Неопределено: если пользователь закрыл меню клавишей Esc или кликом мимо, оповещение всё равно вызовется, но без выбранного значения. Пропуск этой проверки — одна из самых частых причин ошибок в подобных обработчиках.

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

Динамическое формирование пунктов по условиям

Типовой сценарий — скрывать часть пунктов в зависимости от состояния документа или прав пользователя. Например, пункт «Аннулировать» показывать только для проведённого документа, а «Создать счёт» — только если у пользователя есть право добавления счетов. Проверку прав выполняйте на сервере, потому что на клиенте данные о правах могут быть недоступны или неактуальны.

Удобный приём — передавать с сервера массив структур с полями «ИмяКоманды» и «Представление», а на клиенте в цикле заполнять список значений. Так логика решения «что показывать» остаётся в одном месте, а клиентская часть остаётся тонкой и не требует изменений при добавлении новых пунктов.

Маршрут решения

Как выбрать действие

Состав пунктов фиксирован и одинаков для всех пользователейИспользуйте подменю в командной панели — настройка без кода
Пункты зависят от данных объекта или прав пользователяФормируйте СписокЗначений и показывайте через ПоказатьВыборИзМеню
Нужно сохранить выбранное значение, а не выполнить командуИспользуйте поле ввода со списком выбора, а не кнопку

Особенности для обычных форм и внешних обработок

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

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

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

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

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

Типичные ошибки
01
Нет проверки ВыбранныйЭлемент = Неопределено — при отмене выбора код падает с ошибкой
02
В ПоказатьВыборИзМеню указано неверное имя элемента — меню открывается не там или вызов завершается ошибкой
03
Команда добавлена в подменю без обработчика — кнопка есть, действия нет
04
Изменения внесены, но конфигурация базы данных не обновлена — в режиме Предприятия ничего не изменилось
05
Интерактивный метод вызван на сервере или в фоновом задании — метод недоступен в этом контексте
Контрольные точки

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

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

Кнопка видна с заданным заголовком и стрелкой

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

Кнопки нет — проверьте видимость элемента и обновление конфигурации

Открытие списка
Норма

При нажатии раскрывается меню со всеми пунктами

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

Меню пустое или не открывается — проверьте вложенность команд или код формирования списка

Выполнение пунктов
Норма

Каждый пункт выполняет своё действие

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

Пункт есть, действия нет — у команды не создан обработчик

Отмена выбора
Норма

Закрытие меню без выбора не вызывает ошибок

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

Ошибка при Esc — нет проверки на Неопределено

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

Можно ли сделать кнопку с выпадающим списком без программирования?

Да. Добавьте в командную панель формы группу вида «Подменю» и перетащите в неё готовые команды объекта. Для стандартных команд (печать, создание на основании) вообще ничего кодировать не нужно — только настройка в редакторе формы.

Как добавить картинку к пункту программного меню?

При добавлении элемента в СписокЗначений третьим параметром передайте картинку: Список.Добавить("Заказ", "Заказ покупателя", , БиблиотекаКартинок.Печать);. Четвёртый параметр управляет пометкой пункта.

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

Проверьте третий параметр метода ПоказатьВыборИзМеню — в нём должен быть указан элемент формы, рядом с которым показывается меню. Если параметр опущен, платформа выбирает положение сама, и оно может не совпадать с ожиданием.

Как скрыть часть пунктов для отдельных пользователей?

Формируйте список динамически: на сервере проверяйте права или роль пользователя и включайте в список только доступные пункты. Статичное подменю скрывать по пользователям сложнее — придётся управлять видимостью кнопок программно при создании формы.

Работает ли выпадающий список в веб-клиенте?

Да, и подменю, и ПоказатьВыборИзМеню поддерживаются в веб-клиенте и тонком клиенте. Ограничения касаются только серверного и фонового контекста, где интерактивные методы недоступны в принципе.

Чем выпадающий список кнопки отличается от поля со списком выбора?

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

Итог

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

Статичное меню делайте подменю в командной панели формы, динамическое — программно через СписокЗначений и ПоказатьВыборИзМеню. Всегда проверяйте отмену выбора, обновляйте конфигурацию после изменений и тестируйте форму под пользователем с ограниченными правами.