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

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 строк,, а кое где пишут что можно сделать проще через группировки в запросе и просто загрузив данные в элемент формы - сколько не пробовал нек получается..
Есть примеры?
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)