Как в вычисляемых полях СКД вызвать метод самого отчета (даже внешнего)? .



Костыль, насколько я понимаю, древний, но не все о нём знают.



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

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

Для таких случаев и понадобится наш костыль 👀



1️⃣ В СКД добавить специальный параметр без типа и с ограничением от пользователя. Пусть он будет называться "Объект"



2️⃣ В событии ПриКомпоновкеРезультата() нам нужно:

2.1 Использовать программный вывод СКД

2.2 При инициализации ПроцессораКомпоновкиДанных использовать параметр ВозможностьИспользованияВнешнихФункций = Истина

2.3 (!) Перед выполнением компоновщика макета в настройки передать параметр "Объект" = ЭтотОбъект (т.е. объект отчета)

2.4 После формирования результата рекомендую очистить параметр в ДанныеРасшифровки.Настройки, чтобы не было попыток платформы сериализовать несериализуемое.



3️⃣ В самой СКД в вычисляемых полях появится доступность использовать параметр &Объект, который будет содержать объект текущего отчета. К сожалению, СКД не даёт возможности выполнить метод отчета напрямую, поэтому нам всё равно понадобится метод общего модуля конфигурации. Но в БСП для этого есть подходящие. Например:



ОбщегоНазначения.ВызватьФункциюОбъекта(&Объект, "МойМетод", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(КакоетоПоле))





😳 Как это всё работает?

1. В настройки СКД передаётся параметр "Объект" с объектом текущего отчета

2. В вычисляемом поле вызывается метод отчета через "буферный" метод БСП. Если его нет, то тут уж нужно добавить свой расширением. К сожалению =(

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



Всегда ли это работает?

🤷‍♂️ Не знаю. Штука древняя, но на уровне смекалки =)



Есть способ лучше?

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



Пример отчета в комментариях 👇

@JuniorOneS