Разработка отчетов на базе Системы компоновки данных (СКД) в 1С — задача чрезвычайно гибкая, однако стандартные механизмы вывода иногда ставят разработчика в тупик. Типичный пример — избыточная вложенность шапки отчета. Когда мы создаем иерархию группировок по типу «матрешки» (одна группировка вложена в другую), СКД по умолчанию формирует ступенчатую или многоуровневую шапку. Выглядит это громоздко, а заказчик часто требует лаконичную, «плоскую» таблицу, похожую на Excel.
Первое решение, которое приходит в голову многим разработчикам — это создание фиксированного макета оформления шапки на соответствующей вкладке СКД. Однако у этого подхода есть огромный недостаток: макет жестко фиксирует колонки. Если в процессе работы пользователь решит отключить какой-то ресурс (например, убрать колонку «Стоимость заказано»), структура отчета сломается, появятся пустые области или шапка перестанет соответствовать выводимым данным. Мы теряем главное преимущество СКД — динамичность.
В этой статье мы подробно разберем несколько профессиональных способов решения этой проблемы, которые позволят свернуть шапку группировки, сохранив при этом полную динамику отчета при изменении состава полей пользователем.
Проанализируем классическую ошибку проектирования структуры отчета. Часто разработчики создают несколько вложенных друг в друга группировок только для того, чтобы вывести детальные поля рядом друг с другом. Например:
КонтрагентДоговорДокументРегистраторТакая структура неизбежно порождает трехэтажную шапку. Но что если нам не требуется подводить промежуточные итоги по каждому договору и документу в виде отдельных строк, а нужно просто вывести их в одной строке таблицы? Решение очень простое: объединить эти поля в рамках одной группировки.
Рассмотрим по шагам, как настроить такую группировку:
Контрагент, Договор, ДокументРегистратор.Выясним, что произошло в результате. СКД сформирует одну плоскую строку группировки. В шапке отчета вместо трех уровней появится один лаконичный ряд заголовков. При этом, если пользователь решит отключить вывод какого-либо ресурса в выбранных полях, колонка просто исчезнет из отчета без нарушения общей структуры таблицы.
Иногда объединить поля в одну группировку невозможно по технологическим причинам (например, требуются промежуточные итоги по иерархии), но заголовки некоторых группировок все равно нужно скрыть. В сообществе разработчиков 1С этот прием известен как «Трюк №3».
Идея заключается в том, чтобы переопределить макет заголовка группировки, сделав его пустым. СКД «подумает», что макет задан, и выведет пустую область нулевой высоты, полностью скрыв заголовок.
Разберем по шагам реализацию этого приема:
Невидимка.Заголовок.Невидимка (точно так же, как назвали макет).Проанализируем результат: при формировании отчета СКД сопоставит группировку по имени с пустым макетом заголовка. В результате заголовок этой группировки (и всех вложенных в нее) исчезнет, а сами данные и динамические ресурсы продолжат выводиться корректно.
Часто задача свернуть шапку возникает, когда у нас есть несколько числовых показателей (ресурсов), относящихся к одной смысловой группе. Например, ресурсы «Стоимость заказано» и «Стоимость оплачено» мы хотим визуально объединить под общим заголовком «Стоимость». Чтобы не рисовать жесткий макет, воспользуемся стандартным функционалом выбранных полей.
Рассмотрим алгоритм настройки:
Стоимость).Горизонтально. Это заставит подчиненные ресурсы выстраиваться в строку под общей шапкой.Стоимость заказано и Стоимость оплачено внутрь созданной группы.Посмотрим, как это работает на практике. СКД автоматически сгенерирует красивую двухэтажную шапку: сверху будет одна общая ячейка «Стоимость», растянутая на две колонки, а под ней — «Заказано» и «Оплачено». Если пользователь в настройках отчета отключит флажок у поля «Стоимость заказано», общая ячейка «Стоимость» автоматически сожмется до размеров одной оставшейся колонки. Никакой жесткой фиксации, стопроцентная динамика!
Иногда избавиться от «лестничной» структуры шапки и строк помогает правильное перераспределение стандартных настроек компоновки. Обратите внимание на вкладку «Другие настройки» на уровне отчета или конкретной группировки. Здесь есть два критически важных параметра:
Вместе. Если изменить его на Отдельно, система перестанет пытаться компоновать иерархию в одну сложную структуру и выведет каждую группировку в своей строго обособленной колонке, что сделает таблицу более «плоской» и читаемой.Вместе с владельцем объединит эти данные в одной колонке через запятую, что моментально разгрузит шапку отчета.Если требования к дизайну шапки настолько специфичны, что стандартные методы СКД не справляются, а макеты использовать нельзя из-за динамики колонок, мы можем прибегнуть к программному выводу отчета в модуле объекта с последующим объединением ячеек.
Выясним, как это реализовать. В модуле отчета мы переопределяем событие ПриКомпоновкеРезультата, отключаем стандартный вывод и управляем процессом вручную. После того как табличный документ сформирован, мы обходим строки шапки программно и объединяем нужные ячейки.
Посмотрим на пример шаблона кода в модуле отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Инициализируем схему и настройки
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Компонуем результат
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Начинаем постобработку шапки табличного документа
// Выясним границы шапки. Допустим, шапка занимает первые 4 строки
Для СтрокаШапки = 1 По 4 Цикл
Для Колонка = 1 По ДокументРезультат.ШиринаТаблицы - 1 Цикл
ЯчейкаТекущая = ДокументРезультат.Область(СтрокаШапки, Колонка);
ЯчейкаСоседняя = ДокументРезультат.Область(СтрокаШапки, Колонка + 1);
// Если заголовки соседних ячеек совпадают, объединяем их
Если ЗначениеЗаполнено(ЯчейкаТекущая.Текст) И (ЯчейкаТекущая.Текст = ЯчейкаСоседняя.Текст) Тогда
Попытка
ОбластьОбъединения = ДокументРезультат.Область(СтрокаШапки, Колонка, СтрокаШапки, Колонка + 1);
ОбластьОбъединения.Объединить();
Исключение
// Обработка возможных пересечений областей
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Рассмотрим подробнее работу данного алгоритма. Программа выводит результат компоновки в обычном динамическом режиме, учитывая все пользовательские настройки и галочки. После вывода запускается цикл, который анализирует заголовки колонок в шапке. Если он находит одинаковые названия по соседству, он динамически их объединяет с помощью метода Объединить(). Таким образом, даже если пользователь отключит часть полей, алгоритм корректно обработает только фактически выведенные ячейки, не нарушая верстку документа.
Мы проанализировали пять различных подходов к управлению отображением шапки отчета в СКД без жесткой привязки к фиксированным макетам табличного документа. Выбор конкретного метода зависит от структуры ваших данных:
ПриКомпоновкеРезультата (Способ 5).