Как добавить команду в контекстное меню списка на управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке интерфейсов на управляемых формах 1С:Предприятие часто возникает задача улучшить удобство работы пользователей (Usability). Используя приемы построения эффективных интерфейсов, можно значительно ускорить работу. Одним из таких улучшений является добавление часто используемых действий в контекстное меню списка (меню, которое открывается при нажатии правой кнопкой мыши на строку таблицы).

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

Почему команда может не отображаться в контекстном меню?

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

Если вы добавили команду в структуру формы, но она не видна, причины могут быть следующими:

  1. Типизация параметра команды. Если ваша команда является параметрической (в свойстве Тип параметра команды указан, например, ДокументСсылка.РеализацияТоваровУслуг), платформа должна быть уверена, что текущая строка списка соответствует этому типу. Если список формируется произвольным запросом (для упрощения работы с которыми создан СКДБилдер) и у Динамического списка не указана Основная таблица, платформа может не распознать тип данных строки и скроет команду в целях безопасности.
  2. Автозаполнение. У элемента формы "Контекстное меню" есть свойство Автозаполнение. Когда оно включено, платформа сама решает, какие стандартные и глобальные команды там показывать. Ваши ручные настройки могут конфликтовать с автоматикой.
  3. Множественный выбор. Если команда не умеет работать с массивом ссылок, а в списке выделено несколько строк (или настройки списка допускают это), команда может быть скрыта.

Способ 1: Стандартное добавление через редактор формы

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

Чтобы добавить команду в контекстное меню, выполним следующие действия в Конфигураторе:

  1. Откройте форму списка.
  2. Перейдите на вкладку Команды (справа) и найдите нужную вам команду (например, в ветке Глобальные команды или созданную локально).
  3. Перетащите эту команду в дерево элементов формы (слева).
  4. Важный момент: перетаскивать нужно не просто в список, а конкретно внутрь элемента Список -> группа Контекстное меню.

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

Способ 2: Создание локальной команды-обертки (Рекомендуемое решение)

Если прямая вставка Общей команды не работает (например, из-за сложностей с передачей параметров контекста), самым надежным решением является создание локальной команды формы, которая будет вызывать логику общей команды.

Давайте реализуем это пошагово:

Шаг 1. Создаем команду формы

В редакторе формы перейдите на вкладку "Команды", затем "Команды формы" и добавьте новую. Назовем её, например, КМ_МояКоманда (Контекстное Меню).

Шаг 2. Размещаем команду в интерфейсе

Перетащите созданную команду КМ_МояКоманда в дерево элементов: Элементы -> Список -> Контекстное меню. Теперь у вас в контекстном меню гарантированно будет кнопка, так как локальные команды формы не зависят от жесткой типизации параметров при отрисовке.

Шаг 3. Пишем обработчик

В свойствах команды нажмите на лупу напротив поля Действие и создайте процедуру на клиенте. В этой процедуре нам нужно:

  1. Получить текущую строку, на которой кликнул пользователь.
  2. Вызвать логику общей команды, передав туда эту строку.

Пример кода для модуля формы:


&НаКлиенте
Процедура КМ_МояКоманда(Команда)
    
    // Получаем текущие данные списка. 
    // Элементы.Список.ТекущаяСтрока вернет Ссылку (или ключ записи), если это ДинамическийСписок
    
    ТекущаяСсылка = Элементы.Список.ТекущаяСтрока;
    
    Если ТекущаяСсылка = Неопределено Тогда
        Возврат; // Ничего не выбрано
    КонецЕсли;
    
    // ВАРИАНТ А: Если логика вынесена в Общий модуль (Лучшая практика)
    // Предположим, у вас есть общий модуль "РаботаСДокументамиКлиент"
    
    ПараметрыВыполнения = Новый Структура("Ссылка", ТекущаяСсылка);
    РаботаСДокументамиКлиент.ВыполнитьМоюЛогику(ПараметрыВыполнения);
    
    // ВАРИАНТ Б: Если нужно вызвать именно Общую Команду (сложнее)
    // Напрямую вызвать обработчик общей команды из формы нельзя, 
    // но можно открыть её форму или использовать методы оповещения, 
    // если архитектура это предусматривает.
    
    // Чаще всего просто дублируют вызов той же процедуры, 
    // которая прописана в ОбщейКоманде.
    
КонецПроцедуры

Обратите внимание: Если ваша общая команда параметрическая, то при её стандартном вызове платформа сама передает параметр ПараметрКоманды. В локальной команде мы должны получить этот параметр вручную через Элементы.Список.ТекущаяСтрока (для ссылочных типов) или Элементы.Список.ТекущиеДанные (для получения значений колонок).

Особенности работы с автозаполнением

Иногда, чтобы добиться полного контроля над контекстным меню, приходится отключать механизм Автозаполнения. Давайте посмотрим, как это влияет на результат.

Если вы решили отключить автозаполнение, помните, что вам придется вручную добавить все необходимые стандартные команды обратно в группу Контекстное меню (перетащить их из вкладки "Команды" -> "Стандартные команды").

Программное добавление (для продвинутых случаев)

В обсуждении также упоминалось программное добавление кнопок. Это возможно сделать в процедуре ПриСозданииНаСервере. Это полезно, если состав команд зависит от функциональных опций или прав пользователя.


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

Резюме

Если ваша общая команда не появляется в контекстном меню списка:

  1. Проверьте, задана ли Основная таблица у динамического списка.
  2. Убедитесь, что тип параметра команды совпадает с типом списка.
  3. Если это не помогло — создайте локальную команду формы, перетащите её в контекстное меню и пропишите вызов логики вручную, передавая Элементы.Список.ТекущаяСтрока как параметр. Это самый надежный способ, к которому приходят большинство разработчиков.
← На главную