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