Как подменить результат работы СКД готовым табличным документом?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто в процессе разработки возникает задача оптимизации тяжелых отчетов. Один из способов ускорения — это получение данных из внешней базы (например, зеркальной или через HTTP-сервис) и формирование готового табличного документа. Однако возникает вопрос: как внедрить этот готовый документ в стандартный механизм СхемаКомпоновкиДанных (СКД)? Разберем подробно, как это сделать правильно, не нарушая работу платформы.

Анализ проблемы: почему стандартный подход не всегда работает

Многие разработчики пытаются вмешаться в работу ПроцессорКомпоновкиДанных, пытаясь «подсунуть» готовый документ на этапе инициализации процессора. Это приводит к ошибкам, так как объект ПроцессорКомпоновкиДанных предназначен исключительно для самостоятельного выполнения макета компоновки на основе данных, поступающих из наборов данных. Инициализация процессора требует корректной структуры, и попытка передать туда табличный документ как источник данных приведет к сбоям, таким как ошибки «даты сеанса» или «неверный формат параметров».

Решение 1: Полная замена вывода через событие ПриКомпоновкеРезультата

Если ваша задача — полностью заменить результат формирования отчета на заранее подготовленный ТабличныйДокумент, самым надежным способом будет перехват события ПриКомпоновкеРезультата в модуле отчета. В этом случае мы говорим платформе: «Не выполняй стандартную логику, я сделаю это сам».

Рассмотрим пошагово реализацию этого метода:

  1. В модуле отчета находим процедуру ПриКомпоновкеРезультата.
  2. Устанавливаем параметр СтандартнаяОбработка в значение Ложь. Это ключевой момент, отключающий стандартный процесс формирования СКД.
  3. Получаем или формируем ваш ТабличныйДокумент (например, из HTTP-запроса).
  4. Выводим полученный документ в ДокументРезультат, который передается в процедуру как параметр.

Пример реализации кода:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отключаем стандартный алгоритм формирования
    СтандартнаяОбработка = Ложь;
    
    // Получаем наш готовый табличный документ из внешней базы
    ТабличныйДокументРезультат = ПолучитьДанныеИзЗеркальнойБазы();
    
    // Настраиваем вывод
    ДокументРезультат.АвтоМасштаб = Истина;
    ДокументРезультат.Вывести(ТабличныйДокументРезультат);
    
КонецПроцедуры

Решение 2: Использование внешних наборов данных

Если вам нужно не просто «показать картинку», а сохранить интерактивность СКД (возможность настройки отборов, группировок, использования расшифровок), то вместо полной подмены результата лучше использовать ВнешниеНаборыДанных. В этом сценарии СКД берет на себя всю работу по отрисовке данных, а вы лишь поставляете готовую структуру данных (таблицу значений), полученную из зеркальной базы.

Разберем процесс инициализации с использованием ВнешниеНаборыДанных:


// В процедуре ПриКомпоновкеРезультата
ВнешниеНаборыДанных = Новый Структура;
ТаблицаДанных = ПолучитьТаблицуИзВнешнегоИсточника();
ВнешниеНаборыДанных.Вставить("ИмяНабораДанныхВСхеме", ТаблицаДанных);

// Инициализируем процессор с нашими данными
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

Этот подход предпочтительнее, если вы хотите, чтобы пользователь мог динамически перестраивать отчет средствами самого КомпоновщикНастроек.

Выводы и советы

Подводя итог, можно выделить следующие важные моменты для успешной реализации:

Таким образом, мы выяснили, что «подсовывать» документ в ПроцессорКомпоновкиДанных нет необходимости — достаточно правильно управлять процессом вывода в модуле отчета или корректно передавать данные на этапе подготовки макета.

← На главную