Как вывести несвязанные данные в один отчет СКД

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

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

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

Проанализируем самый простой и эффективный метод — создание нескольких наборов данных внутри одной схемы компоновки. Рассмотрим по шагам, как это настроить:

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

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

Способ 2. Вложенные схемы компоновки данных

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

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

Способ 3. Объединение запросов (UNION ALL)

Если по каким-то причинам нам необходимо работать в рамках одного набора данных, мы можем прибегнуть к объединению запросов на уровне SQL. Проанализируем пример кода для такого случая:


ВЫБРАТЬ
    "Зарплата" КАК ТипДанных,
    Сотрудник КАК Объект,
    Сумма КАК Значение
ИЗ
    РегистрНакопления.ЗарплатаКВыплате

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

ВЫБРАТЬ
    "Остатки",
    Номенклатура,
    Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки

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

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

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

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

Пример программного кода для вывода двух блоков:


// Первый блок
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки1, ДанныеРасшифровки);

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

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// Добавляем разделитель
ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();

// Второй блок (повторяем процесс с другими настройками)
// ...

Нюансы оформления и работы с макетами

При выводе несвязанных данных часто возникает проблема «расползания» колонок: ширина колонок первой таблицы влияет на ширину второй. Чтобы этого избежать, разберем несколько приемов:

Выясним ситуацию с использованием внешних данных. Если данные для одной из таблиц невозможно получить простым запросом (требуется сложный расчет в коде), используйте Внешние наборы данных. Вы подготавливаете ТаблицаЗначений в коде и передаете ее в процессор компоновки. В самой схеме СКД такой набор описывается как «Набор данных - объект».

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

← На главную