Часто в процессе разработки возникает задача оптимизации тяжелых отчетов. Один из способов ускорения — это получение данных из внешней базы (например, зеркальной или через HTTP-сервис) и формирование готового табличного документа. Однако возникает вопрос: как внедрить этот готовый документ в стандартный механизм СхемаКомпоновкиДанных (СКД)? Разберем подробно, как это сделать правильно, не нарушая работу платформы.
Многие разработчики пытаются вмешаться в работу ПроцессорКомпоновкиДанных, пытаясь «подсунуть» готовый документ на этапе инициализации процессора. Это приводит к ошибкам, так как объект ПроцессорКомпоновкиДанных предназначен исключительно для самостоятельного выполнения макета компоновки на основе данных, поступающих из наборов данных. Инициализация процессора требует корректной структуры, и попытка передать туда табличный документ как источник данных приведет к сбоям, таким как ошибки «даты сеанса» или «неверный формат параметров».
Если ваша задача — полностью заменить результат формирования отчета на заранее подготовленный ТабличныйДокумент, самым надежным способом будет перехват события ПриКомпоновкеРезультата в модуле отчета. В этом случае мы говорим платформе: «Не выполняй стандартную логику, я сделаю это сам».
Рассмотрим пошагово реализацию этого метода:
ПриКомпоновкеРезультата.СтандартнаяОбработка в значение Ложь. Это ключевой момент, отключающий стандартный процесс формирования СКД.ТабличныйДокумент (например, из HTTP-запроса).ДокументРезультат, который передается в процедуру как параметр.Пример реализации кода:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем стандартный алгоритм формирования
СтандартнаяОбработка = Ложь;
// Получаем наш готовый табличный документ из внешней базы
ТабличныйДокументРезультат = ПолучитьДанныеИзЗеркальнойБазы();
// Настраиваем вывод
ДокументРезультат.АвтоМасштаб = Истина;
ДокументРезультат.Вывести(ТабличныйДокументРезультат);
КонецПроцедуры
Если вам нужно не просто «показать картинку», а сохранить интерактивность СКД (возможность настройки отборов, группировок, использования расшифровок), то вместо полной подмены результата лучше использовать ВнешниеНаборыДанных. В этом сценарии СКД берет на себя всю работу по отрисовке данных, а вы лишь поставляете готовую структуру данных (таблицу значений), полученную из зеркальной базы.
Разберем процесс инициализации с использованием ВнешниеНаборыДанных:
// В процедуре ПриКомпоновкеРезультата
ВнешниеНаборыДанных = Новый Структура;
ТаблицаДанных = ПолучитьТаблицуИзВнешнегоИсточника();
ВнешниеНаборыДанных.Вставить("ИмяНабораДанныхВСхеме", ТаблицаДанных);
// Инициализируем процессор с нашими данными
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
Этот подход предпочтительнее, если вы хотите, чтобы пользователь мог динамически перестраивать отчет средствами самого КомпоновщикНастроек.
Подводя итог, можно выделить следующие важные моменты для успешной реализации:
СтандартнаяОбработка = Ложь. Если нужна интерактивность — используйте ВнешниеНаборыДанных.Корп-сервера для распределения нагрузки или использования фоновых заданий для формирования данных в зеркальной базе.Таким образом, мы выяснили, что «подсовывать» документ в ПроцессорКомпоновкиДанных нет необходимости — достаточно правильно управлять процессом вывода в модуле отчета или корректно передавать данные на этапе подготовки макета.