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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

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

Задачу объединения данных можно решить двумя принципиально разными путями: на уровне СУБД (внутри одного запроса) и на уровне сервера 1С (средствами самой СКД). Проанализируем каждый из них подробно.

Способ 1: Объединение на уровне языка запросов

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

В этом случае вся работа по слиянию выполняется на стороне сервера базы данных (СУБД). Это работает значительно быстрее и экономит оперативную память, так как сервер 1С получает уже готовую, собранную воедино сводную таблицу.

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


ВЫБРАТЬ 
    "Таблица 1" КАК ИмяТаблицы, 
    Таблица1.Номенклатура КАК Номенклатура, 
    Таблица1.СтатьяЗатрат КАК СтатьяЗатрат, 
    Таблица1.Цена КАК Цена
ИЗ 
    РегистрНакопления.Затраты1 КАК Таблица1

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

ВЫБРАТЬ 
    "Таблица 2" КАК ИмяТаблицы, 
    Таблица2.Номенклатура, 
    Таблица2.СтатьяЗатрат, 
    Таблица2.Цена
ИЗ 
    РегистрНакопления.Затраты2 КАК Таблица2

Важные правила и ограничения при использовании этого метода:

  1. Количество полей, их типы и порядок следования в каждом блоке ВЫБРАТЬ должны строго совпадать. Иначе запрос выдаст ошибку.
  2. Чтобы визуально различать, из какой таблицы пришла та или иная строка, добавьте в выборку каждого блока искусственное поле (как ИмяТаблицы в примере выше).
  3. В текстах запросов СКД категорически запрещено использовать секцию ИТОГИ. Все итоги рассчитываются движком компоновки данных динамически на основе настроек.
  4. Предложение АВТОУПОРЯДОЧИВАНИЕ в запросе игнорируется СКД — сортировку необходимо задавать исключительно на вкладке «Настройки».

Способ 2: Использование "Набора данных - объединение"

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

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

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

Когда без этого способа не обойтись?

Этот механизм незаменим, если данные поступают из принципиально разных источников. Например, часть данных вы получаете из базы 1С обычным запросом, а другую часть получаете по API или из внешней базы и передаете в СКД программно в виде таблицы значений (используя Набор данных - объект). Объединить их SQL-запросом невозможно, поэтому на помощь приходит объединение в СКД.

Особенности сопоставления полей в СКД:

В отличие от строгого ОБЪЕДИНИТЬ ВСЕ в запросе, механизм СКД гораздо гибче. Сопоставление колонок из разных наборов происходит исключительно по свойству Путь на вкладке полей. Порядок следования колонок в исходных запросах не имеет никакого значения. Если в одном из наборов какое-то поле отсутствует (например, в третьей таблице нет колонки Цена), система не выдаст ошибку, а просто выведет пустые значения (NULL) для строк этой таблицы.

Работа с дублями записей и итогами

Выясним важный нюанс: Набор данных - объединение работает по логике ОБЪЕДИНИТЬ ВСЕ, а не просто ОБЪЕДИНИТЬ. Механизм просто добавляет записи одного набора под записями другого. Он не занимается поиском и сворачиванием дублирующихся строк.

Если в результирующем отчете вам требуется свернуть одинаковые строки (например, просуммировать цены по совпадающим связкам Номенклатуры и Статьи затрат), не пытайтесь сделать это на уровне самих наборов данных. Решайте эту задачу на вкладке Настройки:

  1. Перейдите на вкладку Ресурсы и добавьте поле Цена, указав выражение агрегатной функции (например, Сумма(Цена)).
  2. На вкладке Настройки задайте нужную структуру отчета — добавьте группировки по полям Номенклатура и СтатьяЗатрат.

После этого СКД автоматически свернет дублирующиеся строки и рассчитает итоги согласно вашим группировкам.

← На главную