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