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