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