Пост

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

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

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

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

2️⃣ В событии ПриКомпоновкеРезультата() нам нужно: 2.1 Использовать программный вывод СКД
2.2 При инициализации ПроцессораКомпоновкиДанных использовать параметр ВозможностьИспользованияВнешнихФункций = Истина
2.3 (!) Перед выполнением компоновщика макета в настройки передать параметр “Объект” = ЭтотОбъект (т.е. объект отчета)
2.4 После формирования результата рекомендую очистить параметр в ДанныеРасшифровки.Настройки, чтобы не было попыток платформы сериализовать несериализуемое.

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

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

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

  1. В настройки СКД передаётся параметр “Объект” с объектом текущего отчета
  2. В вычисляемом поле вызывается метод отчета через “буферный” метод БСП. Если его нет, то тут уж нужно добавить свой расширением. К сожалению =(
  3. После формирования отчета, чтобы небыло несериализуемых значений, мы удаляем отчет из параметров настроек СКД.

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

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

Авторский пост защищен лицензией CC BY 4.0 .