К статье
Практический материал

Отчеты и Аналитика · 11 мин

Как объединить наборы данных в СКД 1С

Объединение и соединение наборов данных в СКД 1С: различия, настройка связей, примеры запросов, проверка результата и типичные ошибки разработчиков.

Система компоновки данных (СКД) в 1С позволяет строить отчёты на нескольких источниках одновременно: например, сопоставить план продаж с фактом, вывести остатки товаров вместе с ценами или собрать в один отчёт данные из разных регистров. Для этого в схеме компоновки предусмотрены два механизма — объединение наборов данных и их соединение через связи. Они решают разные задачи, и выбор неправильного механизма — самая частая причина «пустых» отчётов, задвоенных строк и ошибок компоновки.

Объединение складывает записи нескольких запросов в одну «высокую» таблицу: строки просто дописываются друг за другом. Соединение, наоборот, «сшивает» строки разных наборов по ключевым полям, как JOIN в обычном запросе. Понимание этой разницы — ключ к правильной структуре отчёта.

Ниже разобраны оба способа: когда какой применять, как настроить связи на закладке «Связи наборов данных», какие ограничения есть у каждого подхода и как проверить, что отчёт собрался корректно.

Какие типы наборов данных доступны в СКД

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

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

Объединение наборов: складываем строки в одну таблицу

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

Как создать объединение в конструкторе

Откройте схему компоновки данных, на закладке «Наборы данных» нажмите «Добавить» → «Добавить набор данных — объединение». Затем добавьте внутрь него дочерние наборы типа «Запрос» или «Объект». Каждый дочерний набор должен возвращать одинаковый состав полей: имена и типы колонок сопоставляются по имени.

Если в одном из запросов поля нет, его нужно «добавить» искусственно — например, ВЫБРАТЬ NULL КАК СтавкаНДС или привести константу нужного типа. Иначе компоновщик либо выдаст ошибку, либо поле будет пустым там, где вы ожидали данные. Порядок полей в запросах значения не имеет — важны имена.

Порядок создания объединения
  1. 1
    Добавьте набор данных типа «Объединение» в схему компоновки
  2. 2
    Добавьте внутрь два или более дочерних набора с запросами
  3. 3
    Выровняйте состав полей: одинаковые имена и типы во всех запросах, недостающие поля объявите через NULL или константу
  4. 4
    На закладке «Настройки» сформируйте структуру отчёта и проверьте результат на тестовых данных

Обратите внимание: объединение в СКД работает как UNION ALL — дубликаты строк не удаляются. Если нужна уникальность, устраняйте дубли в текстах запросов (СГРУППИРОВАТЬ, РАЗЛИЧНЫЕ) или агрегируйте данные ресурсами и группировками в настройках отчёта.

Соединение наборов: связи по ключевым полям

Соединение нужно, когда наборы содержат разные сущности, связанные по ключу: номенклатура и её остатки, контрагенты и их задолженность, сотрудники и начисления. Здесь строки не складываются, а дополняют друг друга колонками — как LEFT JOIN в запросе.

Добавьте в схему два независимых набора типа «Запрос» (на одном уровне, не вложенных друг в друга). Затем перейдите на закладку «Связи наборов данных» и создайте связь: укажите источник (ведущий набор), приёмник (подчинённый набор), выражение-источник и выражение-приёмник — поля, по которым сопоставляются строки.

Параметры связи, которые влияют на результат

У связи есть несколько важных свойств. «Тип связи» по умолчанию — внутренняя: в отчёт попадут только строки, для которых нашлась пара в обоих наборах. Если нужно видеть все строки ведущего набора независимо от наличия данных в подчинённом, включите флажок «Необязательная связь» — это аналог левого соединения.

Параметр «Условие связи» позволяет добавить дополнительное ограничение (например, по виду цены), а «Параметр» — передать значение из настроек. Если ключ составной, создайте несколько связей между одними и теми же наборами — по каждому полю ключа.

Объединение или соединение: как выбрать

