Как открыть ссылку на номенклатуру (или любой другой объект) в программно сформированном отчете СКД?

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

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

1. Инициализация и передача объекта ДанныеРасшифровкиКомпоновкиДанных

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


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

    // *** Важный шаг: Создаем объект для хранения данных расшифровки ***
    ДанныеРасшифровки              = Новый ДанныеРасшифровкиКомпоновкиДанных; 

    КомпоновщикМакета              = Новый КомпоновщикМакетаКомпоновкиДанных;
    // *** Передаем ДанныеРасшифровки в КомпоновщикМакета.Выполнить() ***
    Макет                          = КомпоновщикМакета.Выполнить(СхемаСКД, КомпоновщикНастроекДанныхОбработки.ПолучитьНастройки(), ДанныеРасшифровки);

    ПроцессорКомпоновки            = Новый ПроцессорКомпоновкиДанных;
    // *** Передаем ДанныеРасшифровки в ПроцессорКомпоновки.Инициализировать() ***
    ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);

    ПроцессорВывода                = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДок);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    // *** Сохраняем ДанныеРасшифровки во временном хранилище (см. следующий шаг) ***
    АдресХранилищаДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры

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

2. Сохранение адреса ДанныхРасшифровки во временном хранилище

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

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

  2. Помещение данных во временное хранилище: После того как отчет сформирован, поместите объект ДанныеРасшифровки во временное хранилище, а его адрес сохраните в созданном реквизите формы. Это мы уже включили в предыдущий пример кода:

    
    // ... (в конце процедуры СформироватьПервыйМакетСКДНаСервере)
    АдресХранилищаДанныхРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровки, ЭтаФорма.УникальныйИдентификатор);
    

    Обратите внимание, что ЭтаФорма.УникальныйИдентификатор используется как владелец хранилища, что может быть полезно для управления жизненным циклом данных.

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

3. Реализация обработчика события ОбработкаРасшифровки

Финальный и самый интерактивный шаг – это создание обработчика события, который будет реагировать на клик пользователя по ячейке отчета.

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

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

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

    Здесь мы устанавливаем СтандартнаяОбработка = Ложь, чтобы предотвратить стандартное поведение платформы и полностью контролировать процесс. Затем мы вызываем серверную функцию ПолучитьРасшифровкуНаСервере, передавая ей идентификатор расшифровки (Расшифровка), который платформа предоставила при клике.

  3. Реализация серверной функции для получения данных: Серверная функция отвечает за извлечение сохраненных данных расшифровки и их анализ.

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

    В этой функции мы:

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

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

Дополнительные рекомендации и тонкости

Мы проанализировали основной механизм, но есть несколько дополнительных моментов, которые помогут вам сделать расшифровку еще более гибкой и надежной.

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

  2. Множественные поля расшифровки: В некоторых случаях вы можете захотеть, чтобы при клике на ячейку пользователю предлагался выбор из нескольких действий (например, "Открыть карточку", "Отфильтровать по значению", "Сформировать другой отчет"). Это можно реализовать, возвращая из серверной функции не одно поле, а массив или список полей, и затем на клиенте формировать контекстное меню или форму выбора для пользователя.

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

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

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

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

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

← К списку