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

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

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

Разберем основную проблему: метод Показать() против Поля табличного документа

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

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

Вывод: Для полноценного управления двойным кликом необходимо использовать элемент формы Поле табличного документа.

Шаг 1. Подготовка формы для отображения отчета

Вместо того чтобы генерировать документ «в воздухе» и показывать его через Показать(), мы должны подготовить «контейнер» на форме. Рассмотрим пошагово:

  1. Откройте редактор вашей формы (отчета или обработки).
  2. На вкладке Реквизиты создайте новый реквизит (также можно добавлять реквизиты и элементы формы на управляемые формы легко и просто), например, с именем РезультатОтчета и типом данных ТабличныйДокумент.
  3. Перетащите этот реквизит на рабочую область формы. В дереве элементов появится объект типа Поле табличного документа (иногда требуется Программное изменение форм).
  4. В свойствах этого элемента (в правой панели) найдите список События.
  5. Найдите событие ОбработкаРасшифровки и нажмите на лупу, чтобы создать процедуру-обработчик в модуле формы.

Шаг 2. Программное заполнение данных и параметров расшифровки

Теперь выясним, как правильно передать данные в ячейку, чтобы их можно было «поймать» при клике (при программной генерации поможет СКДБилдер). Посмотрим на пример кода, который формирует строку с расшифровкой:


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

// Получаем область макета
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

// Заполняем параметр расшифровки для конкретной ячейки или всей области
// Важно: в макете у ячейки в свойстве "ПараметрРасшифровки" должно быть указано имя "РасшифровкаНоменклатуры"
ОбластьСтрока.Параметры.РасшифровкаНоменклатуры = СтруктураРасшифровки;

// Выводим область в наш реквизит формы
// "Результат" — это имя реквизита типа ТабличныйДокумент на форме
Элементы.РезультатОтчета.Вывести(ОбластьСтрока);

Шаг 3. Обработка события в модуле формы

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

Рассмотрим пример правильного кода обработки:


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

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

Важные нюансы и настройки для корректной работы

Проанализируем несколько критических моментов, без которых расшифровка может не заработать:

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

Почему вы все еще видите окошко «Структура»?

Если вы видите маленькое всплывающее окно со списком полей вашей структуры вместо выполнения вашего кода, это означает одно из двух:

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

← На главную