Как сформировать две разные выборки данных в одном отчете СКД?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача: создать один файл отчета (.erf), который в зависимости от выбора пользователя (параметра или варианта) выводит совершенно разные наборы данных. Это избавляет от необходимости плодить множество похожих отчетов и упрощает поддержку кода. В данной статье мы разберем несколько способов реализации этой задачи: от простых настроек в конструкторе до программного управления схемой.

Способ 1. Использование нескольких группировок с отборами по параметру

Этот метод является наиболее простым и не требует написания сложного программного кода. Он основан на управлении видимостью элементов структуры отчета. Разберем этот процесс по шагам.

Во-первых, создадим в схеме компоновки данных два разных набора данных (например, НаборДанных1 и НаборДанных2). Каждый из них может содержать свой уникальный запрос к базе данных. Важно, чтобы идентификаторы наборов данных были уникальными.

Во-вторых, создадим параметр, например, РежимОтчета с типом Число или Строка (также можно использовать тип Булево, если выборок всего две). Добавим доступные значения: "Отчет 1" и "Отчет 2".

В-третьих, перейдем на закладку Настройки и выполним следующие действия:

  1. Добавим в корень отчета две независимые группировки (это могут быть детальные записи или группировки по полям).
  2. Для первой группировки в настройках (на нижней закладке "Отбор") установим условие: ПараметрыДанных.РежимОтчета Равно "Отчет 1".
  3. Для второй группировки установим аналогичный отбор: ПараметрыДанных.РежимОтчета Равно "Отчет 2".

Важный нюанс: при таком подходе СКД может попытаться выполнить оба запроса к базе данных, даже если одна из группировок не выводится. Чтобы оптимизировать производительность, рассмотрим более продвинутые методы.

Способ 2. Использование стандартных вариантов отчета

Если выборки должны существенно отличаться не только данными, но и внешним видом (колонками, оформлением), наиболее правильным с точки зрения платформы 1С будет использование механизма Вариантов отчета. Проанализируем, как это работает.

На закладке "Настройки" в конструкторе СКД сверху есть список вариантов. По умолчанию там один вариант "Основной". Мы можем создать дополнительные варианты: "Продажи по регионам" и "Остатки товаров". Для каждого варианта можно настроить свою структуру, выбрать свои поля и даже указать, какие наборы данных будут использоваться. Пользователь в пользовательском режиме просто нажимает кнопку "Выбрать вариант", и отчет перестраивается.

Способ 3. Программная подмена текста запроса

Иногда требуется более гибкое управление, например, если структура колонок одинаковая, но логика выборки в ГДЕ или СОЕДИНЕНИЕ кардинально меняется. В этом случае мы можем прибегнуть к программному изменению текста запроса в модуле отчета. Рассмотрим пример реализации в событии ПриКомпоновкеРезультата.

Разберем пример кода, который необходимо разместить в модуле отчета:


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

Этот метод позволяет полностью контролировать процесс формирования данных, подставляя нужные фрагменты SQL-кода "на лету".

Способ 4. Внешние наборы данных (Набор данных - объект)

Если логика формирования двух выборок настолько сложна, что её невозможно описать одним или двумя запросами (например, требуются сложные расчеты в переборе или обращение к внешним API), мы можем использовать Набор данных - объект. Выясним, в чем преимущество этого метода.

В схеме СКД создается набор данных типа "Объект", и ему присваивается имя, например, ТаблицаДанных. В коде 1С мы можем сформировать любую таблицу значений. В зависимости от параметра, эта таблица может иметь разный состав колонок и строк. Главное — передать эту таблицу в ПроцессорКомпоновкиДанных при выводе отчета.

Рассмотрим структуру передачи данных:


ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблицаДанных", МояСформированнаяТаблицаЗначений);

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

Используя этот подход, мы получаем неограниченную гибкость: в одну и ту же переменную ВнешниеНаборыДанных мы можем передать таблицу остатков, таблицу оборотов или вообще результат парсинга текстового файла, в зависимости от того, что выбрал пользователь.

Способ 5. Управление свойством "Использование" наборов данных

Для оптимизации работы отчета, содержащего множество наборов данных, полезно программно отключать те наборы, которые не требуются в данный момент. Проанализируем ситуацию: если у вас в схеме 10 наборов данных, а для текущего режима нужны только 2, система все равно может попытаться подготовить метаданные для всех.

Через объект СхемаКомпоновкиДанных мы можем обращаться к коллекции НаборыДанных и устанавливать свойство Использование в значение Ложь для тех веток запросов, которые не должны участвовать в текущем сеансе формирования. Это существенно экономит ресурсы сервера базы данных и ускоряет время отклика отчета.

Заключение

Мы рассмотрели пять различных подходов к формированию нескольких выборок в одном отчете СКД. Выбор конкретного метода зависит от сложности вашей задачи:

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

← На главную