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