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