Как настроить расшифровку в СКД, если ссылка отображается как обычный текст

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартного оформления не хватает и приходится прибегать к использованию собственных макетов. Однако здесь кроется ловушка: как только мы создаем макет для ячейки, автоматические механизмы расшифровки могут перестать работать, и вместо полноценной ссылки на документ или справочник пользователь видит обычную строку. В этой статье мы подробно разберем, почему это происходит и как вернуть ссылкам их функциональность.

Причина проблемы: почему ссылка «ломается» в макете

В стандартном режиме работы СКД (без использования макетов) система самостоятельно определяет, что в поле находится ссылка, и при выводе в ТабличныйДокумент заполняет специальные свойства ячейки, отвечающие за расшифровку. Когда же мы создаем свой макет, мы берем управление выводом на себя. Если в ячейке макета просто указан Параметр, СКД выводит в него текстовое представление объекта, игнорируя саму ссылку для расшифровки. Проанализируем способы, которые позволяют восстановить это поведение.

Способ 1: Настройка параметра расшифровки в макете

Это основной способ, если вам жизненно необходим именно собственный макет. Рассмотрим пошагово, как правильно связать ячейку макета с данными расшифровки:

  1. Откроем схему компоновки данных и перейдем на закладку Макеты.
  2. Выделим ячейку, в которой должен отображаться текст (например, «Содержание»), но при клике на которую должен открываться документ.
  3. В палитре свойств этой ячейки найдем поле Параметр расшифровки. Впишем туда произвольное имя, например, ДокСсылка.
  4. Обратите внимание: свойство Заполнение у этой ячейки должно стоять в значении Параметр или Текст (в зависимости от того, что вы выводите визуально), но само поле Параметр расшифровки — это отдельная сущность.
  5. После ввода имени параметра в нижней части окна (в таблице параметров макета) появится новая строка с именем ДокСсылка.
  6. В колонке Выражение для этого параметра нужно указать поле из вашего набора данных, которое содержит реальную ссылку. Например, Ссылка или ДокументРаботы.
  7. Теперь самое важное для удобства пользователя: в колонке Основное действие выберем Открыть значение. Это позволит открывать форму документа сразу по клику, не заставляя пользователя выбирать действие из стандартного списка расшифровки.

Рассмотрим ситуацию, когда нам нужно программно подготовить данные для такой расшифровки в самом запросе или в вычисляемых полях. Убедимся, что поле ссылки присутствует в выборке, иначе параметру макета просто нечего будет подставить.

Способ 2: Использование «Выражения представления» (без макета)

Часто программисты создают макеты только ради того, чтобы изменить текст ссылки (например, вместо номера и даты документа вывести его содержание). Однако СКД позволяет сделать это гораздо элегантнее без использования тяжеловесных макетов. Разберем этот алгоритм:

  1. Перейдем на закладку Наборы данных в СКД.
  2. Найдем наше поле ссылки (например, Работы).
  3. В колонке Выражение представления напишем имя того поля, которое мы хотим видеть в отчете. Например: Содержание или "Работа: " + Содержание.
  4. При таком подходе в ячейку отчета визуально попадет текст из поля Содержание, но системно в ней останется объект ссылки.
  5. Расшифровка при этом будет работать «из коробки» — стандартно и без дополнительных настроек.

Этот метод предпочтительнее, так как он сохраняет гибкость настроек СКД (например, возможность группировки или условного оформления), которые при использовании жестких макетов могут работать некорректно.

Способ 3: Программная обработка расшифровки в управляемых формах

Если логика расшифровки сложная (например, нужно открыть не сам документ, а какую-то связанную обработку), нам придется вмешаться в работу управляемой формы. Посмотрим, как выглядит программный код для перехвата клика по ячейке.

Для начала, в модуле формы отчета нам необходимо обработать событие РезультатОбработкаРасшифровки. Проанализируем пример кода:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартное меню
    
    // Получаем данные расшифровки из хранилища
    Данные = ПолучитьДанныеРасшифровки(Расшифровка);
    
    // Если в расшифровке лежит ссылка на наш документ
    Если ТипЗнч(Данные) = Тип("ДокументСсылка.Работы") Тогда
        ПоказатьЗначение(, Данные);
    КонецЕсли;

КонецПроцедуры

В данном примере функция ПолучитьДанныеРасшифровки должна быть реализована на сервере, так как объект ДанныеРасшифровкиКомпоновкиДанных недоступен на клиенте напрямую. Рассмотрим серверную часть:


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

Важные нюансы и типичные ошибки

Проанализируем еще несколько моментов, которые могут помешать корректной работе расшифровки:

Таким образом, мы выяснили, что основная «засада» при работе с макетами СКД заключается в необходимости ручной связки визуального представления и программного идентификатора расшифровки. Используя приведенные выше инструкции, вы сможете создавать профессиональные отчеты с удобной навигацией для пользователей.

← На главную