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