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