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