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