Часто при разработке отчетов возникает задача собрать данные из нескольких независимых источников или таблиц в одну общую структуру. Рассмотрим классическую ситуацию: у нас есть 4 разных запроса, никак не связанных между собой, но возвращающих одинаковый набор полей, например: Номенклатура, Статья затрат и Цена. Наша цель — вывести их данные друг за другом в одних и тех же колонках отчета. Разберем по шагам, как правильно реализовать это в Системе Компоновки Данных (СКД).
Задачу объединения данных можно решить двумя принципиально разными путями: на уровне СУБД (внутри одного запроса) и на уровне сервера 1С (средствами самой СКД). Проанализируем каждый из них подробно.
Если все необходимые таблицы находятся в одной информационной базе, наиболее производительным и оптимальным решением будет написание одного общего запроса с использованием конструкции ОБЪЕДИНИТЬ ВСЕ внутри единственного набора данных СКД.
В этом случае вся работа по слиянию выполняется на стороне сервера базы данных (СУБД). Это работает значительно быстрее и экономит оперативную память, так как сервер 1С получает уже готовую, собранную воедино сводную таблицу.
Посмотрим на пример того, как должен выглядеть текст такого запроса:
ВЫБРАТЬ
"Таблица 1" КАК ИмяТаблицы,
Таблица1.Номенклатура КАК Номенклатура,
Таблица1.СтатьяЗатрат КАК СтатьяЗатрат,
Таблица1.Цена КАК Цена
ИЗ
РегистрНакопления.Затраты1 КАК Таблица1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Таблица 2" КАК ИмяТаблицы,
Таблица2.Номенклатура,
Таблица2.СтатьяЗатрат,
Таблица2.Цена
ИЗ
РегистрНакопления.Затраты2 КАК Таблица2
Важные правила и ограничения при использовании этого метода:
ВЫБРАТЬ должны строго совпадать. Иначе запрос выдаст ошибку.ИмяТаблицы в примере выше).ИТОГИ. Все итоги рассчитываются движком компоновки данных динамически на основе настроек.АВТОУПОРЯДОЧИВАНИЕ в запросе игнорируется СКД — сортировку необходимо задавать исключительно на вкладке «Настройки».Второй способ заключается в использовании встроенного механизма самой СКД. Рассмотрим подробнее, как это настроить в конструкторе схемы компоновки данных:
Этот способ переносит процесс слияния данных на сервер приложений 1С. Платформа сначала выполнит каждый вложенный набор по отдельности, выгрузит результаты в оперативную память, а затем "склеит" их вместе. Для таблиц с сотнями тысяч строк это может привести к неоптимальному расходу ресурсов.
Когда без этого способа не обойтись?
Этот механизм незаменим, если данные поступают из принципиально разных источников. Например, часть данных вы получаете из базы 1С обычным запросом, а другую часть получаете по API или из внешней базы и передаете в СКД программно в виде таблицы значений (используя Набор данных - объект). Объединить их SQL-запросом невозможно, поэтому на помощь приходит объединение в СКД.
Особенности сопоставления полей в СКД:
В отличие от строгого ОБЪЕДИНИТЬ ВСЕ в запросе, механизм СКД гораздо гибче. Сопоставление колонок из разных наборов происходит исключительно по свойству Путь на вкладке полей. Порядок следования колонок в исходных запросах не имеет никакого значения. Если в одном из наборов какое-то поле отсутствует (например, в третьей таблице нет колонки Цена), система не выдаст ошибку, а просто выведет пустые значения (NULL) для строк этой таблицы.
Выясним важный нюанс: Набор данных - объединение работает по логике ОБЪЕДИНИТЬ ВСЕ, а не просто ОБЪЕДИНИТЬ. Механизм просто добавляет записи одного набора под записями другого. Он не занимается поиском и сворачиванием дублирующихся строк.
Если в результирующем отчете вам требуется свернуть одинаковые строки (например, просуммировать цены по совпадающим связкам Номенклатуры и Статьи затрат), не пытайтесь сделать это на уровне самих наборов данных. Решайте эту задачу на вкладке Настройки:
Цена, указав выражение агрегатной функции (например, Сумма(Цена)).Номенклатура и СтатьяЗатрат.После этого СКД автоматически свернет дублирующиеся строки и рассчитает итоги согласно вашим группировкам.