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