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