При разработке отчетов и печатных форм нередко возникает задача кастомизировать поведение платформы при двойном клике по ячейке табличного документа. Например, когда в ячейку заложен список документов, и пользователю необходимо предоставить выбор конкретного документа для открытия, стандартного механизма становится недостаточно.
В этой статье мы подробно разберем, почему не работает перехват событий при использовании метода Показать(), и как правильно реализовать собственную обработку расшифровки в управляемом приложении.
Выясним причину, по которой не удается перехватить события в отдельно открытом окне. Метод ТабличныйДокумент.Показать() открывает отчет во встроенном стандартном средстве просмотра платформы 1С:Предприятие. В этом режиме отсутствует контекст управляемой формы и программный модуль, в котором можно было бы описать логику реакции на действия пользователя.
Если в расшифровку ячейки передан СписокЗначений, стандартный просмотрщик открывает его как неинтерактивное окно со списком, элементы которого нельзя открыть двойным кликом. Чтобы получить полный контроль над событиями пользовательского ввода, табличный документ необходимо отображать внутри управляемой формы в элементе ПолеТабличногоДокумента.
Разберем по шагам правильный алгоритм реализации нестандартной расшифровки для широких отчетов и сложных структур данных.
ТабличныйДокументРеквизит с типом ТабличныйДокумент и перетащим его на форму — платформа автоматически создаст элемент управления ПолеТабличногоДокумента.РежимОткрытияОкна в значение Независимый, а свойство НачальноеОтображение — в Максимизированное.Посмотрим на пример кода открытия вспомогательной формы:
&НаСервере
Функция СформироватьОтчетИПоместитьВоВременноеХранилище()
ТабДок = Новый ТабличныйДокумент;
// ... Заполнение макета и табличного документа данными ...
Возврат ПоместитьВоВременноеХранилище(ТабДок, Новый УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ОткрытьШирокийОтчет()
АдресТабДок = СформироватьОтчетИПоместитьВоВременноеХранилище();
ПараметрыОткрытия = Новый Структура("АдресТабличногоДокумента", АдресТабДок);
ОткрытьФорму("Обработка.МойОтчет.Форма.ФормаПросмотра", ПараметрыОткрытия);
КонецПроцедуры
В модуле созданной формы при создании на сервере прочитаем документ из хранилища:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АдресТабличногоДокумента") Тогда
ТабличныйДокументРеквизит = ПолучитьИзВременногоХранилища(Параметры.АдресТабличногоДокумента);
КонецЕсли;
КонецПроцедуры
Теперь рассмотрим ключевую часть решения. В свойствах элемента ПолеТабличногоДокумента назначим обработчик события ОбработкаРасшифровки. Чтобы отключить платформенное поведение по умолчанию, установим параметр СтандартнаяОбработка = Ложь;.
Если в расшифровке передан массив ссылок или СписокЗначений, организуем для пользователя интерактивный выбор с помощью немодального метода ПоказатьВыборИзСписка() и механизма ОписаниеОповещения.
Проанализируем пример клиентского кода:
&НаКлиенте
Процедура ТабличныйДокументРеквизитОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
// Отключаем стандартную реакцию платформы
СтандартнаяОбработка = Ложь;
// Проверяем тип данных, переданных в расшифровку ячейки
Если ТипЗнч(Расшифровка) = Тип("СписокЗначений") Тогда
Оповещение = Новый ОписаниеОповещения("ПослеВыбораДокументаИзСписка", ЭтотОбъект);
Элемент.ПоказатьВыборИзСписка(Оповещение, Расшифровка);
ИначеЕсли ЗначениеЗаполнено(Расшифровка) Тогда
// Если передан одиночный документ или ссылка
ПоказатьЗначение(, Расшифровка);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораДокументаИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент <> Неопределено Тогда
// Открываем форму выбранного документа
ПоказатьЗначение(, ВыбранныйЭлемент.Значение);
КонецЕсли;
КонецПроцедуры
Разберем несколько важных параметров, которые помогут сделать работу с табличным документом удобной и защищенной от ошибок:
ТолькоПросмотр = Истина. Если этого не сделать, при двойном клике по ячейке пользователь перейдет в режим редактирования текста вместо вызова расшифровки.Гиперссылка = Истина, событие ОбработкаРасшифровки сработает уже по первому клику мыши, а курсор автоматически примет форму указателя.ОбработкаРасшифровкиКомпоновкиДанных. Это позволяет сохранить стандартное меню компоновщика и встроить в него собственные действия.