Как вывести группировки строк из макета в табличный документ 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Разработчики отчетов в системе «1С:Предприятие» часто сталкиваются с задачей построения иерархических таблиц. Настроив группировки строк непосредственно в макете конфигуратора, мы ожидаем, что при выводе документа на экран вся структура отобразится автоматически. Однако при программном выводе отдельных областей настроенные группы часто «теряются», а попытки настроить их вручную приводят к трудностям с позиционированием элементов управления («плюсиков») и выводом строк в середину готовой таблицы.

В этой статье мы подробно разберем, почему возникает эта проблема, рассмотрим штатные механизмы платформы для работы со структурой табличного документа и научимся правильно формировать иерархические отчеты без использования сомнительных «костылей».

Почему группировки пропадают при получении областей?

Проанализируем базовый механизм работы с макетом. Когда мы вызываем метод ПолучитьОбласть(), платформа 1С копирует из макета исключительно визуальные свойства ячеек: шрифты, цвета, границы, заливку и текстовые параметры. Однако **информация о группировках строк и колонок в отдельную область не переносится**.

Группировка — это свойство структуры всего табличного документа, а не конкретного диапазона ячеек. Поэтому простой вывод областей по очереди через метод Вывести() сбрасывает все иерархические настройки, выполненные в макете.

Чтобы сохранить структуру, нам нужно использовать специальные параметры вывода или специализированные методы управления группами. Ниже мы разберем несколько эффективных способов решения этой задачи.

Решение 1. Использование параметров метода Вывести() при автогруппировке

Самый простой и правильный способ перенести структуру в результирующий отчет — использовать перегруженный метод Вывести() внутри сессии автоматической группировки. Платформа 1С позволяет передавать в метод дополнительные параметры, отвечающие за вложенность строк.

Синтаксис метода выглядит следующим образом:

ТабДокумент.Вывести(Область, Уровень, ИмяГруппы, ОткрытаЛиГруппа);

Разберем назначение параметров:

Рассмотрим пример кода, реализующий этот подход:


ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаДанных");

// Включаем механизм автоматической группировки
ТабДокумент.НачатьАвтогруппировкуСтрок();

// Выводим родительскую строку (Уровень 1)
ТабДокумент.Вывести(ОбластьСтроки, 1, "ГруппаСтатья1", Ложь);

// Выводим подчиненную строку первого уровня (Уровень 2)
ТабДокумент.Вывести(ОбластьСтроки, 2, "ДеталиСтатьи1", Ложь);

// Выводим подчиненную строку второго уровня (Уровень 3)
ТабДокумент.Вывести(ОбластьСтроки, 3, "Субдетали", Ложь);

// Завершаем формирование структуры
ТабДокумент.ЗакончитьАвтогруппировкуСтрок();

ТабДокумент.Показать();

Этот способ позволяет гибко управлять структурой документа прямо в процессе обхода выборки данных или дерева значений.

Решение 2. Расположение маркеров сворачивания снизу («плюсики» снизу)

Часто разработчики жалуются, что при ручном формировании групп кнопки свертки и развертки строк («плюсики») отображаются некорректно — например, сверху над группой, тогда как по стандартам бухгалтерских отчетов итоговая строка и маркер управления должны находиться снизу.

За это поведение отвечают два простых свойства объекта ТабличныйДокумент, которые можно установить в коде инициализации отчета:

Посмотрим на пример применения этих свойств:


ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИтогиСнизу = Истина; // Маркеры строк будут снизу
ТабДокумент.ИтогиСправа = Истина; // Маркеры колонок будут справа

// Дальнейший вывод областей с группировкой...

Решение 3. Вывод областей в середину документа

Стандартный метод Вывести() всегда добавляет строки в самый конец табличного документа. Что делать, если по логике алгоритма нам необходимо динамически вставить новую область (например, детальные строки) в середину уже сформированной таблицы?

Для этих целей мы можем использовать метод ВставитьОбласть(). Он копирует указанную область макета и вставляет ее в заданные координаты табличного документа, автоматически сдвигая нижележащие строки вниз.

Рассмотрим, как это реализовать на практике:


// Получаем область, которую нужно вставить
ОбластьДляВставки = Макет.ПолучитьОбласть("ДетальныеСтроки");

// Определяем координату, куда будем вставлять (например, перед 5-й строкой)
ЦелевойАдрес = ТабДокумент.Область("R5");

// Вставляем область со сдвигом существующих строк по вертикали
ТабДокумент.ВставитьОбласть(ОбластьДляВставки, ЦелевойАдрес, ТипСмещенияТабличногоДокумента.ПоВертикали);

Если требуется просто раздвинуть таблицу и добавить пустые строки для последующего заполнения, воспользуемся методом ВставитьСтроки():


// Вставляем 3 пустые строки начиная с 10-й строки
ТабДокумент.ВставитьСтроки(10, 3);

Решение 4. Ручная группировка с явным указанием границ

Если структура вашего отчета сложная или выгружается из иерархического справочника, бывает удобнее отказаться от автоматического подсчета уровней и жестко разграничить начало и окончание каждой группы строк программно.

Для этого в 1С предусмотрена пара методов НачатьГруппуСтрок() и ЗакончитьГруппуСтрок().

Проанализируем следующий пример:


ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИтогиСнизу = Истина;

// Выводим шапку группы
ТабДокумент.Вывести(ОбластьШапкаГруппы);

// Открываем группу строк. Второй параметр указывает, свернута ли группа по умолчанию
ТабДокумент.НачатьГруппуСтрок("Уровень1", Ложь);

// Выводим внутреннее содержимое группы
Для Каждого СтрокаДанных Из СписокДанных Цикл
    ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

// Закрываем группу
ТабДокумент.ЗакончитьГруппуСтрок();

Использование этого подхода позволяет строить иерархию любой глубины вложенности, явно контролируя границы сворачивания в циклах обхода данных.

Решение 5. Автоматический отступ для визуальной иерархии

Для того чтобы отчет выглядел профессионально, подчиненные элементы должны быть визуально сдвинуты вправо относительно своих родителей. Вместо того чтобы вручную добавлять пробелы к строковым переменным в коде, мы можем задействовать встроенное свойство ячеек макета.

Выполним следующие шаги по настройке автоматического отступа:

  1. Откройте макет в конфигураторе и выберите ячейку, в которой будет выводиться наименование группировки.
  2. Откройте палитру свойств выбранной ячейки (клавиша F4).
  3. Найдите свойство АвтоОтступ (AutoIndent) и установите в нем числовое значение (оптимально использовать значение от 3 до 5).
  4. При выводе области через метод ТабДокумент.Вывести(Область, Уровень) платформа автоматически умножит величину автоотступа на текущий Уровень вложенности строки и сдвинет текст вправо.

Резюме

Мы детально изучили механизмы управления иерархией в табличном документе 1С. Использование «костылей» с предварительным созданием строк с запасом и их последующим удалением не только снижает производительность системы, но и делает код трудночитаемым. Использование штатных методов НачатьАвтогруппировкуСтрок(), управление свойством ИтогиСнизу и корректное применение параметров метода Вывести() позволяют создавать быстрые, красивые и легко поддерживаемые отчеты любой сложности.

← На главную