Как отловить событие двойного клика по ячейке макета в обычных формах 1С 8

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

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

Проблема стандартного метода Показать()

Рассмотрим типичную ошибку начинающего разработчика или специалиста, переходящего с «семерки». Часто для вывода отчета используется метод ТабДок.Показать(). Этот метод открывает табличный документ в стандартном системном окне просмотра. Проблема заключается в том, что это окно является «закрытым» для программного взаимодействия. У него нет событийного интерфейса, и мы не можем программно подписаться на клики или нажатия клавиш внутри этого окна.

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

Механизм расшифровки: основа интерактивности

Чтобы ячейка вообще реагировала на двойной клик как на событие расшифровки, нам необходимо правильно настроить макет. Рассмотрим настройки ячейки:

  1. Параметр расшифровки: В свойстве ячейки ПараметрРасшифровки нужно указать имя параметра (например, ДанныеДляПерехода).
  2. Заполнение: Установим значение «Параметр».
  3. Свойство «Защита»: Это критически важный момент. Чтобы событие расшифровки сработало, ячейка должна быть защищена (Защита = Истина), а сам табличный документ должен находиться в режиме «Только просмотр» (ТолькоПросмотр = Истина). Если документ доступен для редактирования, двойной клик просто активирует режим ввода текста.

Проанализируем пример кода при формировании макета:


Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Номенклатура = ТекущаяСтрока.Номенклатура;
// Записываем данные в расшифровку
Область.Параметры.РасшифровкаНоменклатуры = ТекущаяСтрока.Номенклатура; 
ТабДок.Вывести(Область);

Создание формы-контейнера

Поскольку стандартное окно не дает нам контроля, нам нужно создать собственное. Разберем алгоритм создания универсальной формы для вывода отчетов с рабочей расшифровкой:

1. Создадим новую общую форму (или форму в обработке) и назовем ее, например, ФормаПросмотраОтчетов.

2. Разместим на форме элемент управления Поле табличного документа. Назовем его ПолеТабДок.

3. Настроим привязки элемента к границам формы, чтобы при изменении размеров окна таблица растягивалась.

4. В модуле формы создадим обработчик события ОбработкаРасшифровки для этого поля.

Реализация обработчика расшифровки

Теперь рассмотрим, как написать код, который будет перехватывать двойной клик. Главный секрет кроется в параметре СтандартнаяОбработка. Если мы установим его в значение Ложь, система не будет пытаться открыть объект по ссылке сама, а передаст управление нашему коду.


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

КонецПроцедуры

Передача сложных данных в расшифровку

В отличие от 1С 7.7, где в расшифровку чаще всего передавалась строка или число, в 1С 8 мы можем поместить туда Структуру или СписокЗначений. Это позволяет передавать неограниченное количество параметров для обработки клика.

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


ДанныеКлика = Новый Структура;
ДанныеКлика.Вставить("Товар", ТекущийТовар);
ДанныеКлика.Вставить("Склад", ТекущийСклад);
ДанныеКлика.Вставить("Дата", ТекущаяДата);

Область.Параметры.ПараметрРасшифровки = ДанныеКлика;

В обработчике расшифровки мы просто извлечем эти данные: Склад = Расшифровка.Склад;. Это дает колоссальную гибкость при построении интерактивных отчетов.

Вывод готового документа в форму

Теперь вместо привычного ТабДок.Показать() мы будем вызывать нашу форму. Посмотрим, как это выглядит в коде основной обработки:


// Формируем табличный документ
ТабДок = Новый ТабличныйДокумент;
// ... заполнение табдока ...

// Получаем нашу форму-контейнер
Форма = ПолучитьФорму("ОбщаяФорма.ФормаПросмотраОтчетов");
// Передаем сформированный документ в поле на форме
Форма.ЭлементыФормы.ПолеТабДок.Вывести(ТабДок);
// Либо, если поле связано с данными:
// Форма.ТабличныйДокументОбъект = ТабДок;

Форма.Открыть();

Важные нюансы и советы

Проанализируем еще несколько важных моментов, которые могут повлиять на результат:

Таким образом, мы выяснили, что «отловить» двойной клик в отдельном макете (как в 7.7) можно только через использование экранной формы с элементом ПолеТабличногоДокумента. Это решение является стандартным для платформы 1С 8 и позволяет реализовывать сложную логику взаимодействия пользователя с данными отчета.

← На главную