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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке печатных форм часто возникает задача вывести данные не простым списком, а сгруппированными по определенному признаку. Например, вывести заказы, сгруппированные по участкам производства или категориям товаров. Для этого в платформе 1С:Предприятие используется механизм запросов с директивой ИТОГИ и специальный метод обхода результата. Рассмотрим подробно, как избежать типичных ошибок при реализации такой задачи.

Разбор архитектуры запроса с итогами

Для начала проанализируем структуру запроса. Чтобы получить иерархическую выборку, в тексте запроса обязательно должна присутствовать секция ИТОГИ. В примере автора используется группировка по полю Участок. Рассмотрим правильную структуру такого запроса:


"ВЫБРАТЬ
|   ЗаказКлиента.Номенклатура КАК Номенклатура,
|   ЗаказКлиента.Количество КАК Количество,
|   ЗаказКлиента.Номенклатура.Артикул КАК Артикул,
|   НоменклатураДополнительныеРеквизиты.Значение КАК Участок
|ИЗ
|   Документ.ЗаказКлиента.Товары КАК ЗаказКлиента
|   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|   ПО ЗаказКлиента.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка
|ГДЕ
|   ЗаказКлиента.Ссылка = &Ссылка
|   И ЗаказКлиента.ВариантОбеспечения = &ВариантОбеспечения
|ИТОГИ
|   СУММА(Количество)
|ПО
|   Участок";

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

Организация иерархического обхода (циклы в цикле)

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

  1. Выполняем запрос и получаем результат.
  2. Создаем первую выборку с параметром ОбходРезультатаЗапроса.ПоГруппировкам. Это позволит нам перемещаться по "Участкам".
  3. Внутри цикла по "Участкам" создаем вторую выборку, вызывая метод Выбрать() от текущей группировки.

Посмотрим на пример правильного кода:


РезультатЗапроса = Запрос.Выполнить();
// Выборка первого уровня (Группировка "Участок")
ВыборкаУчасток = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

Методы управления визуальной группировкой

Чтобы в табличном документе появились кнопки "+" и "-" для сворачивания групп, недостаточно просто вывести области. Выясним причину, почему группировка может не отображаться визуально:

Во-первых, при использовании метода Вывести() можно передавать второй параметр — Уровень. В нашем примере для строк товаров мы указали уровень 1, а для заголовка участка по умолчанию уровень 0. Это создает иерархическую структуру внутри документа.

Во-вторых, можно использовать явные методы начала и конца группы:

В-третьих, после формирования документа полезно установить свойство ТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(0), чтобы при открытии все группы были свернуты.

Контекст исполнения: Модуль формы против Модуля объекта

Проанализируем ситуацию, когда код работает в форме, но "не выводит ничего" при переносе в модуль объекта. Это критически важный момент для разработки печатных форм.

В модуле формы 1С часто используется обращение ЭтотОбъект.СсылкаНаОбъект (если это внешняя обработка) или просто доступ к реквизитам формы. Однако в Модуле объекта или Модуле менеджера контекст другой:

  1. Если это стандартная процедура печати (БСП), ссылка на документ передается в процедуру как параметр (обычно массив МассивОбъектов).
  2. Если вы используете конструкцию ЭтотОбъект.СсылкаНаОбъект внутри модуля объекта самой конфигурации, она может быть не определена. Правильно использовать просто ЭтотОбъект.Ссылка или просто Ссылка.
  3. Проверьте параметры запроса: Если параметр &Ссылка пустой или имеет неверный тип, запрос вернет пустой результат, и циклы просто не начнут выполняться.

Рассмотрим пример установки параметров, который гарантированно сработает в модуле менеджера при формировании печатной формы:


// В модуле менеджера или объекта
Запрос.УстановитьПараметр("Ссылка", Ссылка); 
// Где 'Ссылка' - это ссылка на конкретный документ ЗаказКлиента
Запрос.УстановитьПараметр("ВариантОбеспечения", Перечисления.ВариантыОбеспечения.Требуется);

Почему Параметры.Заполнить() может не работать?

Иногда программисты жалуются, что данные в таблицу выводятся, но они пустые. Метод Область.Параметры.Заполнить(Источник) очень удобен, но он требует строгого соответствия имен. Если в запросе поле называется Номенклатура, а в макете в свойствах ячейки параметр назван Товар, автоматического заполнения не произойдет. В этом случае нужно назначать значения вручную:

Область.Параметры.Товар = Выборка.Номенклатура;

Также проверьте тип заполнения ячейки в макете. В свойствах ячейки должно быть выбрано "Параметр", а не "Текст" или "Шаблон" (если используется простое имя).

Итоги и рекомендации

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

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

← На главную