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