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