Как реализовать расшифровку в отчете СКД с открытием другого варианта отчета в управляемых формах

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

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

Постановка задачи и выбор события

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

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

Шаг 1. Перехват события расшифровки

Для начала нам нужно запретить системе выполнять стандартные действия (открытие меню выбора полей) и объявить собственные правила. Разберем код обработчика на форме отчета:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    // Останавливаем стандартный механизм 1С
    СтандартнаяОбработка = Ложь;
    
    // Передаем управление серверному методу для анализа данных
    ВыполнитьСвоюРасшифровку(Расшифровка);
    
КонецПроцедуры

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

Шаг 2. Получение данных из текущей ячейки

Рассмотрим подробнее, как программно «вытащить» значения из кликнутой ячейки. Это критически важно, так как мы хотим передать эти значения в качестве отборов в новый вариант отчета. Проанализируем серверную процедуру:


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

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

Шаг 3. Подготовка параметров для открытия нового варианта

Выясним, какие параметры необходимы для того, чтобы форма отчета открылась сразу с нужным нам вариантом и применила фильтры. Основным ключом здесь является КлючВарианта. Однако, просто открыть вариант недостаточно — нужно передать туда параметры (например, Период) и отборы.

Разберем структуру параметров формы:

  1. КлючВарианта — строковое имя варианта, заданное в схеме СКД.
  2. ПользовательскиеНастройки — это самый надежный способ передать фильтры в управляемых формах. Если использовать просто структуру Отбор, система может проигнорировать её, если эти поля вынесены в пользовательские настройки в самой схеме.
  3. СформироватьПриОткрытии — логическое значение Истина, которое заставляет отчет сформироваться мгновенно, избавляя пользователя от лишнего клика.
  4. КлючНазначенияИспользования — полезный параметр, позволяющий системе запомнить размер и положение окна именно для этого сценария расшифровки.

Шаг 4. Итоговая реализация открытия формы

Соберем все знания воедино и посмотрим на пример кода, который открывает форму внешнего отчета с новым вариантом:


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

Особенности работы с внешними отчетами

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

Рекомендации по улучшению UX

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

Таким образом, мы рассмотрели полный цикл реализации программной расшифровки. Главное — правильно перехватить событие, извлечь данные из объекта ДанныеРасшифровкиКомпоновкиДанных и передать их через параметры КлючВарианта и ПользовательскиеНастройки при открытии новой формы.

← На главную