IE 2016

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

Опубликовал Ish_2 в раздел Программирование - Практика программирования

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

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
СравнениеСКДиЗапросаСИтогами.erf
.erf 10,83Kb
14.01.11
161
.erf 10,83Kb 161 Бесплатно

См. также

Лучшие комментарии

20. Ish_2 11.01.2011 10:41
(19) Вопрос :
(ВЫБРАТЬ 
      ДоговорыКонтрагентов.Ссылка КАК Договор, 
      ДоговорыКонтрагентов.Владелец КАК Контрагент 
   ИЗ 
      Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов 
    
   СГРУППИРОВАТЬ ПО 
      ДоговорыКонтрагентов.Владелец, 
      ДоговорыКонтрагентов.Ссылка) КАК ЗапросКолонки 
...Показать Скрыть


Для чего здесь "Сгруппировать ПО" ?
Разве в справочнике "ДоговорыКонтрагентов" есть неуникальные пары Договор, Владелец ?
Не проще ли написать равносильное :
(ВЫБРАТЬ 
      ДоговорыКонтрагентов.Ссылка КАК Договор, 
      ДоговорыКонтрагентов.Владелец КАК Контрагент 
   ИЗ 
      Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов ) КАК ЗапросКолонки 
...Показать Скрыть
+ 1 [ KapasMordorov; ]
# Ответить

Комментарии

1. tango 07.01.2011 19:01
- потому что
http://infostart.ru/public/80055/

пс: извини, Игорь, но перестал бы ты парить людям моск
оно, конечно, объективно я заинтересован, что бы ты испортил как можно больше 1снегов, но, блин, ... за ИС обидно.

пс: недаром, ох не даром тебе понравился мой скетч до слова Ах! включительно :)
Ответили: (2) (4)
# Ответить
2. Ish_2 07.01.2011 23:13
В (1)- набор слов и ссылка на пустышку.

Приведи свою готовую обработку, свой текст запроса с последующей вызгрузкой в дерево.
Или дай ссылку на публикацию , где решается подобная задача .

Пока говорить не о чём.
Ответили: (4) (19)
# Ответить
3. tango 08.01.2011 11:46
Пустышка? у тебя, наверное, отключена загрузка изображений.
там есть два рисунка, на одном - запрос, безо всяких твоих выкрутасов, а на другом - сформированное из этого запроса дерево.

Игорь, помнишь, у тебя был такой сдвиг: СКД - рулез, кодинг - атстой?
Ну, так это и есть СКД, и именно здесь она - рулез, а вовсе не в рекурсиях.
Пишешь запрос и несколько параметрических движений мышкой, все остальное система делает сама.
И не надо застирывать моск извратами типа (0).

***

Игорь назвал мою публикацию пустышкой? С чего бы это? Вот, уважаемый коллега iov даже плюсанул.

Похоже, причина в том, что тема, поднятая Игорем, в очередной раз является преодолением им же самим созданных трудностей.

А моя публикация ему потому и кажется пустышкой , что проблем-то нет, никаких.

Просто пишем запрос, все остальное система делает сама. Понимаешь, Игорь? Программист составляет простейший запрос, без никаких твоих выкрутасов, и система сама делает все остальное.

Это и отображено на картинках. Да, публикация получилась очень маленькая. Так ведь и проблемы-то для обсуждения - нет. Понимаешь, Игорь? Это твоя публикация была бы пустышкой, если бы реально не вредила мозгам коллег, по крайней мере, мозгам тех из них, которые тебе отплюсовались.

Ну, а уж чтобы совсем было все понятно каждому, прикладываю в своей публикации файлик с отчетом.

Первый скриншот вы сможете воспроизвести, открыв СКД отчета.

Второй скриншот - запустив отчет в демо-базе УПП 1.3
Ответили: (4) (5)
# Ответить
4. Ish_2 08.01.2011 12:45
(3) Ок. Давай разбираться.
Изображение у меня выводятся.
И то, что ты использовал СКД - вытекает из текста запроса.
Почему же тогда в (2) использован термин "пустышка" ?
Потому что
1. Не приведена сама обработка.
2. Не приведены аргументы ( сранительный анализ и тестирование) -
почему и в каких случаях СКД лучше, чем решение в текущей теме ?