Критерий выбора простой: посмотрите, что должно произойти со строками. Если строки разных источников — это однотипные записи, которые нужно вывести вместе (план из одного регистра, факт из другого, но в отчёте они идут отдельными строками или складываются) — это объединение. Если одна и та же логическая строка собирается из кусков разных наборов (контрагент плюс его долг) — это соединение.

Сравнение подходов

Объединение наборов

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

Соединение через связи

Строки сшиваются горизонтально по ключу. Подходит для сопоставления разных сущностей. Требует корректных ключей и настройки типа связи.

Один запрос с JOIN/UNION

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

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

Проверка результата и типичные ошибки

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

Контрольные точки

Как проверить результат

Количество строк отчёта
Норма

Совпадает с ожидаемым: сумма строк наборов при объединении или число строк ведущего набора при соединении

Тревожный признак

Строк меньше, чем в источнике, или они задвоены

Итоги по суммовым полям
Норма

Итоги сходятся с данными регистров при ручной сверке

Тревожный признак

Суммы завышены кратно — признак декартова произведения из-за ошибочной связи

Пустые колонки
Норма

Поля заполнены во всех наборах объединения

Тревожный признак

Колонка пуста в части строк — поле отсутствует в одном из запросов

Задвоение строк при соединении — признак того, что ключ связи не уникален в подчинённом наборе. Например, вы связали продажи с ценами по номенклатуре, а в наборе цен по каждому товару несколько строк (разные типы цен). Решение: свернуть подчинённый набор группировкой до уровня ключа связи или добавить условие связи, сужающее выборку до одной строки.

Типичные ошибки
01
Разный состав полей в наборах объединения — поле молча остаётся пустым в части строк или схема не проходит проверку
02
Внутренняя связь вместо необязательной — из отчёта пропадают строки без пары в подчинённом наборе
03
Связь по неуникальному ключу — строки дублируются, итоги завышаются кратно количеству совпадений
04
Несовпадение типов полей связи (например, строка разной длины или ссылка разных составных типов) — связь не срабатывает, данные не подтягиваются
05
Несколько наборов там, где хватило бы одного запроса — лишняя сложность схемы и потеря производительности

Ограничения и особенности, о которых нужно помнить

Вычисляемые поля и ресурсы в схеме с несколькими наборами должны опираться на поля, доступные после объединения или соединения. Если ресурс ссылается на поле, которого нет в итоговом составе, компоновщик выдаст ошибку ещё на этапе формирования отчёта. Проверяйте закладку «Ресурсы» после любого изменения состава наборов.

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

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

FAQ: частые вопросы об объединении наборов в СКД

Можно ли объединить больше двух наборов данных?

Да. В набор типа «Объединение» можно добавить любое количество дочерних наборов, а соединения через связи допускают цепочки из нескольких наборов. Ограничение практическое: с ростом числа наборов усложняется отладка и падает производительность, поэтому при пяти и более источниках стоит пересмотреть архитектуру отчёта.

Почему в объединении часть колонок пустая?

Потому что в одном из дочерних запросов это поле не выбирается. Состав полей объединения определяется совокупностью полей всех наборов, и отсутствующие в конкретном запросе поля заполняются пустыми значениями. Добавьте в запрос недостающее поле явно — через NULL или константу подходящего типа.

Как соединить наборы по нескольким полям?

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

Можно ли объединить запрос с таблицей значений из кода?

Да. Добавьте в объединение набор типа «Запрос» и набор типа «Объект», а таблицу значений передайте через программное формирование отчёта — в объектную модель компоновки как внешний источник данных. Состав полей обоих наборов должен совпадать по именам.

Чем связь наборов отличается от соединения в тексте запроса?

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

Почему после добавления второго набора отчёт стал формироваться дольше?

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

Итог

Что важно запомнить

Объединение складывает однородные строки в одну таблицу и требует одинакового состава полей; соединение сшивает разные сущности по ключу через закладку «Связи наборов данных». Проверяйте тип связи (внутренняя или необязательная), уникальность ключа и совпадение типов полей. Если оба источника — таблицы базы, предпочтительнее один запрос: это проще и быстрее.