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