Как настроить расшифровку ссылочных полей в отчете на СКД с собственным макетом?

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

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

Понимание работы расшифровки в СКД

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

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

Однако, когда вы начинаете использовать собственный макет, вы берете на себя полную ответственность за то, как данные будут отображаться и как будет работать интерактивность. Если в макете для ячейки, где должно выводиться ссылочное поле, указать только параметр, который выводит представление объекта (например, Представление(Подразделение)), то для системы это будет обычная строка. Платформа теряет информацию о том, что за этой строкой стоит полноценный объект-ссылка, и, как следствие, функциональность расшифровки перестает работать. Именно эта ситуация описывается в сообщении 0 – "Все поля стали чисто строками а не ссылками на элементы справочника и провалиться в них не даёт".

Пошаговая настройка расшифровки в пользовательском макете СКД

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

  1. Откройте макет компоновки данных и выберите нужную ячейку.

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

  2. Установите свойство Заполнение ячейки.

    В палитре свойств выбранной ячейки найдите свойство Заполнение. Убедитесь, что оно установлено в значение Параметр. Это означает, что содержимое ячейки будет определяться параметром макета.

  3. Укажите свойство Параметр для отображения значения.

    В свойстве Параметр укажите имя параметра макета, который будет отвечать за вывод текста в ячейке. Например, это может быть ПодразделениеПредставление. Теперь перейдем в закладку "Параметры" внизу окна макета. Создайте параметр с этим именем (ПодразделениеПредставление). В поле "Выражение" для этого параметра вы можете указать Представление(Подразделение) или просто Подразделение, если вам подходит стандартное строковое представление объекта. Важно понимать, что этот параметр отвечает только за то, что будет отображено в ячейке.

  4. Ключевой шаг: Укажите свойство Параметр расшифровки для обеспечения перехода по ссылке.

    Это самый важный шаг для восстановления функциональности расшифровки. Для той же ячейки, которую мы настраивали, найдите в палитре свойств свойство Параметр расшифровки. Здесь вам нужно указать имя параметра макета, который будет содержать саму ссылку на объект, а не его представление.

    Распространенная ошибка: Как мы видим из форума (сообщение 14), часто разработчики пытаются использовать для расшифровки какие-то агрегатные поля или поля, которые содержат уже обработанные данные, например, РасшифровкаПодразделения или то же самое Представление(Подразделение). Это не сработает, потому что для системы это будет просто строковое значение или некий внутренний идентификатор, по которому невозможно открыть форму объекта.

    Правильное решение: В качестве значения свойства Параметр расшифровки укажите имя параметра макета, который будет получать непосредственно ссылочный тип данных. Например, вы можете назвать этот параметр РасшифровкаПодразделения (хотя имя не принципиально, главное – его содержание). Теперь перейдите в закладку "Параметры" внизу окна макета и создайте параметр с этим именем (РасшифровкаПодразделения). В поле "Выражение" для этого параметра необходимо указать само поле-ссылку из вашего набора данных. Например:

    
    Подразделение
    

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

  5. Настройка основного действия расшифровки (необязательно, но полезно).

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

Помните, что "Значение" в свойствах ячейки, о котором упоминалось в сообщении 14, действительно предназначено только для простых типов данных (строки, числа, даты) и не используется для передачи ссылок для расшифровки в макетах СКД.

Дополнительные возможности и сценарии расшифровки

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

Различные типы расшифровки: СКД предоставляет несколько стандартных действий расшифровки, которые можно использовать в зависимости от задачи:

Вы можете выбрать нужное действие в свойстве "Основное действие" параметра расшифровки или же позволить пользователю выбирать его самостоятельно, если не задаете основное действие.

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

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

  1. Использование реквизита ДанныеРасшифровки и обработчика ОбработкаРасшифровки:

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

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

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

    
    // Пример программной компоновки с ДаннымиРасшифровки
    Процедура СформироватьОтчетПрограммно()
    
        СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
        // Создаем объект ДанныеРасшифровкиКомпоновкиДанных
        ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    
        Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
        // Можно скопировать пользовательские настройки: Настройки = КомпоновщикНастроек.Настройки;
    
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки); // Передаем ДанныеРасшифровки
    
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ТабДок = Новый ТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ТабДок);
    
        ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
    
        // Теперь ТабДок содержит информацию для расшифровки
        // и его можно передать на клиент или сохранить
        // ТабДок.Показать();
    
    КонецПроцедуры
    

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

← На главную