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

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

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

Постановка задачи и анализ ситуации

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

Для решения этой задачи в платформе 1С:Предприятие 8 предусмотрено два основных механизма: автоматическая группировка и ручная группировка. Выясним разницу между ними и разберем по шагам реализацию каждого метода.

Метод 1: Автоматическая группировка строк

Этот метод наиболее удобен, если иерархия вашего отчета строится последовательно. Основная идея заключается в использовании метода Вывести(), в который передается номер уровня группировки. Проанализируем правильную последовательность действий.

  1. Сначала необходимо вызвать метод НачатьАвтоГруппировкуСтрок(). Это подготавливает табличный документ к расчету уровней вложенности.
  2. При выводе каждой области методом Вывести() вторым параметром мы указываем целое число — уровень (начиная с 1).
  3. После завершения цикла вывода данных вызываем ЗакончитьАвтоГруппировкуСтрок().
  4. Важнейший этап для управляемых форм — установка свойств отображения. Без ОтображатьГруппировки = Истина кнопки «+» и «-» просто не появятся.

Посмотрим на пример кода, который успешно решает задачу:


// Подготовка документа
ТабДокумент.Очистить();
ТабДокумент.НачатьАвтоГруппировкуСтрок();

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

// Завершение формирования
ТабДокумент.ЗакончитьАвтоГруппировкуСтрок();
ТабДокумент.ОтображатьЗаголовки = Истина;
ТабДокумент.ОтображатьГруппировки = Истина;
// Сворачиваем все группы до самого верхнего уровня
ТабДокумент.ПоказатьУровеньГруппировокСтрок(0);

Метод 2: Ручная группировка строк

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

Проанализируем пример реализации:


Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("СтрТЧ");

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

Для Инд = 0 По 99 Цикл
    ОбластьСтрока.Параметры.Стр = Строка(Инд);
    ТабДок.Вывести(ОбластьСтрока); 
КонецЦикла;

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

Важно помнить: метод НачатьГруппуСтрок() создает группу для всех строк, которые будут выведены в ТабличныйДокумент до вызова ЗакончитьГруппуСтрок(). Это позволяет логически разделять блоки отчета.

Нюансы работы на управляемых формах

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

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

2. Свойства отображения в метаданных. Проверьте свойства реквизита формы. Иногда настройки отображения сеток, заголовков и группировок, установленные в конфигураторе, перекрывают программные настройки. Рекомендуется дублировать установку ОтображатьГруппировки = Истина в коде после формирования отчета.

3. Использование «ПоказатьУровеньГруппировокСтрок». Вызов этого метода обязателен в самом конце формирования, если вы хотите, чтобы отчет открылся в «свернутом» виде. Параметр 0 соответствует самому верхнему уровню (все свернуто), 1 — раскрыт первый уровень и так далее.

Дополнительные возможности для профессиональной разработки

Рассмотрим несколько продвинутых приемов, которые сделают ваш отчет более удобным для пользователя:

Расположение итогов: По умолчанию значки «+» находятся сверху. Если в вашем отчете итоги по группе выводятся снизу (под детальными записями), установите свойство ТабДокумент.ИтогиСверху = Ложь;. Это перенесет элементы управления вниз, что более привычно для бухгалтерских отчетов.

Группировка колонок: Всё вышесказанное справедливо и для горизонтальных группировок. Используйте методы НачатьАвтоГруппировкуКолонок() или НачатьГруппуКолонок() совместно с методом Присоединить(). Это полезно для отчетов с динамическим количеством периодов (например, помесячный план-факт).

Ограничение вложенности: Помните, что платформа 1С поддерживает максимум 8 уровней группировки (индексы от 0 до 7). Попытка вывести 9-й уровень может привести к ошибке или некорректному отображению структуры.

Важность сортировки: Для корректной работы НачатьАвтоГруппировкуСтрок данные в вашем источнике (Таблице значений или Результате запроса) должны быть строго отсортированы. Если вы сначала выведете Группу А, затем Группу Б, а потом снова строку, относящуюся к Группе А, автогруппировка создаст две разные (разорванные) группы для А, что визуально запутает пользователя.

Резюме

Для создания качественного отчета вручную нам необходимо:

  1. Подготовить данные, отсортировав их по иерархии.
  2. Использовать НачатьАвтоГруппировкуСтрок() для автоматического расчета уровней.
  3. В методе Вывести() указывать корректный числовой индекс уровня вложенности.
  4. Обязательно включить ОтображатьГруппировки и настроить ИтогиСверху в зависимости от структуры макета.
  5. Применить ПоказатьУровеньГруппировокСтрок() в финале для управления начальным состоянием отчета.

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

← На главную