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

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

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

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

Решение 1: Программное переключение между несколькими схемами компоновки данных

Этот метод является одним из самых гибких и мощных. Он идеально подходит, когда у вас есть два или более совершенно разных отчета с разными запросами, параметрами и структурой, и вы хотите предоставить пользователю возможность выбирать, какой из них формировать. Суть подхода заключается в том, что мы создаем один объект отчета, но добавляем в него несколько макетов с типом Схема компоновки данных.

Разберем по шагам, как это реализовать:

  1. Создайте макеты. В конфигураторе для вашего отчета создайте несколько макетов. Каждому макету присвойте тип "Схема компоновки данных" и дайте понятные имена, например, "СхемаПродажи" и "СхемаОстатки".
  2. Не указывайте основную схему. В свойствах самого объекта отчета поле "Основная схема компоновки данных" оставьте пустым. Мы будем определять ее программно.
  3. Добавьте элемент управления на форму. На форме отчета разместите элемент, с помощью которого пользователь будет выбирать нужный вариант. Это может быть переключатель, поле со списком выбора или просто две кнопки.
  4. Напишите код переключения. В модуле формы отчета, в обработчике события выбора или нажатия на кнопку, нам нужно программно подменить текущую схему компоновки и ее настройки.

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


// Процедура на сервере, вызываемая при изменении флажка

&НаСервере
Процедура ПереключитьСхемуОтчета()

    // Сохраняем настройки текущего варианта, чтобы не потерять их
    // Здесь может быть ваша логика сохранения настроек для каждого варианта
    // Например, в какую-то переменную формы или структуру
    
    // Определяем, какую схему загружать
    Если ИспользоватьДругойОтчет Тогда
        ИмяМакета = "СхемаОстатки";
    Иначе
        ИмяМакета = "СхемаПродажи";
    КонецЕсли;

    // Получаем новую схему из макета
    НоваяСхема = Отчет.ПолучитьМакет(ИмяМакета);

    // Устанавливаем новую схему в компоновщик макета
    КомпоновщикМакета.Инициализировать(НоваяСхема);
    
    // Загружаем в компоновщик настроек настройки по умолчанию из новой схемы
    // В реальной задаче здесь также будет логика загрузки ранее сохраненных пользовательских настроек
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(НоваяСхема.НастройкиПоУмолчанию);

КонецПроцедуры

Важный момент: при переключении не забывайте сохранять и восстанавливать пользовательские настройки (отборы, параметры) для каждого из вариантов отчета, чтобы пользователь не терял их при переключении туда-обратно. Этот подход дает полный контроль над процессом и позволяет реализовать очень сложную логику в рамках одной формы.

Решение 2: Объединение данных на уровне запроса

Этот способ отлично подходит, когда структура ваших отчетов схожа, и вы хотите видеть данные в одной таблице. Например, вывести продажи и возвраты за период. Основной инструмент здесь — оператор ОБЪЕДИНИТЬ ВСЕ в запросе СКД.

Проанализируем ситуацию:

  1. Создайте единый набор данных. В схеме компоновки данных создайте один набор данных типа "Запрос".
  2. Напишите составной запрос. Внутри этого запроса напишите два или более подзапроса, объединив их результаты с помощью ОБЪЕДИНИТЬ ВСЕ.
  3. Добавьте поле-идентификатор. Это ключевой шаг. Чтобы в дальнейшем можно было различать данные (где продажи, а где возвраты), добавьте в каждый подзапрос статическое поле. Например, "Продажа" КАК ТипДвижения в первом запросе и "Возврат" КАК ТипДвижения во втором.
  4. Настройте структуру отчета. В настройках отчета вы можете использовать поле ТипДвижения для группировки, отбора или условного оформления, чтобы визуально разделить данные.

Посмотрим на пример такого запроса:


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК Количество,
    ПродажиОбороты.СтоимостьОборот КАК Сумма,
    "Продажа" КАК ТипОперации
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК ПродажиОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВозвратыОбороты.Номенклатура,
    ВозвратыОбороты.КоличествоОборот,
    ВозвратыОбороты.СтоимостьОборот,
    "Возврат" КАК ТипОперации
ИЗ
    РегистрНакопления.ВозвратыОтКлиентов.Обороты(&НачалоПериода, &КонецПериода) КАК ВозвратыОбороты

Этот метод прост и эффективен, но требует, чтобы количество и типы полей в объединяемых запросах совпадали.

Решение 3: Последовательный вывод через настройку структуры отчета

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

Разберем по шагам:

  1. Подготовьте наборы данных. В одной схеме компоновки данных создайте два независимых набора данных-запроса: один для продаж, другой для остатков.
  2. Настройте структуру. Перейдите на вкладку "Настройки" в СКД. Удалите все существующие группировки.
  3. Добавьте две таблицы. На верхний уровень структуры отчета добавьте два элемента типа "Таблица".
  4. Настройте каждую таблицу. Для первой таблицы укажите, что она должна использовать данные из первого набора (например, "Продажи"), и настройте для нее свои группировки строк, колонок и выбранные поля. Затем то же самое сделайте для второй таблицы, указав для нее второй набор данных ("Остатки") и свои настройки.

В результате при формировании отчета СКД сначала полностью построит и выведет первую таблицу на основе первого набора данных, а затем сразу под ней построит и выведет вторую. Этот способ очень удобен для создания комплексных, "многослойных" отчетов.

Решение 4: Использование вариантов отчета

Этот метод стоит упомянуть, хотя он решает немного другую задачу. Варианты отчета предназначены для сохранения различных настроек (отборов, группировок, сортировок, условного оформления) для одной и той же схемы компоновки данных.

Этот способ подойдет, если ваши "два отчета" — это на самом деле два разных взгляда на одни и те же данные. Например, отчет по продажам можно представить в виде простого списка, а можно — в виде кросс-таблицы "Менеджеры по строкам, Товары по колонкам". Вы можете настроить эти два вида, сохранить их как два разных варианта и позволить пользователю легко переключаться между ними. Однако этот метод не поможет, если источники данных или их структура кардинально различаются.

← К списку