Как правильно формировать запрос по иерархическому справочнику в дерево?

1. Darklight 32 23.03.18 14:26 Сейчас в теме
Есть справочник (Тест1), обычный иерархический(иерархия групп и элементов, отображение групп сверху – отключено, но это не важно), например, с такой структурой, отображаемой в форме списка (в режиме дерева, упорядочен по коду):
Г1
| - Э1
| - Г2
| | - Э21
| | - Э22
| - Э3
Хочу запросом получить его в виде дерева значений (ДЗ), но никак не получается
Пишу запрос

ВЫБРАТЬ
	Тест1.Ссылка КАК Ссылка
ИЗ
	Справочник.Тест1 КАК Тест1

ГДЕ
	Тест1.ЭтоГруппа = ЛОЖЬ

УПОРЯДОЧИТЬ ПО
	Тест1.Код
ИТОГИ ПО
	Ссылка ИЕРАРХИЯ
Показать


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

Получаю такую иерархию строк в ДЗ
Г1
| - Э1
| | - Э1*
| - Г2
| | - Э21
| | | - Э21*
| | - Э22
| | | - Э22*
| - Э3
| | - Э3*
В результате лишние элементы, помеченные *
А когда результат выгружается в ДЗ так:

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


Г1
Э1**
| - Э1*
Г2**
Э21**
| - Э21*
Э22**
| - Э22*
Э3**
| - Э3*
В результате лишние элементы, помеченные *, а элементы Э1**, Э3**, Э21**, Э22** не на своём месте

Если заменяю в запросе на

ИТОГИ ПО
	Ссылка ТОЛЬКО ИЕРАРХИЯ


Тогда при выгрузки по иерархии, получаю такую иерархию строк в ДЗ
Г1
| - Г1*
| | - Э1**
| | - Э3**
| - Г2
| | - Э21
| | - Э22
В результате лишние элементы, помеченные *, а элементы Э1**, Э3** не на своём месте (относительно позиции группы Г2)

При выгрузки в ДЗ по группировкам без иерархии
Г1*
Г1
| - Э1
| - Э3
Г2**
| - Э21
| - Э22
В результате лишний элемент Г1 помеченный *, а элемент Г2 ** не на своём месте

Вопрос, как надо сформировать запрос, чтобы получить реальную структуру справочника в ДЗ?

Ниже прилагается тестовая база (обычное приложение 8.3.10):
Прикрепленные файлы:
1Cv8.dt
+
По теме из базы знаний
Найденные решения
16. spacecraft 23.03.18 17:07 Сейчас в теме
(1) все намного проще.
Запрос:
ВЫБРАТЬ
    Тест1.Ссылка КАК Ссылка
ИЗ
    Справочник.Тест1 КАК Тест1
УПОРЯДОЧИТЬ ПО
    Тест1.Ссылка ИЕРАРХИЯ
АВТОУПОРЯДОЧИВАНИЕ
Показать

Получение дерева из запроса:
ДЗ = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
daho; ixijixi; +2
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. spacecraft 23.03.18 16:10 Сейчас в теме
(1)
ИТОГИ ПО
Ссылка ИЕРАРХИЯ

тут должно быть:
ИТОГИ ПО
    Ссылка ТОЛЬКО ИЕРАРХИЯ
+
10. Darklight 32 23.03.18 16:14 Сейчас в теме
(9)В сабже рассмотрены оба варианта. Но для меня это всё не логично. Логично было бы так:
"ИЕРАРХИЯ" - должна была бы вывести структуру как есть: элементы и группы (как это делает СКД)
"ТОЛЬКО ИЕРРАХИЯ" должна была бы вывести структуру групп без концевых элементов (как это делает СКД)!
+
13. user905137 23.03.18 16:27 Сейчас в теме
(10) По результатам запроса Иерархии мы получаем ту линейную таблицу, о которой Вы говорили, со значениями родителя каждой строки.
И мы формируем новую иерархию через код - получается одно.
А СКД получая ту же линейную таблицу формирует её по своим правилам - получается другое.
+
14. Darklight 32 23.03.18 16:31 Сейчас в теме
(13)Во-первых, о линейной таблице я не говорил - мне нужна структура иерархического справочника как она есть - но в виде дерева значений!
Во-вторых, поведение обычного запроса, для меня, совершенно не логично и не корректно, в отличии от СКД.
В-третьих, должно было быть - одинаково (как в СКД) при данной тривиальной постановке задачи и настройки! Налицо - некорректная работа в платформе обычных запросов, при обработке иерархических данных!
+
12. Darklight 32 23.03.18 16:23 Сейчас в теме
(9)Вот это в сабже не видели:

Если заменяю в запросе на

ИТОГИ ПО
Ссылка ТОЛЬКО ИЕРАРХИЯ
+
16. spacecraft 23.03.18 17:07 Сейчас в теме
(1) все намного проще.
Запрос:
ВЫБРАТЬ
    Тест1.Ссылка КАК Ссылка
ИЗ
    Справочник.Тест1 КАК Тест1
УПОРЯДОЧИТЬ ПО
    Тест1.Ссылка ИЕРАРХИЯ
АВТОУПОРЯДОЧИВАНИЕ
Показать

Получение дерева из запроса:
ДЗ = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
daho; ixijixi; +2
17. Darklight 32 23.03.18 19:24 Сейчас в теме
(16) Браво! Вот этот вариант действительно работает корректно! Я пробовал его, но не убирал условие
ГДЕ
	Тест1.ЭтоГруппа = ЛОЖЬ


