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