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

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

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

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

Ограничения стандартного метода Показать()

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

Если в расшифровку ячейки передан СписокЗначений, стандартный просмотрщик открывает его как неинтерактивное окно со списком, элементы которого нельзя открыть двойным кликом. Чтобы получить полный контроль над событиями пользовательского ввода, табличный документ необходимо отображать внутри управляемой формы в элементе ПолеТабличногоДокумента.

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

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

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

Посмотрим на пример кода открытия вспомогательной формы:


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

&НаКлиенте
Процедура ОткрытьШирокийОтчет()
    АдресТабДок = СформироватьОтчетИПоместитьВоВременноеХранилище();
    ПараметрыОткрытия = Новый Структура("АдресТабличногоДокумента", АдресТабДок);
    ОткрытьФорму("Обработка.МойОтчет.Форма.ФормаПросмотра", ПараметрыОткрытия);
КонецПроцедуры

В модуле созданной формы при создании на сервере прочитаем документ из хранилища:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("АдресТабличногоДокумента") Тогда
        ТабличныйДокументРеквизит = ПолучитьИзВременногоХранилища(Параметры.АдресТабличногоДокумента);
    КонецЕсли;
КонецПроцедуры

Обработка события ОбработкаРасшифровки

Теперь рассмотрим ключевую часть решения. В свойствах элемента ПолеТабличногоДокумента назначим обработчик события ОбработкаРасшифровки. Чтобы отключить платформенное поведение по умолчанию, установим параметр СтандартнаяОбработка = Ложь;.

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

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


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

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

Полезные свойства и тонкости настройки

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

  1. Защита от случайного редактирования: Установим для табличного документа свойство ТолькоПросмотр = Истина. Если этого не сделать, при двойном клике по ячейке пользователь перейдет в режим редактирования текста вместо вызова расшифровки.
  2. Срабатывание по одинарному клику: Если для области или ячейки табличного документа установить свойство Гиперссылка = Истина, событие ОбработкаРасшифровки сработает уже по первому клику мыши, а курсор автоматически примет форму указателя.
  3. Интеграция с СКД: Если отчет формируется на базе Системы компоновки данных, для управления расшифровкой целесообразно использовать объект ОбработкаРасшифровкиКомпоновкиДанных. Это позволяет сохранить стандартное меню компоновщика и встроить в него собственные действия.
← На главную