В процессе разработки отчетов на системе компоновки данных (СКД) часто возникают ситуации, когда стандартные настройки отчетов требуют серьезной кастомизации. Одной из таких задач является вставка макета в макет. Рассмотрим случай, когда вы добавляете параметр в область шапки отчета, но обнаруживаете, что эта шапка начинает выводиться для каждой строки данных, превращая отчет в нечитаемый список.
Первым делом выясним причину такого поведения движка СКД. Когда в настройках макета отчета мы привязываем область к определенным элементам структуры, СКД пытается «натянуть» этот макет на результат вывода. Если в настройках отчета ваша «Шапка» по ошибке попала в структуру детальных записей или оказалась ниже уровня, который повторяется для каждой строки результата, система будет исполнять ваш макет столько раз, сколько записей найдено в выборке.
Основная ошибка заключается в неверном сопоставлении областей макета и элементов дерева настроек. СКД воспринимает области не просто как графические элементы, а как логические блоки, привязанные к структуре данных.
Для исправления ситуации выполним следующие шаги, чтобы заставить систему выводить шапку только один раз в самом начале отчета:
Заголовок отчета, так как именно этот тип предназначен для однократного вывода в начале формирования отчета.Заголовок отчета не подходит из-за специфики структуры данных, попробуйте сделать шапку отдельной группировкой. Для этого создайте группировку без иерархии (по детализации), и в настройках оформления макета укажите, что именно этот элемент структуры должен использовать вашу область «Шапка».Когда мы добавляем параметр в макет, важно понимать, как 1С передает данные в ячейку. Простого размещения параметра в ячейке макета недостаточно. Рассмотрим, как правильно связать параметр:
Если вы хотите, чтобы параметр, который берется из выборки (например, Ответственный), выводился в шапке, вам следует:
Если вы столкнулись с тем, что шапка все равно дублируется, переведите шапку в формат группировки. Рассмотрим этот процесс подробнее:
Вместо того чтобы полагаться на детальные записи, которые размножают макет, создайте группировку по полю, которое является уникальным или общим для всего отчета (например, по ответственному). Таким образом, система применит макет заголовка группировки только тогда, когда начинается эта группировка.
Посмотрим на пример логики компоновки:
// В коде при необходимости можно программно передать параметр
// если стандартного механизма настроек не хватает:
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Ответственный", ВыбранныйОтветственный);
Однако помните, что в большинстве случаев правки в коде не требуются. Всё можно реализовать через грамотную настройку иерархии в дереве Настройки СКД. Если вы видите, что макет выводится не там, где нужно, попробуйте перетащить соответствующий элемент в дереве настроек выше по иерархии. Самый высокий уровень (корень дерева) гарантирует, что макет, привязанный к нему, будет выведен ровно один раз.
Итак, чтобы решить задачу дублирования шапки, мы проанализировали структуру макета и настройки СКД. Основной совет: избегайте использования Детальных записей для оформления шапок отчета. Применяйте типы макетов Заголовок отчета или группировки верхнего уровня. Это позволит системе правильно интерпретировать структуру вашего отчета и выводить заголовки строго по регламенту, а не для каждой строки данных.