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