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