При работе с запросами в 1С:Предприятие часто возникает задача вывести данные, сгруппированные по нескольким уровням (например, сначала по номенклатуре, затем по документам). Многие разработчики сталкиваются с трудностями при попытке обойти такие данные циклом, получая либо дублирующиеся строки, либо ошибки при обращении к вложенным записям. Разберем детально, как организовать этот процесс правильно.
Когда вы используете в запросе секцию ИТОГИ ПО, платформа формирует иерархическую структуру данных. Первый уровень — это общие итоги, второй — первая группировка, третий — вторая группировка и так далее. Основная ошибка заключается в попытке обойти все уровни одним циклом. Для корректной обработки необходимо использовать вложенные циклы и правильно вызывать метод Выбрать().
Чтобы организовать правильный обход, будем использовать метод Выбрать() с параметром ОбходРезультатаЗапроса.ПоГруппировкам. Это позволяет переходить от одного уровня группировки к другому, не затрагивая детальные записи преждевременно.
Рассмотрим пример кода для обхода двух уровней группировки:
// Выполнение запроса
РезультатЗапроса = Запрос.Выполнить();
// Первый уровень обхода — Номенклатура
ВыборкаНом = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНом.Следующий() Цикл
// Вывод шапки или информации по номенклатуре
// Второй уровень обхода — Документы
ВыборкаДок = ВыборкаНом.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДок.Следующий() Цикл
// Вывод информации по документу
// Если есть детальные записи внутри документа
ВыборкаДетали = ВыборкаДок.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
// Обработка конкретных строк
КонецЦикла;
КонецЦикла;
КонецЦикла;
Если вы заметили, что в отчете появляются дублирующиеся строки для одного и того же документа, скорее всего, проблема кроется в структуре ИТОГОВ в тексте самого запроса. Если поле присутствует и в группировках, и в детальных записях, система может выводить их избыточно. Рекомендуется:
ИТОГИ ПО, если они не требуются для итоговых сумм.ТабличныйДокумент вы используете правильные уровни группировки.Для создания интерактивного отчета, где группировки можно сворачивать и разворачивать («плюсики»), используйте методы НачатьАвтогруппировкуСтрок() и ЗакончитьАвтогруппировкуСтрок(). Важным моментом является указание уровня при выводе строки в табличный документ через метод Вывести().
Разберем пример вывода с учетом автогруппировки:
ТабДок.НачатьАвтогруппировкуСтрок();
Пока ВыборкаНом.Следующий() Цикл
// Выводим строку первого уровня (Номенклатура)
ТабДок.Вывести(ОбластьНоменклатуры, 1);
ВыборкаДок = ВыборкаНом.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДок.Следующий() Цикл
// Выводим строку второго уровня (Документ)
ТабДок.Вывести(ОбластьДокумента, 2);
КонецЦикла;
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
Именно второй параметр метода Вывести() сообщает платформе, к какому уровню иерархии относится выводимая строка, что делает автогруппировку рабочей и логичной.
ОбходРезультатаЗапроса.ПоГруппировкам при вложенных циклах, если вы идете по иерархии группировок.ИТОГАХ.Выбрать() в Синтаксис-Помощнике — это ключ к пониманию того, как 1С работает с результатом запроса.Следуя этим рекомендациям, вы сможете легко управлять выводом сложных отчетов и избавитесь от проблем с дублированием данных или неработающей структурой группировок.