При разработке отчетов на системе компоновки данных (СКД) часто возникает задача вывести данные в виде иерархического списка: сначала идет шапка документа (номер, дата, контрагент), а непосредственно под ней — строки его табличной части (номенклатура, количество, цена, сумма). Если ограничиться простым добавлением детальных записей, платформа выведет плоскую таблицу, где реквизиты шапки будут монотонно повторяться в каждой строке. Разберем по шагам, как правильно настроить структуру отчета и параметры компоновки для получения аккуратного и читаемого результата.
Основная ошибка начинающих разработчиков заключается в попытке вывести все поля на одном уровне — только в ветке Детальные записи. Чтобы получить иерархический вид, необходимо выстроить правильную структуру группировок на вкладке «Настройки» схемы компоновки данных.
Рассмотрим порядок создания правильной структуры:
Ссылка или Документ). Поле заголовка можно оставить пустым или задать понятное наименование.Теперь разделим состав выводимых колонок. Для верхнего уровня (группировка Документ) на вкладке «Выбранные поля» снимем флаг автопозиционирования и укажем реквизиты шапки: дату, номер, контрагента, организацию. Для подчиненной ветки Детальные записи в выбранных полях укажем реквизиты табличной части: номенклатуру, характеристику, количество, цену и сумму.
После создания структуры платформа может отображать поля шапки в виде отдельных колонок, сильно растягивая таблицу в ширину. Проанализируем параметры, которые помогут сделать отчет компактным.
На вкладке «Другие настройки» (для группировки документа или для всего отчета в целом) отрегулируем следующие свойства:
Также полезно использовать объединение полей. В списке выбранных полей группировки шапки выделим несколько реквизитов (например, номер и дату), нажмем правую кнопку мыши и выберем «Сгруппировать поля». Выбрав тип группы «Вместе» или «Вертикально», мы можем расположить реквизиты компактно в рамках одной общей ячейки.
Когда в одном запросе СКД соединяются таблица шапки документа и его табличная часть, данные шапки дублируются по количеству строк. Если реквизит шапки (например, СуммаДокумента) объявлен ресурсом, обычная агрегатная функция Сумма(СуммаДокумента) вернет некорректный общий итог, завышенный в несколько раз.
Выясним причину и настроим формулу расчета. На вкладке «Ресурсы» для поля шапки укажем точный расчет по уровням иерархии:
// В поле "Рассчитывать по..." указываем уровень группировки Документ:
Максимум(СуммаДокумента)
Для поля детальных записей (например, СуммаСтроки) оставляем стандартное суммирование по всем группировкам:
Сумма(СуммаСтроки)
Такой подход гарантирует, что при расчете общих итогов по отчету сумма документа будет учтена строго один раз, а по детальным записям сойдется математическая сумма всех позиций номенклатуры.
Если в одном отчете под документом требуется вывести две несвязанные между собой табличные части (например, «Товары» и «Услуги»), соединять их в тексте запроса через оператор ЛЕВОЕ СОЕДИНЕНИЕ нельзя — это приведет к декартовому произведению строк. Посмотрим на правильное решение через структуру СКД:
ОБЪЕДИНИТЬ ВСЕ с признаком типа строки.Документ создаем две параллельные подчиненные группировки Детальные записи (одну под другой).В результате каждый документ будет выводиться последовательными блоками: сначала шапка, затем блок строк с товарами, а следом — блок строк с услугами.
Если стандартных настроек выравнивания колонок недостаточно и требуется получить жесткую печатную форму (например, бланк накладной или заказа), применим механизм макетов СКД:
Документ и тип макета — «Заголовок».<НомерДокумента> и <ДатаДокумента>.Детальные записи с типом «Строка», где зададим сетку таблицы с номенклатурой и ценами.Использование макетов группировок позволяет полностью разделить сетку колонок реквизитов документа и колонок табличной части, избавив отчет от пустых и смещенных ячеек.