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

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

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

Анализ частой ошибки при работе с контекстным меню

Проанализируем распространенную ошибку, возникающую при попытке настроить контекстное меню колонки. Попытка вызвать метод УстановитьДействие непосредственно у свойства КонтекстноеМеню приводит к исключению времени выполнения:


// Ошибочный вариант:
НоваяКолонка.КонтекстноеМеню.УстановитьДействие(<ИмяСобытия>, <Действие>);

Выясним причину этой ошибки: свойство КонтекстноеМеню у элемента формы является не событием, а визуальной группой элементов формы (тип ГруппаФормы). У этого объекта нет стандартных событий клика, в него добавляются команды и кнопки.

Важное архитектурное ограничение платформы: платформа 1С не поддерживает динамическую компиляцию программного кода в режиме «1С:Предприятие». В параметре метода УстановитьДействие или в свойстве Команда.Действие можно указывать только имя процедуры, которая уже заранее написана разработчиком в модуле формы с директивой &НаКлиенте.

Способ 1. Обработка двойного клика через событие таблицы «Выбор»

Рассмотрим основной способ перехвата двойного щелчка левой кнопкой мыши по любой ячейке таблицы. В управляемых формах за это действие отвечает событие самой таблицы Выбор.

Разберем по шагам реализацию привязки обработчика:

  1. Создаем в модуле формы универсальную процедуру-обработчик с директивой &НаКлиенте.
  2. При программном создании таблицы на форме связываем событие таблицы с именем этой процедуры через метод УстановитьДействие.
  3. Внутри процедуры анализируем параметры, чтобы понять, в какой именно колонке и строке было выполнено нажатие.

Посмотрим на пример кода подключения события:


// Назначение обработчика при программном формировании таблицы
ЭлементТаблица = Элементы.Найти("МояДинамическаяТаблица");
Если ЭлементТаблица <> Неопределено Тогда
    ЭлементТаблица.УстановитьДействие("Выбор", "ТаблицаДинамическаяВыбор");
КонецЕсли;

Теперь реализуем сам обработчик в модуле формы:


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

Способ 2. Вызов всплывающего меню по кнопке выбора ячейки

Если по нажатию на определенную ячейку требуется отображать кастомное меню действий, наиболее удобным механизмом является использование события поля НачалоВыбора совместно с методом ПоказатьМеню.

Разберем реализацию этого подхода:

  1. При создании колонки (поля ввода таблицы) включаем отображение кнопки выбора: НоваяКолонка.КнопкаВыбора = Истина;.
  2. Назначаем полю действие НачалоВыбора через НоваяКолонка.УстановитьДействие("НачалоВыбора", "КолонкаНачалоВыбора");.
  3. В обработчике отключаем системный выбор, формируем СписокЗначений с пунктами меню и вызываем метод ПоказатьМеню.

Посмотрим на пример кода:


&НаКлиенте
Процедура КолонкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    ПунктыМеню = Новый СписокЗначений;
    ПунктыМеню.Добавить("Действие1", "Выполнить операцию 1");
    ПунктыМеню.Добавить("Действие2", "Выполнить операцию 2");
    
    Оповещение = Новый ОписаниеОповещения("ОбработатьВыборМеню", ЭтотОбъект);
    
    // Метод ПоказатьМеню привязывает всплывающее меню к указанному элементу
    ПоказатьМеню(Оповещение, ПунктыМеню, Элемент);
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборМеню(ВыбранныйПункт, ДополнительныеПараметры) Экспорт
    
    Если ВыбранныйПункт = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Если ВыбранныйПункт.Значение = "Действие1" Тогда
        // Обработка первого пункта
    ИначеЕсли ВыбранныйПункт.Значение = "Действие2" Тогда
        // Обработка второго пункта
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Программное добавление пунктов в контекстное меню

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

Разберем по шагам добавление пункта меню:

  1. Добавляем команду в коллекцию ЭтаФорма.Команды.
  2. Указываем в свойстве Действие имя процедуры модуля формы.
  3. Создаем кнопку формы с типом КнопкаФормы и родительским элементом ЭлементТаблицы.КонтекстноеМеню или Колонка.КонтекстноеМеню.
  4. Связываем созданную кнопку с именем созданной команды.

Посмотрим на пример создания команды и кнопки контекстного меню:


// Создание команды формы
ИмяКоманды = "КонтекстнаяКоманда";
Команда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
Команда.Действие = "ОбработчикКонтекстнойКоманды";
Команда.Заголовок = "Специальное действие";

// Добавление кнопки в контекстное меню таблицы
Кнопка = Элементы.Добавить("Кнопка" + ИмяКоманды, Тип("КнопкаФормы"), ЭлементТаблицы.КонтекстноеМеню);
Кнопка.ИмяКоманды = ИмяКоманды;

В модуле формы объявляем клиентский обработчик команды:


&НаКлиенте
Процедура ОбработчикКонтекстнойКоманды(Команда)
    
    ТекущиеДанные = Элементы.МояДинамическаяТаблица.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        // Выполняем логику над текущей строкой
    КонецЕсли;
    
КонецПроцедуры

Способ 4. Использование системного выпадающего списка

Если цель меню заключается в обычном выборе одного значения из предопределенного перечня без написания сложных обработчиков, то оптимальным решением является использование штатного списка выбора поля ввода:

  1. У созданного элемента поля формы устанавливаем свойства РежимВыбораИзСписка = Истина и КнопкаВыпадающегоСписка = Истина.
  2. Заполняем коллекцию СписокВыбора нужными значениями через метод Добавить или ЗагрузитьЗначения.

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

← На главную