Как правильно выполнить обход результата запроса с несколькими группировками?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет Промышленность, строительство и АПК
← На главную

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

Понимание структуры результата запроса

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

Пошаговое решение задачи обхода

Чтобы организовать правильный обход, будем использовать метод Выбрать() с параметром ОбходРезультатаЗапроса.ПоГруппировкам. Это позволяет переходить от одного уровня группировки к другому, не затрагивая детальные записи преждевременно.

Рассмотрим пример кода для обхода двух уровней группировки:


// Выполнение запроса
РезультатЗапроса = Запрос.Выполнить();

// Первый уровень обхода — Номенклатура
ВыборкаНом = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНом.Следующий() Цикл
    // Вывод шапки или информации по номенклатуре
    
    // Второй уровень обхода — Документы
    ВыборкаДок = ВыборкаНом.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаДок.Следующий() Цикл
        // Вывод информации по документу
        
        // Если есть детальные записи внутри документа
        ВыборкаДетали = ВыборкаДок.Выбрать();
        Пока ВыборкаДетали.Следующий() Цикл
            // Обработка конкретных строк
        КонецЦикла;
    КонецЦикла;
КонецЦикла;

Как избавиться от дублирования строк

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

  1. Убрать лишние поля из секции ИТОГИ ПО, если они не требуются для итоговых сумм.
  2. Проверить, не выводите ли вы в цикле одну и ту же область несколько раз.
  3. Убедиться, что при выводе в ТабличныйДокумент вы используете правильные уровни группировки.

Использование автогруппировки в табличном документе

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

Разберем пример вывода с учетом автогруппировки:


ТабДок.НачатьАвтогруппировкуСтрок();

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

ТабДок.ЗакончитьАвтогруппировкуСтрок();

Именно второй параметр метода Вывести() сообщает платформе, к какому уровню иерархии относится выводимая строка, что делает автогруппировку рабочей и логичной.

Основные советы для успешной реализации

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

← На главную