Как добавить свою процедуру в контекстное меню дерева значений на обычных формах 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Разбираем проблему стандартного меню

По умолчанию в 1С для табличных полей включено свойство Автоконтекстное меню. Оно автоматически генерирует набор стандартных команд: «Добавить», «Изменить», «Удалить», «Вывести список» и другие. Однако это меню является статичным с точки зрения разработчика — мы не можем просто «вклиниться» в него и добавить свою кнопку через визуальный редактор. Чтобы расширить функционал, нам придется пойти путем подмены стандартного меню на наше собственное программно управляемое решение.

Шаг 1: Отключение автоматического меню и подготовка панели

Проанализируем свойства нашего элемента управления. Первым делом нам необходимо зайти в конфигуратор, открыть нужную форму и выбрать элемент ТабличноеПоле (в котором отображается дерево). В палитре свойств найдем флажок АвтоконтекстноеМеню и снимем его. С этого момента при нажатии ПКМ в режиме «Предприятие» ничего происходить не будет.

Теперь создадим «донора» для нашего нового меню. Разберем по шагам:

  1. Добавим на форму новый элемент управления — КоманднаяПанель.
  2. В свойствах этой панели снимем галочку Вспомогательная, чтобы она не пыталась автоматически привязываться к основному объекту формы.
  3. Если мы не хотим, чтобы эта панель была видна пользователю постоянно в верхней части формы, установим свойство Видимость в значение Ложь. Контекстное меню будет работать, даже если сама панель скрыта.
  4. Вернемся к нашему табличному полю и в свойстве КонтекстноеМеню выберем только что созданную командную панель.

Шаг 2: Настройка кнопок и сохранение системных функций

Выясним важную деталь: когда мы отключили автоменю, пользователь потерял возможность копировать строки или выводить список. Чтобы вернуть эти функции, в редакторе нашей командной панели нажмем кнопку добавления новой кнопки и выберем тип Источник действий. В свойстве Источник действий укажем наше табличное поле. 1С автоматически подтянет все стандартные команды в нашу панель.

Теперь добавим нашу главную цель — кнопку отбора. Создадим новую кнопку в этой же панели, зададим ей понятное имя и текст (например, «Отфильтровать по значению»). В качестве действия создадим процедуру в модуле формы.

Шаг 3: Программная реализация логики отбора

Рассмотрим пример кода, который будет выполняться при нажатии на нашу кнопку в контекстном меню. Основная сложность в обычных формах заключается в том, что дерево значений не поддерживает фильтрацию «из коробки» так, как это делают динамические списки. Нам придется реализовать алгоритм скрытия строк программно.

Посмотрим на пример процедуры-обработчика:


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

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

Шаг 4: Динамическое управление составом меню

Иногда требуется, чтобы кнопка в меню появлялась только при нажатии на определенные элементы (например, только на «папки» или только на «товары»). Проанализируем, как это сделать динамически. Для этого удобно использовать событие ПриАктивацииСтроки табличного поля.

Рассмотрим, как управлять доступностью кнопок командной панели:


Процедура ТабличноеПолеПриАктивацииСтроки(Элемент)
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    
    // Если это группа (узел), разрешаем отбор, иначе запрещаем
    Если ТекущиеДанные <> Неопределено Тогда
        ЭлементыФормы.КоманднаяПанельМеню.Кнопки.ДействиеОтбор.Доступность = ТекущиеДанные.ЭтоГруппа;
    КонецЕсли;
    
КонецПроцедуры

Шаг 5: Использование объекта Действие

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


Процедура ДобавитьКнопкуВМенюПрограммно()
    
    // Создаем объект Действие, указывая имя процедуры в модуле формы
    НовоеДействие = Новый Действие("ПроцедураВыполненияОтбора");
    
    // Добавляем кнопку в коллекцию кнопок панели
    НоваяКнопка = ЭлементыФормы.МояПанельМеню.Кнопки.Добавить("КнопкаОтбора", ТипКнопкиКоманднойПанели.Действие, "Отбор по значению", НовоеДействие);
    
    // Можно также задать горячую клавишу для быстрого доступа
    НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.F3, Ложь, Истина, Ложь); // Alt + F3
    
КонецПроцедуры

Использование СочетаниеКлавиш особенно полезно, чтобы решить проблему, упомянутую автором: «гонять мышку туда-сюда». Назначив горячую клавишу на процедуру отбора, пользователь сможет мгновенно фильтровать дерево, просто перемещаясь по нему стрелками клавиатуры и нажимая комбинацию клавиш.

Дополнительные рекомендации

При реализации сложных меню в обычных формах стоит учитывать следующие моменты:

Таким образом, мы разобрали комплексный подход к кастомизации контекстного меню. Замена стандартного АвтоконтекстноеМеню на собственную КоманднуюПанель открывает широкие возможности для автоматизации работы пользователя, позволяя внедрять любые программные алгоритмы, от простых фильтров до сложных обработок данных, непосредственно в область правого клика мыши.

← На главную