С этим фильтром иерархия не получается :-(

Работает и такой вариант тоже (вместо упорядочивания по коду - можно указать другой реквизит - как у меня на самом деле в рабочем варианте)

ВЫБРАТЬ
	Тест1.Ссылка КАК Ссылка
ИЗ
	Справочник.Тест1 КАК Тест1

УПОРЯДОЧИТЬ ПО
	Тест1.Код ИЕРАРХИЯ


Саммое интерсеное, что про такой вариант конструкции я даже не знал до сегодняшнего дня - пока не стал копаться в доках

УПОРЯДОЧИТЬ ПО
	Тест1.Код ИЕРАРХИЯ


Но, всё равно, считаю, что разработчики платформы 1С8 тут с иерархической выборкой перемудрили ;-)

Но всё равно, спасибо Вам, Олег, за решение!
+
2. antz 23.03.18 14:57 Сейчас в теме
3. Darklight 32 23.03.18 14:59 Сейчас в теме
(2)Нет

Запрос = Новый Запрос;
	Запрос.Текст = ЭлементыФормы.ТекстЗапроса.ПолучитьТекст(); 

	РезультатЗапроса = Запрос.Выполнить();
	
	Если ПоГруппировкам=0 Тогда
		дз = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
	Иначе
		дз = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
	КонецЕсли;
	ЭлементыФормы.ДЗ.СоздатьКолонки();
Показать
+
4. antz 23.03.18 15:02 Сейчас в теме
(3) я имею в виду - скд можно использовать
+
5. Darklight 32 23.03.18 15:08 Сейчас в теме
(4)И что? Там запрос отработает правильно? У меня этот запрос никак не связан с интерактивной работой и отчётами, мне что - прикручивать в серверный бакэнд СКД чтобы просто корректно выполнить выборку из справочника? Да мне проще вручную собрать это ДЗ из линейной таблицы по родителю.
+
6. antz 23.03.18 15:24 Сейчас в теме
(5) Ну, запросы - они немножко о другом, вообще-то.
А отработает правильно, куда же он денется.
Если проще вручную собрать - собирайте вручную.
Прикрепленные файлы:
ВнешняяОбработка1.epf
+
7. Darklight 32 23.03.18 15:50 Сейчас в теме
(6)Спасибо. В обработке. Выгрузка через СКД работает (единственное - не хватало условия в запросе "ГДЕ Тест1.ЭтоГруппа = ЛОЖЬ", которое в моём сабже почему-то тоже пропало (хотя я его туда помещал). Но, такой подход требует создания схемы СКД - что несколько усложняет процесс. Но, может Вы правы - лучше вместо запроса прикрутить СКД для данного случая хотя бы. Другом решением было бы в самом первом варианте запроса попросту удалить из ДЗ нижние листья дерева - без них тоже будет правильный результат (для данного примера).

Но у меня тут больше философский был вопрос - почему обычный запрос корректно не отрабатывает? Это ошибка платформы? Мне, кажется, давным давно (ещё до появления СКД), у меня нормально такие запросы отрабатывали, просто с тех пор почти не сталкивался с такими запросами вне отчетов. Ведь что может быть проще - когда выбраны итоги "ИЕРАРХИЯ" - выгрузить в ДЗ физическую иерархию таблицы справочника! А сейчас - прям одни глюки при выборке, которые я совершенно не могу понять - чем они обоснованы!

А на практике - использование СКД ещё потребует программного создания "схемы компоновки" для каждого такого запроса - что на СКД очень не удобно делать!
+
8. Darklight 32 23.03.18 15:58 Сейчас в теме
Приложил к сабжу тестовую базу (и включил туда обе обработки: через запрос и через скд) - может кто-нибудь разъяснит, почем через запрос работает криво, а через СКД - корректно (хотя чаще бывает как раз наоборот)!
+
11. Darklight 32 23.03.18 16:17 Сейчас в теме
Попробовал установить уровень совместимости 8.1 - запросы отработали абсолютно так же :-(
+
15. Darklight 32 23.03.18 16:44 Сейчас в теме
Вот тут 1С пишет про иерархию в запросах, но ведь не работает так как написано (хотя там в статье и не приведены примеры результатов работы).
+
18. IvSchekin 25.03.18 01:28 Сейчас в теме
Дерево сформировать то просто а вот вывести из такой структуры данных в форме в дерево значений можно быстро?
Чтобы картинка была такой к примеру:


Выбрали справочник из списка, его наименование подставилось в запрос, запрос выполнили и загрузили иерархию справочника в дерево на форме. Потом передвигаясь в дереве по пакам при выборе папки отрисовывается второй элемент - таблица значений элементами справочника находящегося в выбранной папке и т.д.
Прикрепленные файлы:
+
19. IvSchekin 25.03.18 01:35 Сейчас в теме
Вот это дерево (из предыдущего поста 18) сделано на основании элементарного запроса без всяких иерархий и группировок

Запрос.Текст = "ВЫБРАТЬ Спр.Родитель КАК Родитель, Спр.Ссылка КАК Папка
| ИЗ Справочник.Номенклатура КАК Спр
| ГДЕ Спр.ЭтоГруппа ";
Запрос.Текст = СтрЗаменить(Запрос.Текст,"Номенклатура", ИмяСправочника);

но потом пришлось рекурсивную процедуру писать аж из 8 строк,, а кое где пишут что можно сделать проще через группировки в запросе и просто загрузив данные в элемент формы - сколько не пробовал нек получается..
Есть примеры?
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот