Вступление
Я больше 20 лет в бизнесе, однако СКД всё ещё регулярно заставляет меня попотеть. Почему-то она до сих пор выглядит контринтуитивно.
Как обычно решается вопрос расшифровки отчета на СКД? Если расшифровка уже содержится в наборе данных, то можно просто добавить группировку нижнего уровня (Детальные записи) и снять с неё галку, обычно этого хватает.
Как решается вопрос со сколько-нибудь нестандартной расшифровкой? Если в компании отсутствует институт код-ревью, то происходит нечто странное, начиная с копирования общей формы ФормаОтчета (хотя производитель старался добавить туда инструменты на все случаи жизни), копирования самого отчета и так далее.
Тут я предлагаю совсем простой костыль метод с заполнением макета поля.
Сценарий
Буду описывать сразу свой демонстрационный пример. В моем примере используется расширение, но также отчет можно вставить в конфигурацию или открыть из файла. Во всех случаях нужна доработка ОтчетыКлиентПереопределяемый.ОбработкаРасшифровки()
1. Пользователь нажимает на поле `Партнер` в основном отчете.
2. В расшифровку поля заранее записываются служебные данные: какое поле нажали и какой отчет открывать.
3. Расширение перехватывает `ОбработкаРасшифровки`.
4. Открывается форма отчета в режиме расшифровки.
5. Перед загрузкой настроек в компоновщик подключается другой макет СКД.
6. Параметры из расшифровки автоматически попадают в новую схему.
Реализация
1. Описываем расшифровку в основной СКД
В основную схему отчета добавляем макет поля, которое хотим расшифровывать. Здесь Расшифровка - это параметр расшифровки из ячейки табличного документа. В него добавляем все необходимые отборы (например, параметры данных и поля текущей группировки), а также служебные поля, у меня это ОтчетДляРасшифровки и ПолеРасшифровки. Это просто обычные строковые поля, редактор почему-то не дает написать имя поля вручную, поэтому добавляем любое поле и меняем ему имя:

Именно эта структура потом подсказывает обработке расшифровки, что открывать и какие параметры передавать.
2. В ОбработкаРасшифровки() открываем новый (или этот же) отчет
У меня расширение, в основной конфигурации просто дописываем в конец. Лучше конечно это всё сложить в свою процедуру в отдельном модуле.
&После("ОбработкаРасшифровки")
Процедура КАЕ_ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка)
Если СтандартнаяОбработка = Ложь Тогда
Возврат;
КонецЕсли;
СтруктураРасшифровки = ОтчетыУТВызовСервераПереопределяемый.СформироватьДанныеРасшифровки(Расшифровка, ФормаОтчета.ОтчетДанныеРасшифровки);
Если Не СтруктураРасшифровки.Свойство("ПолеРасшифровки") Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
НастройкиКомпоновки = Новый НастройкиКомпоновкиДанных;
НастройкиКомпоновки.ДополнительныеСвойства.Вставить("СтруктураРасшифровки", СтруктураРасшифровки);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Расшифровка", Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ФормаОтчета.ОтчетДанныеРасшифровки, Расшифровка, НастройкиКомпоновки));
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.МойОтчет.Форма", ПараметрыФормы, ФормаОтчета);
КонецПроцедуры
Здесь важен не сам вызов ОткрытьФорму, а передача СтруктураРасшифровки через дополнительные свойства.
3. Разрешаем форме отчета подменить схему
В модуле менеджера включаем поддержку настройки формы:
Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт
НастройкиОтчета.ОпределитьНастройкиФормы = Истина;
КонецПроцедуры
А в модуле объекта подменяем схему до компоновки:
// для внешних отчетов эта процедура нужна всегда, чтобы отладчик не сыпал ошибки
// в нашем случае она нужна для того, чтобы переопределить схему компоновки данных
// если это сделать в ПриКомпоновкеРезультата(), то "открыть" можно будет только поля
// названия которых уже были в оригинальной схеме
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
КонецПроцедуры
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
// если нам передали форму, и это расшифровка отчета, то наше поле расшифровки лежит тут:
// Контекст.Параметры.Расшифровка.ПрименяемыеНастройки.ДополнительныеСвойства.СтруктураРасшифровки
Если ТипЗнч(Контекст) = Тип("ФормаКлиентскогоПриложения") Тогда
СтруктураРасшифровки = Неопределено;
Попытка
Если Контекст.Параметры.Расшифровка <> Неопределено
И Контекст.Параметры.Расшифровка.ПрименяемыеНастройки.ДополнительныеСвойства.Свойство("СтруктураРасшифровки", СтруктураРасшифровки) Тогда
Схема = МакетРасшифровкиПоПолю(СтруктураРасшифровки.ПолеРасшифровки);
ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, Схема, КлючСхемы);
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
КонецПроцедур
В этот момент отчет остается тем же объектом метаданных, но формируется уже по другому макету СКД.
4. Заполняем параметры новой схемы
После подмены схемы остается перенести значения из структуры расшифровки в параметры СКД:
Для Каждого Параметр Из КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы Цикл
Параметр.Использование = Истина;
ЗначениеПараметра = Неопределено;
Если СтруктураРасшифровки.Свойство(Строка(Параметр.Параметр), ЗначениеПараметра) Тогда
Параметр.Значение = ЗначениеПараметра;
КонецЕсли;
КонецЦикла;
В демонстрации это дает простой эффект: клик по партнеру в сводном отчете открывает отдельную СКД с договорами именно этого партнера.
Что в итоге
Пользуясь точками расширения, которые нам любезно предоставляет БСП, открываем для расшифровки вообще совершенно другой отчет, с новыми источниками данных, вообще никак не связанный с предыдущим, не лезем в закрытый код, не плодим отчеты в дереве метаданных, не меняем поведение системы на неожиданное.
Важное уточнение
Обработчики в отчете отрабатывают (видимо, для удобства программиста) по-разному в зависимости от того, где лежит отчет: в файле, в основной конфигурации или в расширении.
В расширении и конфигурации будут вызваны функции конфигурации из модуля менеджера отчета, причем в расширении для этого нужно включить отчет в подсистему ПодключаемыеОтчетыИОбработки, а в основной конфигурации - добавить свой отчет в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(), во внешнем же отчете всё работает и так. Я для расширения считаю вариант ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов() более надежным.
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.12.195
Вступайте в нашу телеграмм-группу Инфостарт