При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача: создать один файл отчета (.erf), который в зависимости от выбора пользователя (параметра или варианта) выводит совершенно разные наборы данных. Это избавляет от необходимости плодить множество похожих отчетов и упрощает поддержку кода. В данной статье мы разберем несколько способов реализации этой задачи: от простых настроек в конструкторе до программного управления схемой.
Этот метод является наиболее простым и не требует написания сложного программного кода. Он основан на управлении видимостью элементов структуры отчета. Разберем этот процесс по шагам.
Во-первых, создадим в схеме компоновки данных два разных набора данных (например, НаборДанных1 и НаборДанных2). Каждый из них может содержать свой уникальный запрос к базе данных. Важно, чтобы идентификаторы наборов данных были уникальными.
Во-вторых, создадим параметр, например, РежимОтчета с типом Число или Строка (также можно использовать тип Булево, если выборок всего две). Добавим доступные значения: "Отчет 1" и "Отчет 2".
В-третьих, перейдем на закладку Настройки и выполним следующие действия:
ПараметрыДанных.РежимОтчета Равно "Отчет 1".ПараметрыДанных.РежимОтчета Равно "Отчет 2".Важный нюанс: при таком подходе СКД может попытаться выполнить оба запроса к базе данных, даже если одна из группировок не выводится. Чтобы оптимизировать производительность, рассмотрим более продвинутые методы.
Если выборки должны существенно отличаться не только данными, но и внешним видом (колонками, оформлением), наиболее правильным с точки зрения платформы 1С будет использование механизма Вариантов отчета. Проанализируем, как это работает.
На закладке "Настройки" в конструкторе СКД сверху есть список вариантов. По умолчанию там один вариант "Основной". Мы можем создать дополнительные варианты: "Продажи по регионам" и "Остатки товаров". Для каждого варианта можно настроить свою структуру, выбрать свои поля и даже указать, какие наборы данных будут использоваться. Пользователь в пользовательском режиме просто нажимает кнопку "Выбрать вариант", и отчет перестраивается.
Иногда требуется более гибкое управление, например, если структура колонок одинаковая, но логика выборки в ГДЕ или СОЕДИНЕНИЕ кардинально меняется. В этом случае мы можем прибегнуть к программному изменению текста запроса в модуле отчета. Рассмотрим пример реализации в событии ПриКомпоновкеРезультата.
Разберем пример кода, который необходимо разместить в модуле отчета:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем текст запроса в зависимости от параметра
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("РежимОтчета"));
Схема = ПолучитьМакет(); // Получаем текущую схему компоновки
НаборДанных = Схема.НаборыДанных.Найти("НаборДанных1");
Если ЗначениеПараметра <> Неопределено И ЗначениеПараметра.Значение = "Режим1" Тогда
НаборДанных.Запрос = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура";
Иначе
НаборДанных.Запрос = "ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты";
КонецЕсли;
// Далее выполняем стандартный вывод с измененной схемой
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Этот метод позволяет полностью контролировать процесс формирования данных, подставляя нужные фрагменты SQL-кода "на лету".
Если логика формирования двух выборок настолько сложна, что её невозможно описать одним или двумя запросами (например, требуются сложные расчеты в переборе или обращение к внешним API), мы можем использовать Набор данных - объект. Выясним, в чем преимущество этого метода.
В схеме СКД создается набор данных типа "Объект", и ему присваивается имя, например, ТаблицаДанных. В коде 1С мы можем сформировать любую таблицу значений. В зависимости от параметра, эта таблица может иметь разный состав колонок и строк. Главное — передать эту таблицу в ПроцессорКомпоновкиДанных при выводе отчета.
Рассмотрим структуру передачи данных:
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаДанных", МояСформированнаяТаблицаЗначений);
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
Используя этот подход, мы получаем неограниченную гибкость: в одну и ту же переменную ВнешниеНаборыДанных мы можем передать таблицу остатков, таблицу оборотов или вообще результат парсинга текстового файла, в зависимости от того, что выбрал пользователь.
Для оптимизации работы отчета, содержащего множество наборов данных, полезно программно отключать те наборы, которые не требуются в данный момент. Проанализируем ситуацию: если у вас в схеме 10 наборов данных, а для текущего режима нужны только 2, система все равно может попытаться подготовить метаданные для всех.
Через объект СхемаКомпоновкиДанных мы можем обращаться к коллекции НаборыДанных и устанавливать свойство Использование в значение Ложь для тех веток запросов, которые не должны участвовать в текущем сеансе формирования. Это существенно экономит ресурсы сервера базы данных и ускоряет время отклика отчета.
Мы рассмотрели пять различных подходов к формированию нескольких выборок в одном отчете СКД. Выбор конкретного метода зависит от сложности вашей задачи:
Запрос.Комбинируя эти методы, вы сможете создавать мощные и универсальные инструменты аналитики, сохраняя при этом архитектуру вашей конфигурации чистой и понятной.