СКД — наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты
Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.
- Описание
- Подробнее
Описание
Предыдущие статьи по СКД можно посмотреть по ссылкам ниже:
- Основные понятия и элементы схемы компоновки
- Настройки вариантов отчетов
- Работа с пользовательскими настройками
- Расширения языка запросов.
До сих пор, мы рассматривали схему компоновки с одним единственны набором данных «Запрос». Это самый распространенный вариант применения СКД. Однако, система позволяет создавать наборы данных других типов. А также создавать несколько наборов данных. Все эти действия выполняются на закладке «Наборы данных» конструктора схемы компоновки:

Оглавление
- Связь — объединение
- Связь — соединение
- Передача параметров в подчиненные наборы
- Дополнительные настройки связи наборов
- Некоторые особенности соединения наборов
- Автоматическое построение иерархии
- Пример создания собственной иерархии
- Проблема с иерархическим отбором в собственной иерархии
- Иерархия детальных записей
Рассмотрим, какие типы наборов данных можно создать в схеме компоновки данных:
- Набор данных запрос – произвольный запрос к базе данных (самый распространенный вариант),
- Набор данных объект – произвольный, внешний набор данных (например таблица значений),
- Набор данных объединение – объединение нескольких наборов данных в один результирующий.
Мы еще не рассматривали набор данных объект, по этому, остановимся на нем более подробно. Создавая набор данных этого типа, необходимо описать только выходные поля этого набора и его наименование:

Этого достаточно, чтобы указать все действия по дальнейшей обработке данных: расчет итогов, построение структуры отчета, настройка отборов, сортировки и прочие настройки.
Сам механизм для формирования данных необходимо описывать программно, и передавать процессору компоновки. Такие внешние данные могут быть следующих видов:
- Таблица значений,
- Выборка из результата запроса,
- Область ячеек табличного документа,
- Набор записей регистров,
- Любой объект конфигурации или его табличная часть.
Наиболее распространенный тип внешних данных – это таблица значений. Ниже пример программного кода для передачи внешних данных процессору компоновки:
ТЗ = новый ТаблицаЗначений;
…
ВнешниеНаборы = новый Структура;
ВнешниеНаборы.Вставить("ИмяНабораДанных", ТЗ);
ПроцессорКомпоновки = новый ПроцессорКомпоновкиДанных();
ПроцессорКомпановки.Инициализировать(МакетКомпоновки, ВнешниеНаборы); Имя набора данных должно соответствовать имени, заданному в схеме компоновки, а имена колонок таблицы значений – наименованиям полей в схеме.
Набор данного типа, по своей сути, не является набором как таковым. Он служит для объединения нескольких наборов данных любого типа в один, результирующий.
Может быть построена разветвленная структура объединений наборов данных. Отдельные наборы можно перетаскивать мышкой по структуре.
Существует ограничение: подчиненные наборы могут быть только у наборов данных объединение.
Также, следует обратить внимание, что набор реквизитов полей у подчиненных наборов данных ограничен:

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

Соединение двух наборов выполняется по аналогии с соединением таблиц в запросе. На закладке «Связи наборов данных», по аналогии с конструктором запросов можно выбрать наборы данных и поля наборов (выражения), по которым необходимо выполнить соединение.
Важно:
- Вид соединения по умолчанию всегда «ЛЕВОЕ ВНЕШНЕЕ». Источником связи выступает основной набор данных, приемником связи – подчиненный.
- Выполнять соединение можно только для наборов данных верхнего уровня. То-есть, наборы данных, которые входят в наборы «Объединения» соединять нельзя.
Передача параметров в подчиненные наборы
В подчиненный набор данных можно передать параметры, через поле выражения источника связи. Например, можно получать во втором наборе остатки по регистру накопления на каждую дату поля из первого набора:

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

На этой же закладке есть возможность установить флаг «Список параметров». В этом случае, алгоритм получения данных из подчиненного набора данных будет оптимизирован. Данные будут получены одним запросом.
Учитывая то, что параметр в этом случае — список, в условии запроса подчиненного набора необходимо указать конструкцию «В ()».
Дополнительные настройки связи наборов данных
Условие связи – поле, в котором можно задать произвольное выражение. Связь будет выполняться только в том случае, если значение выражения будет «Истина».
Начальное значение связи – используется для указания начального значения (корневого элемента), для связи набора данных с самим собой. Настройка может использоваться для создания собственной иерархии детальных записей.
Обязательная связь – если данный флаг отключен, связь будет добавлена в итоговый макет компоновки только в том случае, если в настройках компоновки используется поле из выражения источника связи.
Некоторые особенности соединения наборов данных
Группировка данных при объединении наборов
При соединении наборов данных, в каждом отдельном наборе может встречаться несколько строк с одним и тем же значением поля, по которому осуществляется связь. Несмотря на это, при расчете итогов всегда используется только одна запись каждого набора, и задвоения не происходит. Расчет итогов по группировкам получается корректный (в отличие от соединения нескольких таблиц в одном запросе).
Это основное преимущество использования соединения нескольких наборов данных.
