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

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

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

Способ 1. Использование механизма вложенных схем

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

Рассмотрим по шагам настройку отчета через вложенные схемы:

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

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

Способ 2. Несколько независимых наборов данных в одной схеме

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

Разберем, как правильно организовать работу с несколькими несвязанными наборами:

  1. На вкладке Наборы данных добавим три отдельных набора данных типа «Запрос».
  2. Чтобы не запутаться в дереве доступных полей при дальнейшей настройке, дадим полям каждого запроса уникальные псевдонимы или префиксы (например, Осв1_Счет, Осв1_Сальдо, Осв2_Счет, Осв2_Сальдо). Это значительно упростит выбор полей в структуру.
  3. Вкладку Связи наборов данных оставляем полностью пустой.
  4. Переходим на вкладку Настройки. Важнейший нюанс: на самом верхнем уровне настроек (корень Отчет) на вкладке Выбранные поля удаляем автополе и оставляем список пустым. Если на уровне отчета будет выбрано общее поле из одного набора, а дочерняя группировка обратится к другому набору, компоновщик выдаст ошибку о невозможности связать поля.
  5. В структуру отчета на верхний уровень друг за другом добавляем три независимые таблицы или группировки. Внутри каждой конкретной таблицы отключаем автополя и вручную выбираем только те поля и ресурсы, которые принадлежат соответствующему набору данных.

Способ 3. Программный вывод нескольких отчетов в один табличный документ

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

Посмотрим на пример кода формирования отчетов в один ТабличныйДокумент:


// Очищаем результирующий документ перед формированием
Результат.Очистить();

МассивСхем = Новый Массив;
МассивСхем.Добавить(ПолучитьСхемуОтчета1());
МассивСхем.Добавить(ПолучитьСхемуОтчета2());
МассивСхем.Добавить(ПолучитьСхемуОтчета3());

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

Используя данный метод, мы можем формировать независимые компоновщики, передавать в каждый свои индивидуальные настройки и разделять вывод разделителями страниц или отступами.

Подводные камни и нюансы реализации

Проанализируем сложности, с которыми можно столкнуться при объединении отчетов:

  1. Пересечение имен параметров: если три набора данных находятся в одной схеме, одинаковые имена параметров в запросах (например, Период или Счет) объединяются в один общий параметр СКД. Если для разных таблиц требуются разные периоды или разные счета, параметрам в текстах запросов следует дать уникальные имена, например, &СчетОтчета1 и &СчетОтчета2.
  2. Сетка колонок табличного документа: при формировании отчетов в один табличный документ вертикально друг под другом верхняя таблица жестко задает ширину столбцов. Чтобы колонки нижних отчетов не деформировались, используйте собственные макеты областей либо настраивайте вывод во вложенные схемы.
  3. Ошибки декартова произведения: если в одной группировке случайно окажутся поля из разных несвязанных наборов данных, СКД попытается сопоставить записи каждой строки со всеми строками другой таблицы, что приведет к зависанию отчета или неверным суммам. Всегда строго изолируйте поля наборов внутри соответствующих ветвей структуры.
← На главную