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