СКД против запроса с итогами


Или как эффективно выгрузить и отобразить результат запроса не в табличном документе, а в табличном поле ? В статье сравниваются два способа выгрузки в  "дерево" :
- при помощи запроса с итогами
- используя СКД

 В практических задачах часто возникает необходимость выгрузки  и отображения результата запроса в табличном поле формы. В статье сравниваются два способа выгрузки в  "дерево" :

- при помощи запроса с итогами
- используя СКД 

§ 1. Запрос с итогами. Или "всё в одном запросе". 

Вначале рассмотрим в "картинках" процесс создания текста запроса с заполнением итоговых полей в одной колонке. 

Исходный запрос :
Рис.1.

 

Исходный запрос с итогами . Отметим затратность :  применение итогов  привело к увеличению выходной таблицы в 4 раза.
Рис. 2.

 


Запрос с вычисляемым итоговым полем "Поле4 " : 
Рис 3.

 

Демонстрация вычисления  "Поле4"  первой строки итогов :
Рис.4.

Из рис.2-4 понятен механизм вычисления итоговых полей запроса :
вначале происходит заполнение итоговой строки по умолчанию (см. Рис2), затем заполняются поля указанные в тексте запроса между опциями  "Итоги" и "По".  

Приведем реальный пример использования такого подхода :

Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос  Новый Запрос;
Запрос.Текст  "ВЫБРАТЬ
                | ХозрасчетныйОбороты.Субконто1 КАК Подразделения,
                | ХозрасчетныйОбороты.Субконто2 КАК НоменклатурныеГруппы,
                | ХозрасчетныйОбороты.Субконто3 КАК СтатьиЗатрат,
                | ХозрасчетныйОбороты.СуммаОборотДт КАК СуммаОборот
                |ИЗ
                | РегистрБухгалтерии.Хозрасчетный.Обороты(, , , Счет = &Счет, , , , ) КАК ХозрасчетныйОбороты
                |ИТОГИ
                | ВЫБОР
                |  КОГДА НоменклатурныеГруппы ЕСТЬ NULL
                |   ТОГДА Подразделения
                |  ИНАЧЕ НоменклатурныеГруппы
                | КОНЕЦ КАК СтатьиЗатрат,
                | СУММА(СуммаОборот)
                |ПО
                | Подразделения,
                | НоменклатурныеГруппы" ;
Запрос.УстановитьПараметр( "Счет", ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01"));
Дерево  =  Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);  
КонецПроцедуры
В демонстрационной конфигурациии БП 2.0 (1.6) результат такого запроса выглядит следующим образом :
Рис.5.

§ 2. Применение СКД 

А теперь покажем как использование более "громоздкого" подхода с применением СКД даёт многократный прирост производительности.
К теме прикреплена обработка СравнениеСКДиЗапросаСИтогами.epf , результаты  которой представлены на рисунке :
Рис.6.


 

При этом и запрос с итогами, и СКД выдают "дерево" одного и того же вида - с итогами в одной колонке :
Рис.7.

Особенностью используемых в СКД настроек является наличие единственного пользовательского поля "ПолеДерева" . Этот вариант , который представляется автору наиболее удачным из всех возможных , предложил  Alexk-is :
Рис.8. 

  

Специально подобранный пример таблицы в обработке СравнениеСКДиЗапросаСИтогами.epf   даёт  отчетливое представление об  ограниченности подхода "всё в одном запросе" и демонстрирует преимущества применения  СКД при выводе в "дерево".

§ 3. Заключение

Очевидное преимущество в быстродействии СКД при построении  "дерева" не исключает компактного приема с использованием  запроса с итогами , если объем выводимых данных не очень велик .

Автор благодарит автора Alexk-is за ценные замечания к статье. 

Тема первоначально задумывалась как  дополнение к статье  Заметочки про 1с Предприятие8  и содержала лишь описание подхода "всё в одном запросе" . Но по ходу обсуждения (см. комментарии) выяснилось , что гораздо интереснее сравнительный анализ двух подходов .  Тема изменила название и в текст были внесены существенные изменения . 

Для автора тема использования СКД для построения дерева и последующее обсуждение оказалось неожиданно полезным,  в смысле другого подхода к исследованию циклического графа  (см. тему Запрос против рекурсии..  - теперь построение графа ошибок возможно многократно ускорить , используя СКД)

Файлы обработки:

-