Без этих двух пунктов твоя заявка (1) на лучшее решение - это просто "пук".
Гаданием за тебя, что ты имел ввиду - заниматься не буду.

Теперь о текущей статье, весь смысл её в том , что экономнее обойтись без СКД и решить всё в одном запросе.
См. простейшие тексты обработок.
Применение же СКД связано с дополнительными затратами в виде хранения отдельного макета "СхемыКомпоновкиДанных", загрузки его в оперативную память и т.д.
это невсегда удобно при доработке существующей формы документа или справочника.
Если же не хранить такой макет, то тогда придется программно создавать "СхемуКомпоновкиДанных" и организовывать вывод,
но тогда теряется преимущество в простоте настройки.
Вообщем, прочитай тему "Заметочки.." Alex-is там приведены примеры использования вывода в дерево.
Из этих примеров ты поймёшь , что в данных конкретных случаях применение СКД - избыточно.
и проще , экономнее использовать простой запрос.
Ответили: (8)
# Ответить
5. tango 08.01.2011 12:59
Ты уж определись, агитатором и пропагандистом чего ты являешься, СКД или кодинга, а то в памяти всплывает термин шизофрения.
(3) - в (0) об СКД - ни слова, ты и не вспоминал о ней, пока я не ткнул.
Ответили: (9)
# Ответить
6. iov 08.01.2011 13:10
Нашел применение вашему противостоянию!!! (добавил в тестовые задания для новых сотрудников так сказать найди 10 отличий.
Да а чего вы такие злые друг на друга?
Ответили: (9)
# Ответить
7. tango 08.01.2011 13:25
мы не злые, мы - 1сники
# Ответить
8. tango 08.01.2011 13:27
(4) сравни размер обработки с макетом и без макета
а про использование оперативки - это реальный пук, обратись в хот-лайн известной фирмы
Ответили: (9)
# Ответить
9. Ish_2 08.01.2011 13:59
(6) Это мы - по старой дружбе.
(8) Начнем сначала. В теме есть предложение , всё обясняющее :
Данную статью можно рассматривать как дополнение к теме Alex-is "Заметочки про 1с Предприятие 8"
http://infostart.ru/public/71130/


В этой статье автор привёл примеры как получить двухуровневые итоги в одной колонке результата запроса.
Простенько и со вкусом.
Но для трех- и более уровневых итогов этот приём был уже не применим.
Текущая же статья описывает как раз приём , позволящий выводить трех- и более уровневые итоги в одной колонке.
Разумеется , можно выводить в дерево при помощи СКД. Никто этого запретить не может.
Да, действительно , про СКД в статье ни слова, потому что такая возможность очевидна и неинтересна в контексте рассмотрения.

(5) Быть сторонником применения СКД - это не значит тыкать СКД куда ни попадя.
Еще раз говорю, в контексте целого класса задач (доработка сущ. форм , например) применение СКД для вывода в дерево избыточно,
если всё можно реализовать в одном простом запросе.
# Ответить
10. tango 08.01.2011 14:06
ты по-случаю - не какой-нибудь маленький начальник компьютерщиков?
больно соображения у тебя какие-то нереальные
избыточным может быть только одно - время, затраченное на получение необходимого результата
если быстрее на СКД - берем СКД
если из реляционных таблиц надо вытащить иерархию - кодинг с рекурсией
Ответили: (12) (13)
# Ответить
11. ILM 09.01.2011 14:36
Дополнительным плюсом статьи является возможность выводить дерево итогов с разнообразной многоуровневой группировкой.
Это могут быть и "склады, товары, контрагенты" и "контрагенты, склады, товары" и "товары, контрагенты, склады". Важно, что можно меняя запрос динамически получить практически миниOLAP на данных.
И выводить все эти данные на форме, а не в отчете.
# Ответить
12. ILM 09.01.2011 14:40
(10) Должна быть свобода выбора. Иногда код с рекурсией работает медленнее, иногда наоборот. Не вижу ничего плохого в поисках Игоря решать задачи другими способами, например через запросы.
Ответили: (13)
# Ответить
13. tango 09.01.2011 21:57
(12) Иногда код с рекурсией работает медленнее
Мы говорим об одном и том же, о из реляционных таблиц надо вытащить иерархию (априори количество уровней не знаем, пример - спецификация изделия) (10)?
Пожалуйста, приведите пример без рекурсии, не важно, быстрее он или медленнее.
Или вы настолько Иш_3, что спрячетесь, как Иш_2, за потоком "умных" слов?
Ответили: (14) (15)
# Ответить
14. Ish_2 09.01.2011 23:00
(13)
априори количество уровней не знаем, пример - спецификация изделия
Пожалуйста, приведите пример без рекурсии, не важно, быстрее он или медленнее.


В практических задачах ( а мы с помощью 1с решаем именно такие задачи) важно не количество уровней в каждом
конкретном исследуемом объекте , а максимально возможное количество уровней.
В практических задачах оно всегда известно и берется с некоторым запасом.

Тем не менее теоретически вполне возможен следующий вариант ,
см. "Запрос против..." http://infostart.ru/public/78285/
В нижеприведенном примере лишь изменен вид цикла
ТекстЗапроса = "ВЫБРАТЬ
                   |    ЕСТЬNULL(Спец.Номенклатура, Исх.Номенклатура)                 КАК Номенклатура,
                   |    Исх.Количество * ЕСТЬNULL(Спец.Количество, 1)                    КАК Количество,
                   |    Исх.СтрокаКодов + ЕСТЬNULL(Спец.КодНоменклатуры, """")   КАК СтрокаКодов,
                   |    ВЫБОР
                   |        КОГДА Исх.ПризнакКонцаВетки > 0
                   |            ТОГДА Исх.ПризнакКонцаВетки
                   |        КОГДА Спец.КодНоменклатуры ЕСТЬ NULL
                   |            ТОГДА 1 // нормальное завершение ветки
                   |        КОГДА Исх.СтрокаКодов ПОДОБНО Спец.КодНоменклатуры
                   |            ТОГДА 2 // зацикливание
                   |        ИНАЧЕ 0     // ветка продолжается
                   |    КОНЕЦ                                                                                  КАК ПризнакКонцаВетки
                   |ПОМЕСТИТЬ Последующая
                   |ИЗ
                   |    Исходная КАК Исх
                   |     ЛЕВОЕ СОЕДИНЕНИЕ Спецификация КАК Спец
                   |     ПО (Исх.ПризнакКонцаВетки = 0) // соединяемся только тогда, когда ветка продолжается
                   |            И Исх.Номенклатура = Спец.Владелец
                   |;
                   |УНИЧТОЖИТЬ Исходная
                   |;
                   |ВЫБРАТЬ ПЕРВЫЕ 1 Посл.Номенклатура
                   |ИЗ  Последующая КАК Посл
                   |ГДЕ Посл.ПризнакКонцаВетки = 0";

    //Цикл получения выходной таблицы
    Счетчик =0;
    Пока Истина Цикл
         Запрос.Текст = СтрЗаменить(ТекстЗапроса,"Исходная","ВремТаблица"+ Счетчик);
         Запрос.Текст = СтрЗаменить(Запрос.Текст,"Последующая","ВремТаблица"+(Счетчик+1));
         РезультатЗапроса = Запрос.Выполнить();
         Счетчик = Счетчик +1
         Если РезультатЗапроса.Пустой() Тогда // Все ветки не имеют продолжения
              Прервать;
         КонецЕсли;
    КонецЦикла;
...Показать Скрыть


Итак , по твоему запросу приведен пример решения задачи разузлования без рекурсии для случая,
когда количество уровней в графе неизвестно.

Я привел ,Миша , для тебя пример : как нужно практически доказывать свои утверждения.
Ответили: (15) (17)
# Ответить
15. ILM 10.01.2011 12:19
(14) А зачем доказывать?
(13) Мне не попадались задачи с вложенностью в глубину более 67 уровней. Это было один раз за все мои 44 года.
Чаще всего количество уровней задано и не превышает 10.
Я не отрицаю рекурсии, но сожалею о том, что нет 1С рекурсивных запросов. Типа OVER BY, CONNECT BY, START WITH.
Почему доступно получение Иерархии из справочника (код-родитель) запросом, и почему нельзя получить дерево запросом из таблицы значений с полями (потомок-родитель)?
Если задача получения состава изделия, или получение дерева затрат, или получения иерархической структуры решается постоянно, то я скорее буду хранить иерархию в справочнике, чем постоянно использовать рекурсии и нагружать вычислениями базу.
Возможных решений много... И все они имеют право на жизнь.
Ответили: (16) (17) (22)
# Ответить
16. Ish_2 10.01.2011 13:05
(15)1.
А зачем доказывать?

Затем , чтобы "пуков" в этой теме было поменьше.
2.
Почему доступно получение Иерархии из справочника (код-родитель) запросом, и почему нельзя получить дерево запросом из таблицы значений с полями (потомок-родитель)?


Потому что на уровне записи элемента справочника реализован механизм , который исключает зацикливание ссылок - получаем "идеальное" дерево
(ациклический граф).

Если же таблица с колонками Родитель,Ребенок создана пользователем произвольно, то тогда встает проблема : возможно зацикливание (ошибка заполнения) . Применять готовые встроенные процедуры расчитанные на идеальное дерево - НЕЛЬЗЯ.
# Ответить
17. tango 10.01.2011 16:35
(14) Игорь, если ты не видишь в своем коде чистейшей воды рекурсию, то дискуссия вырождается в спор о терминах, я это уже говорил.
(15) слово "доказывать" сказали вы - чистейшей воды Иш2-приемчик.
Ответили: (18) (22) (23)
# Ответить
18. Ish_2 10.01.2011 17:19
(17) Пустое, Миша. Всё уже ясно.
Теперь переключимся на твою тему http://infostart.ru/public/80055/ и
посмотрим вступится за твою честь WiseSnake или нет.
# Ответить
19. KapasMordorov 11.01.2011 10:26
(2)
С полгода назад тренировки ради (был вопрос на одинэссии).
Никакого отношения к итогам не имеет, а прием тот же - запихивание в одну колонку разнотипной билиберды.
Видимые колонки: КонтрагетОтчет и ДоговорКолонки. И еще сортировка в консоли отчетов КонтрагентКолонки, КонтрагентОтчет, ДоговорКолонки.
От вспомогательных полей можно избавиться еще одним уровнем вложенности.

ВЫБРАТЬ
	ЗапросКолонки.Контрагент КАК КонтрагентКолонки,
	ЗапросКолонки.Договор КАК ДоговорКолонки,
	КонтрагентыДоговорыМинимум.Контрагент,
	КонтрагентыДоговорыМинимум.Договор,
	ВЫБОР
		КОГДА ЗапросКолонки.Договор = КонтрагентыДоговорыМинимум.Договор
			ТОГДА ЗапросКолонки.Контрагент
		ИНАЧЕ 0
	КОНЕЦ КАК КонтрагентОтчет
ИЗ
	(ВЫБРАТЬ
		ДоговорыКонтрагентов.Ссылка КАК Договор,
		ДоговорыКонтрагентов.Владелец КАК Контрагент
	ИЗ
		Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
	
	СГРУППИРОВАТЬ ПО
		ДоговорыКонтрагентов.Владелец,
		ДоговорыКонтрагентов.Ссылка) КАК ЗапросКолонки
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			МАКСИМУМ(ДоговорыКонтрагентов.Ссылка) КАК Договор,
			Контрагенты.Ссылка КАК Контрагент
		ИЗ
			Справочник.Контрагенты КАК Контрагенты
				ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
				ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Владелец
		
		СГРУППИРОВАТЬ ПО
			Контрагенты.Ссылка) КАК КонтрагентыДоговорыМинимум
		ПО ЗапросКолонки.Контрагент = КонтрагентыДоговорыМинимум.Контрагент
...Показать Скрыть
Ответили: (20) (22)
# Ответить
20. Ish_2 11.01.2011 10:41
(19) Вопрос :
(ВЫБРАТЬ 
      ДоговорыКонтрагентов.Ссылка КАК Договор, 
      ДоговорыКонтрагентов.Владелец КАК Контрагент 
   ИЗ 
      Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов 
    
   СГРУППИРОВАТЬ ПО 
      ДоговорыКонтрагентов.Владелец, 
      ДоговорыКонтрагентов.Ссылка) КАК ЗапросКолонки 
...Показать Скрыть


Для чего здесь "Сгруппировать ПО" ?
Разве в справочнике "ДоговорыКонтрагентов" есть неуникальные пары Договор, Владелец ?
Не проще ли написать равносильное :
(ВЫБРАТЬ 
      ДоговорыКонтрагентов.Ссылка КАК Договор, 
      ДоговорыКонтрагентов.Владелец КАК Контрагент 
   ИЗ 
      Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов ) КАК ЗапросКолонки 
...Показать Скрыть
+ 1 [ KapasMordorov; ]
# Ответить
21. KapasMordorov 11.01.2011 11:10
(20)
Это уже перестраховка в спешке.
С замечанием согласен.
Ответили: (21)
# Ответить
22. Ish_2 11.01.2011 11:26
(15),(17),(19)
Жаль , что я не дождался аргументированного ответа о преимуществах СКД при выводе в дерево.
Придется самому защищать СКД и поставить под сомнение способ получения дерева из запроса с итогами.

Первый камень в текущую тему .
См. прикрепленный рисунок (второй из текущей темы).
Что имеем на рисунке ? Для того чтобы получить дерево мы используем в запросе ИТОГИ
и увеличиваем выходную таблицу в 4(!) раза.
Уже один этот факт рождает подозрение : а хорошо ли это ?
А в СКД ИТОГИ в запросе не используются совсем неслучайно.
Ответили: (23)

Прикрепленные файлы:

ВторойРисунок.png
# Ответить
23. Ish_2 11.01.2011 14:29
(17)
Если в (22) размышлизм , то здесь доказательство.
Вот каких аргументов я ждал от тебя ,Миша.
Специально подобран убойный, уникальный пример
для показа преимуществ СКД при формировании дерева.
С помщью СКД дерево было сформировано в 50(1) раз быстрее.
Ответили: (24) (25)

Прикрепленные файлы:

Сравнение СКД и Запроса с итогами 11.01.png
ОтчетСравнениеСКДиЗапроса.erf
# Ответить
24. alexk-is 11.01.2011 22:07
(23) А где колонка "Поле4"?
Ответили: (25)
# Ответить
25. Ish_2 12.01.2011 08:01
(24)
Вопрос : как получить итоги в одну колонку при использовании СКД (без постобработки) ? - интересный.
Подождём публикаций. Насколько мне известно эту задачу к настоящему моменту никто не решил.

А в (23) продемонстрировано преимущество СКД при формировании "обычного" дерева (без итогов в одну колонку).
В указанном примере оно настолько велико , что постобработка для получения дерева нужного вида ненамного уменьшит это преимущество.
# Ответить
26. alexk-is 12.01.2011 09:52
(26) А я знаю кто это умеет делать... :)
Ответили: (26) (27)
# Ответить
27. Ish_2 12.01.2011 10:09
(26) "Луч света", ну , расскажи нам. Просим.
Ответили: (28)
# Ответить
28. alexk-is 12.01.2011 11:22
(27) Ну, что за сарказм...
Вот ссылочка http://infostart.ru/public/download.php?file=80200
Ответили: (29) (30) (31)
# Ответить
29. Ish_2 12.01.2011 12:31
(28) Ай ! Молодца !
На форуме "1с" человек страдает по этому поводу.
Я ему не помог. Теперь сошлюсь.
# Ответить
31. Ish_2 12.01.2011 16:59
(28) Вы уж Алексей Викторович - извините ,
но без наездов в этой теме - никак.
Расматривается твоя обработка Пример8 из темы "Заметочки...":
http://infostart.ru/public/download.php?file=80200

Теперь наезд :
1. Нужно обязательно избавиться от создания лишних и никчёмных пользовательских полей Рекизит1,Реквизит2..
2. В табличное поле "Дерево" должно сразу выводиться только одно поле "Поле4".

Без этих двух требований серьезным людям показывать такую обработку нельзя.
Слабо доработать ?
Ответили: (32)
# Ответить
32. alexk-is 12.01.2011 17:09
(31) В компановке данных нужно просто удалить эти пользовательские поля и всё. Оставить только "Поле4". Работать будет быстрее.
Ответили: (33)
# Ответить
33. Ish_2 12.01.2011 17:11
(32) Не пойдет. Ты прикрепи обработку.
Ответили: (34)
# Ответить
34. alexk-is 12.01.2011 17:34
(33) Ну, ладно...
Тут обработка только с 1 колонкой Поле4
Ответили: (35)

Прикрепленные файлы:

Пример8_1.erf
# Ответить
35. Ish_2 12.01.2011 19:08
36. alexk-is 12.01.2011 20:56
Добавил ещё один вариант реализации многоуровнего дерева в колонке "Поле4" с использованием СКД - "Пример 9" http://infostart.ru/public/71130/files/
Ответили: (37)
# Ответить
37. Ish_2 12.01.2011 21:38
(36) Мне придется переписывать и стыковать с текущей темой (Благодаря тебе - она тоже будет полностью переработана).

Вместо реквизитов "Реквизит1","Реквизит2" - "Поле1","Поле2","Поле3","Поле4".
Ты зачем- то никому не интересный цикл заполнения таблицы - сделал в одну строку.
Ввел зачем-то переменную "Счетчик","НовоеДерево".
Время с точностью до миллисекунды...
Мда..На вкус и цвет .
Ответили: (40)
# Ответить
38. alexk-is 12.01.2011 21:54
> Вместо реквизитов "Реквизит1","Реквизит2" - "Поле1","Поле2","Поле3","Поле4".
"Поле1","Поле2","Поле3","Поле4" - то вот отсюда http://infostart.ru/public/79992/

> Ты зачем- то никому не интересный цикл заполнения таблицы - сделал в одну строку.
Так быстрее работает

> Ввел зачем-то переменную "Счетчик","НовоеДерево".
"Счетчик" - так быстрее работает
"НовоеДерево" - так правильнее работает при повторном запуске

> Время с точностью до миллисекунды...
Точность - вежливость королей

Можно придумать множество оправданий, но мне не хочется, чтобы сделанную мной работу называли "поделками".
Ответили: (40) (43)
# Ответить
39. Jogeedae 13.01.2011 03:43
Способ вроде как известный :)
Использую иногда.
Для некоторых случаев, подходит. Но если порядок групп менять, то условие "ВЫБОР КОГДА Поле2 Есть NULL...." не работоспособно. расширять надо
Ответили: (40)
# Ответить
40. Ish_2 13.01.2011 06:51
(38) В (37) были придирки.
(39)
"Чисто" поговорить ? или сможете представить свой вариант выгрузки в дерево ?
# Ответить
41. romansun (файл скачал) 19.01.2011 17:45
Интересная тема, спасибо. :)

Покурил чуть этот вопрос, скажу пару слов в сторону запросной половины статьи.

Главный затык идет на Выгрузить() в строках вида "Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)". Сам запрос выполняется так же быстро, как и СКД.

Но в строках вида "Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам)" никаких затыков нет.

В итоге, для программиста, в тех случаях, когда он собирается обходить кодом полученное быстро ДЗ (и, к примеру, не выводить её на форму) вполне можно использовать и Выборку, ибо обход и ДЗ и Выборки будет одинаково утомителен :).
Ответили: (42) (43)
# Ответить
42. Ish_2 19.01.2011 19:04
(41)Можно ,конечно, провести еще опыты ,
но весь смысл такого использования итогов запроса именно в том , что получаем выигрыш в скорости.

Т.е. одно и тоже дерево получено
1. Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
2. Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам) ;
или Пока Выборка.Следующий() Цикл
... или рекурсивная процедура с получением "Дерево".

Так вот п.1 работает быстрее.
В частности это обсуждается

здесь http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=571765
Ответили: (43)
# Ответить
43. Ish_2 19.01.2011 19:09
(38) Что скажешь на (41),(42) ? Ты что-то подобное тестировал ?
Для меня , честно говоря, это было настолько очевидно ,
что я даже не сравнивал по быстродействию.
# Ответить
44. alexk-is 20.01.2011 08:30
Для двухуровнего дерева у меня есть вот такие данные. Запрос с итогами выгружается через РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)

Заполнение запросом с итогами...
Время выполнения запроса : 0,266 сек.
Время выгрузки из результата запроса : 0,187 сек.
Общее время выполнения : 0,453 сек.

Заполнение СКД...
Время подготовки СКД : 0,016 сек.
Время выгрузки из СКД : 0,781 сек.
Общее время выполнения : 0,797 сек.
Ответили: (45)

Прикрепленные файлы:

Пример9.erf
# Ответить
45. Ish_2 20.01.2011 08:38
(44) Ты чего -то не о том . Вернее о чем-то своём.
Вопрос -то был о сравнении двух способов получения дерева (без СКД) :
- при помощи "кодинга" и выборки
- без кодинга выгрузить сразу в дерево.
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016