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