Обход записей результата запроса по группировкам с учетом иерархии.
Полное описание, параметры и ограничения
ОбходРезультатаЗапроса.ПоГруппировкамСИерархией (QueryResultIteration.ByGroupsWithHierarchy)
ОбходРезультатаЗапроса (QueryResultIteration)
ПоГруппировкамСИерархией (ByGroupsWithHierarchy)
Доступен, начиная с версии 8.0.
Описание:
Обход записей результата запроса по группировкам с учетом иерархии.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Разобрать ОбходРезультатаЗапроса.ПоГруппировкамСИерархией на своей иерархии
Источник — собственная группа и два подчинённых элемента с настоящими иерархическими итогами. Пример различает детали, группировку, общий и иерархический итоги, не подменяя их строковыми метками.
Где и как запускать
Серверный модуль своей учебной обработки: источник перед основным блоком, функция обхода отдельно на уровне того же модуля.
Подготовка
В отдельной учебной конфигурации создайте собственный иерархический справочник УчебныеИзданияДиаграммы: группы и элементы, код Строка 10 с автонумерацией, наименование 100, не менее двух уровней.
Перед основным блоком в теле одной серверной процедуры своей обработки выполните дополнительный блок источника. Он создаёт новую собственную группу и две записи с количествами 3 и 5.
Запрос использует настоящие собственные ссылки, ОБЩИЕ и Товар ИЕРАРХИЯ. Строковый текст Книга сам по себе иерархии не создаёт.
Добавьте отдельную функцию обхода в тот же серверный модуль. Одна верхняя выборка не заменяет проход по дочерним уровням.
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ИскомыйТип = ТипЗаписиЗапроса.ДетальнаяЗапись;
Совпадений = ПосчитатьЗаписиТипа(Выборка, ИскомыйТип);
Сообщить("Деталей в своей иерархии: " + Строка(Совпадений));
Сообщить("Группа и общий итог не считаются отдельными изданиями");Перед основным блоком в той же процедуре: собственная иерархия и итоги
Группа = Справочники.УчебныеИзданияДиаграммы.СоздатьГруппу();
Группа.Наименование = "Учебные издания";
Группа.Записать();
Книга = Справочники.УчебныеИзданияДиаграммы.СоздатьЭлемент();
Книга.Родитель = Группа.Ссылка;
Книга.Наименование = "Учебная книга";
Книга.Записать();
Тетрадь = Справочники.УчебныеИзданияДиаграммы.СоздатьЭлемент();
Тетрадь.Родитель = Группа.Ссылка;
Тетрадь.Наименование = "Учебная тетрадь";
Тетрадь.Записать();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Книга", Книга.Ссылка);
Запрос.УстановитьПараметр("Тетрадь", Тетрадь.Ссылка);
Запрос.Текст = "ВЫБРАТЬ &Книга КАК Товар, 3 КАК Количество
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ &Тетрадь, 5
|ИТОГИ СУММА(Количество) ПО ОБЩИЕ, Товар ИЕРАРХИЯ";
Результат = Запрос.Выполнить();
Сообщить("Только собственная группа и два собственных издания");Тот же серверный модуль: раскрытие реальных вложенных выборок
Функция ПосчитатьЗаписиТипа(Выборка, ИскомыйТип)
Совпадений = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.ТипЗаписи() = ИскомыйТип Тогда
Совпадений = Совпадений + 1;
Сообщить("Найден тип: " + Строка(ИскомыйТип));
КонецЕсли;
Если Выборка.ТипЗаписи() <> ТипЗаписиЗапроса.ДетальнаяЗапись Тогда
Дочерние = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Совпадений = Совпадений + ПосчитатьЗаписиТипа(Дочерние, ИскомыйТип);
КонецЕсли;
КонецЦикла;
Возврат Совпадений;
КонецФункцииРазбор по шагам
Создаём известную собственную иерархию и результат запроса с нужными итогами.
Выбираем прямой либо групповой иерархический обход.
Переходим через Следующий перед чтением и открываем дочернюю выборку только для итоговой записи.
Как проверить результат
Обход учитывает настоящую группу и подчинённые ссылки. Функция раскрывает вложенные выборки и считает только детали.
Итоги иерархии не добавляются к количеству деталей повторно. Порядок обхода не меняет сохранённые записи справочника.
Ожидаемый результат
Тип записи и способ обхода показаны на реальном собственном результате с различимыми уровнями.
На что обратить внимание
Не суммируйте вместе детали и итоги: это повторный учёт одних и тех же собственных количеств.
Не вызывайте Выбрать у детальной записи ради бесконечного повторного обхода. Рекурсия ограничена деревом фактических итогов.
Код 1С при сборке HTML не исполнялся; собственные и рабочие записи агентом не создавались.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.