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

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

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

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

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

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

Где в форме находится контекстное меню

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

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

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

Создание команды и обработчика в конфигураторе

Откройте нужную форму в конфигураторе (документ, справочник или внешняя обработка) и перейдите на закладку «Команды» → «Команды формы». Нажмите «Добавить» и задайте имя команды, например ПоказатьИсториюСтроки. В свойствах команды заполните «Заголовок» — именно этот текст увидит пользователь в контекстном меню.

В свойстве «Действие» нажмите кнопку с лупой — конфигуратор создаст заготовку обработчика в модуле формы. Для управляемых форм обработчик клиентской команды выглядит так:

&НаКлиенте

Процедура ПоказатьИсториюСтроки(Команда)

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Возврат;

КонецЕсли;

ПоказатьПредупреждение(, "Выбрана строка: " + ТекущиеДанные.Наименование);

КонецПроцедуры

Обратите внимание на проверку ТекущиеДанные = Неопределено. Контекстное меню доступно даже при пустом списке, и обращение к полям несуществующей строки вызовет ошибку. Это одна из самых частых причин «падающих» кнопок у начинающих разработчиков.

Привязка кнопки к контекстному меню в дереве элементов

После создания команды перейдите на закладку «Форма» (дерево элементов). Найдите таблицу, к меню которой нужно добавить кнопку. Раскройте её узел — внутри обычно уже есть колонки и, возможно, командная панель. Правой кнопкой по узлу таблицы выберите «Добавить» → «Кнопка», либо просто перетащите команду мышью из панели команд на узел таблицы.

Выделите добавленную кнопку и в палитре свойств найдите свойство, определяющее её размещение. Чтобы кнопка попала именно в контекстное меню, а не в командную панель, убедитесь, что она расположена внутри узла КонтекстноеМеню таблицы. Если такого узла в дереве нет, добавьте группу вида «Контекстное меню» вручную: правый клик по таблице → «Добавить» → «Группа», в свойствах группы установите «Вид» = «Контекстное меню», и уже в неё перетащите кнопку.

В свойствах кнопки проверьте поле «ИмяКоманды» — там должна быть выбрана ваша команда. Также полезно заполнить «Картинка»: кнопки с иконками в контекстном меню воспринимаются заметно лучше, особенно если пунктов несколько.

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

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

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// 1. Создаём команду формы

Команда = Команды.Добавить("ОткрытьКарточкуКонтрагента");

Команда.Заголовок = "Открыть карточку контрагента";

Команда.Действие = "Подключаемый_ОткрытьКарточкуКонтрагента";

// 2. Добавляем кнопку в контекстное меню таблицы «Список»

Кнопка = Элементы.Добавить("СписокОткрытьКарточкуКонтрагента",

Тип("КнопкаФормы"),

Элементы.СписокКонтекстноеМеню);

Кнопка.ИмяКоманды = "ОткрытьКарточкуКонтрагента";

КонецПроцедуры

Обработчик команды должен существовать в модуле формы заранее — платформа ищет его по имени, указанному в Команда.Действие:

&НаКлиенте

Процедура Подключаемый_ОткрытьКарточкуКонтрагента(Команда)

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Возврат;

КонецЕсли;

ПоказатьЗначение(, ТекущиеДанные.Ссылка);

КонецПроцедуры

Ключевой момент — третий параметр метода Элементы.Добавить: это родительский элемент. Передав туда Элементы.СписокКонтекстноеМеню, вы помещаете кнопку именно в контекстное меню. Если передать Элементы.СписокКоманднаяПанель — кнопка окажется в командной панели списка.

bsl
Кнопка = Элементы.Добавить("МояКнопка", Тип("КнопкаФормы"), Элементы.СписокКонтекстноеМеню);
Кнопка.ИмяКоманды = "МояКоманда";

Добавление кнопки через расширение конфигурации

Для типовых конфигураций (1С:Бухгалтерия, Управление торговлей, ЗУП) прямое изменение формы нежелательно: объект снимается с полной поддержки, и обновления становятся сложнее. Правильный путь — расширение конфигурации.

Создайте расширение (Конфигурация → Расширения конфигурации), добавьте в него заимствованную форму нужного объекта. Дальше действия аналогичны: создайте команду формы с обработчиком и перетащите её в контекстное меню таблицы. Программный вариант тоже работает — добавьте в расширение обработчик ПриСозданииНаСервере с аннотацией &После и создайте кнопку кодом.

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

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

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

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

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

Кнопка видна в контекстном меню таблицы
Норма

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

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

Кнопки нет — проверьте родителя (контекстное меню, а не командная панель) и права на команду

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

Выполняется обработчик, нет сообщений об ошибке

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

Ошибка «Процедура не обнаружена» — имя в Команда.Действие не совпадает с именем процедуры

Клик при пустом списке
Норма

Обработчик тихо завершается без ошибки

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

Ошибка обращения к полю — отсутствует проверка ТекущиеДанные = Неопределено

Типичные ошибки
01
Кнопка добавлена в командную панель вместо контекстного меню — пользователь не находит её по правому клику; исправьте родительский элемент
02
Обработчик не создан или имя в свойстве «Действие» не совпадает с именем процедуры — платформа выдаёт ошибку «Процедура или функция не обнаружена»
03
Нет проверки на пустые ТекущиеДанные — кнопка «падает» при пустом списке
04
Серверная логика размещена в клиентском обработчике — ошибки компиляции или недоступность методов в тонком клиенте
05
Изменена типовая форма напрямую вместо расширения — конфликты при обновлении конфигурации

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

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

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

Почему кнопка не появилась в меню после обновления конфигурации?

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

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

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

Можно ли показывать кнопку только при определённых условиях?

Да. Установите свойство кнопки Видимость = Ложь программно и управляйте им в обработчиках формы — например, показывайте кнопку только для строк определённого типа. Удобно делать это в обработчике ПриАктивизацииСтроки таблицы, пересчитывая видимость при каждом перемещении курсора.

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

В конфигураторе — через свойство «Картинка» кнопки, выбрав картинку из общей библиотеки или загрузив свою в общие картинки. Программно: Кнопка.Картинка = БиблиотекаКартинок.ИмяКартинки. Картинка отображается слева от заголовка пункта меню.

Итог

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

Кнопка в контекстное меню добавляется в два шага: создать команду формы с обработчиком и поместить кнопку в узел контекстного меню таблицы — в конфигураторе перетаскиванием или кодом через Элементы.Добавить с родителем «<ИмяТаблицы>КонтекстноеМеню». Для типовых конфигураций используйте расширение, а в обработчике всегда проверяйте ТекущиеДанные на Неопределено.