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

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

1С: как добавить контекстное меню — подробная инструкция

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

Контекстное меню в 1С — это список команд, который открывается по правой кнопке мыши на элементе формы: табличной части, поле ввода, динамическом списке или дереве значений. Грамотно настроенное контекстное меню ускоряет работу пользователей: частые операции (скопировать строку, открыть карточку, сформировать отчёт по выделенному) доступны в один клик, без поиска по командной панели.

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

Материал подходит для управляемых форм (тонкий клиент, веб-клиент). Обычные формы используют другой механизм — свойство «КонтекстноеМеню» элемента управления с объектом типа «КонтекстноеМеню», заполняемым методом «Добавить»; этот вариант кратко рассмотрен в отдельном разделе.

Как устроено контекстное меню в управляемой форме

В управляемой форме контекстное меню не является самостоятельным объектом — это часть структуры элемента формы. У большинства элементов (таблица, поле, картинка) в дереве элементов редактора формы есть подчинённая ветка «Контекстное меню». Любая кнопка, помещённая в эту ветку, появляется при нажатии правой кнопки мыши на элементе.

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

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

Добавление команды в контекстное меню через конфигуратор

Базовый сценарий: нужно добавить в контекстное меню табличной части документа собственную команду, например «Заполнить цены по виду цен». Вся работа выполняется в редакторе формы, без кода на первом этапе.

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

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

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

Программное добавление пунктов контекстного меню

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

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

&НаКлиенте
Процедура ПоказатьОстаткиНажатие(Команда)
	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	// дальнейшая логика по выбранной номенклатуре
КонецПроцедуры

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

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

Контекстное меню динамического списка и поля ввода

Динамический список

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

Для команд, работающих с несколькими выделенными строками, используйте коллекцию Элементы.Список.ВыделенныеСтроки. Убедитесь, что у таблицы включён режим множественного выделения, иначе пользователь сможет обработать только одну строку.

Поле ввода

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

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

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

Команда одинакова для всех пользователей и строкДобавьте команду и кнопку в конфигураторе, без программного кода
Состав меню зависит от типа строки или роли пользователяСоздайте кнопки заранее и управляйте их видимостью в ПриАктивизацииСтроки
Меню нужно в нескольких формах сразуИспользуйте общую команду или типовую общую форму с параметризованным обработчиком
Нужно меню в обычном приложении (обычные формы)Заполняйте свойство КонтекстноеМеню элемента методом Добавить в обработчике ПриОткрытии

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

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

bsl
Процедура ПриОткрытии()
	КнопкиМеню = ЭлементыФормы.Товары.КонтекстноеМеню.Кнопки;
	Кнопка = КнопкиМеню.Добавить("ЗаполнитьЦены", ТипКнопкиКоманднойПанели.Действие, "Заполнить цены", Новый Действие("ЗаполнитьЦеныНажатие"));
КонецПроцедуры

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

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

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

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

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

Пункт появляется по правому клику
Норма

Пункт виден на нужном элементе и только на нём

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

Пункт отсутствует или появился на всех элементах формы

Выполнение команды
Норма

Обработчик отрабатывает, данные текущей строки доступны

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

Ошибка «Процедура не обнаружена» или ТекущиеДанные = Неопределено

Повторное открытие формы
Норма

Меню не дублируется

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

Пункты множатся при каждом открытии — код добавления стоит не в ПриСозданииНаСервере

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

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

Альтернативы: расширения и подменю «Ещё»

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

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

Итог

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

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

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

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

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

Как добавить пункт в контекстное меню только для определённых пользователей?

Создайте кнопку заранее, а в обработчике ПриСозданииНаСервере проверьте роль пользователя функцией РольДоступна или ПользователиИнформационнойБазы.ТекущийПользователь и установите кнопке Видимость = Ложь при отсутствии нужных прав. Скрытие на сервере надёжнее, чем управление доступностью на клиенте.

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

Да. В конфигураторе добавьте в ветку «Контекстное меню» группу кнопок с видом «Подменю» и перетащите в неё нужные команды. Программно создаётся элемент типа «ГруппаФормы» с видом подменю, родителем которого является коллекция КонтекстноеМеню элемента.

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

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

Работает ли контекстное меню в веб-клиенте и на мобильном устройстве?

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

Чем добавление через расширение отличается от изменения типовой формы?

Расширение не изменяет исходную форму: заимствованная форма с доработками хранится отдельно и накладывается при запуске. Это сохраняет возможность обновления конфигурации без снятия объектов с поддержки, но требует проверки расширения после каждого обновления поставщика.