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