В практических задачах часто возникает необходимость выгрузки и отображения результата запроса в табличном поле формы. В статье сравниваются два способа выгрузки в "дерево" :
- при помощи запроса с итогами
- используя СКД
§ 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 и содержала лишь описание подхода "всё в одном запросе" . Но по ходу обсуждения (см. комментарии) выяснилось , что гораздо интереснее сравнительный анализ двух подходов . Тема изменила название и в текст были внесены существенные изменения .
Для автора тема использования СКД для построения дерева и последующее обсуждение оказалось неожиданно полезным, в смысле другого подхода к исследованию циклического графа (см. тему Запрос против рекурсии.. - теперь построение графа ошибок возможно многократно ускорить , используя СКД)