Как правильно формировать запрос по иерархическому справочнику в дерево?
Есть справочник (Тест1), обычный иерархический(иерархия групп и элементов, отображение групп сверху – отключено, но это не важно), например, с такой структурой, отображаемой в форме списка (в режиме дерева, упорядочен по коду):
Г1
| - Э1
| - Г2
| | - Э21
| | - Э22
| - Э3
Хочу запросом получить его в виде дерева значений (ДЗ), но никак не получается
Пишу запрос
Когда результат выгружается в ДЗ так:
Получаю такую иерархию строк в ДЗ
Г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):
Г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
По теме из базы знаний
Найденные решения
(1) все намного проще.
Запрос:
Получение дерева из запроса:
Запрос:
ВЫБРАТЬ
Тест1.Ссылка КАК Ссылка
ИЗ
Справочник.Тест1 КАК Тест1
УПОРЯДОЧИТЬ ПО
Тест1.Ссылка ИЕРАРХИЯ
АВТОУПОРЯДОЧИВАНИЕ
ПоказатьПолучение дерева из запроса:
ДЗ = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Остальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(9)В сабже рассмотрены оба варианта. Но для меня это всё не логично. Логично было бы так:
"ИЕРАРХИЯ" - должна была бы вывести структуру как есть: элементы и группы (как это делает СКД)
"ТОЛЬКО ИЕРРАХИЯ" должна была бы вывести структуру групп без концевых элементов (как это делает СКД)!
"ИЕРАРХИЯ" - должна была бы вывести структуру как есть: элементы и группы (как это делает СКД)
"ТОЛЬКО ИЕРРАХИЯ" должна была бы вывести структуру групп без концевых элементов (как это делает СКД)!
(10) По результатам запроса Иерархии мы получаем ту линейную таблицу, о которой Вы говорили, со значениями родителя каждой строки.
И мы формируем новую иерархию через код - получается одно.
А СКД получая ту же линейную таблицу формирует её по своим правилам - получается другое.
И мы формируем новую иерархию через код - получается одно.
А СКД получая ту же линейную таблицу формирует её по своим правилам - получается другое.
(13)Во-первых, о линейной таблице я не говорил - мне нужна структура иерархического справочника как она есть - но в виде дерева значений!
Во-вторых, поведение обычного запроса, для меня, совершенно не логично и не корректно, в отличии от СКД.
В-третьих, должно было быть - одинаково (как в СКД) при данной тривиальной постановке задачи и настройки! Налицо - некорректная работа в платформе обычных запросов, при обработке иерархических данных!
Во-вторых, поведение обычного запроса, для меня, совершенно не логично и не корректно, в отличии от СКД.
В-третьих, должно было быть - одинаково (как в СКД) при данной тривиальной постановке задачи и настройки! Налицо - некорректная работа в платформе обычных запросов, при обработке иерархических данных!
(1) все намного проще.
Запрос:
Получение дерева из запроса:
Запрос:
ВЫБРАТЬ
Тест1.Ссылка КАК Ссылка
ИЗ
Справочник.Тест1 КАК Тест1
УПОРЯДОЧИТЬ ПО
Тест1.Ссылка ИЕРАРХИЯ
АВТОУПОРЯДОЧИВАНИЕ
ПоказатьПолучение дерева из запроса:
ДЗ = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
(16) Браво! Вот этот вариант действительно работает корректно! Я пробовал его, но не убирал условие
С этим фильтром иерархия не получается :-(
Работает и такой вариант тоже (вместо упорядочивания по коду - можно указать другой реквизит - как у меня на самом деле в рабочем варианте)
Саммое интерсеное, что про такой вариант конструкции я даже не знал до сегодняшнего дня - пока не стал копаться в доках
Но, всё равно, считаю, что разработчики платформы 1С8 тут с иерархической выборкой перемудрили ;-)
Но всё равно, спасибо Вам, Олег, за решение!
ГДЕ
Тест1.ЭтоГруппа = ЛОЖЬ
С этим фильтром иерархия не получается :-(
Работает и такой вариант тоже (вместо упорядочивания по коду - можно указать другой реквизит - как у меня на самом деле в рабочем варианте)
ВЫБРАТЬ
Тест1.Ссылка КАК Ссылка
ИЗ
Справочник.Тест1 КАК Тест1
УПОРЯДОЧИТЬ ПО
Тест1.Код ИЕРАРХИЯ
Саммое интерсеное, что про такой вариант конструкции я даже не знал до сегодняшнего дня - пока не стал копаться в доках
УПОРЯДОЧИТЬ ПО
Тест1.Код ИЕРАРХИЯ
Но, всё равно, считаю, что разработчики платформы 1С8 тут с иерархической выборкой перемудрили ;-)
Но всё равно, спасибо Вам, Олег, за решение!
(2)Нет
Запрос = Новый Запрос;
Запрос.Текст = ЭлементыФормы.ТекстЗапроса.ПолучитьТекст();
РезультатЗапроса = Запрос.Выполнить();
Если ПоГруппировкам=0 Тогда
дз = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Иначе
дз = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
КонецЕсли;
ЭлементыФормы.ДЗ.СоздатьКолонки();
Показать
(4)И что? Там запрос отработает правильно? У меня этот запрос никак не связан с интерактивной работой и отчётами, мне что - прикручивать в серверный бакэнд СКД чтобы просто корректно выполнить выборку из справочника? Да мне проще вручную собрать это ДЗ из линейной таблицы по родителю.
(5) Ну, запросы - они немножко о другом, вообще-то.
А отработает правильно, куда же он денется.
Если проще вручную собрать - собирайте вручную.
А отработает правильно, куда же он денется.
Если проще вручную собрать - собирайте вручную.
Прикрепленные файлы:
ВнешняяОбработка1.epf
(6)Спасибо. В обработке. Выгрузка через СКД работает (единственное - не хватало условия в запросе "ГДЕ Тест1.ЭтоГруппа = ЛОЖЬ", которое в моём сабже почему-то тоже пропало (хотя я его туда помещал). Но, такой подход требует создания схемы СКД - что несколько усложняет процесс. Но, может Вы правы - лучше вместо запроса прикрутить СКД для данного случая хотя бы. Другом решением было бы в самом первом варианте запроса попросту удалить из ДЗ нижние листья дерева - без них тоже будет правильный результат (для данного примера).
Но у меня тут больше философский был вопрос - почему обычный запрос корректно не отрабатывает? Это ошибка платформы? Мне, кажется, давным давно (ещё до появления СКД), у меня нормально такие запросы отрабатывали, просто с тех пор почти не сталкивался с такими запросами вне отчетов. Ведь что может быть проще - когда выбраны итоги "ИЕРАРХИЯ" - выгрузить в ДЗ физическую иерархию таблицы справочника! А сейчас - прям одни глюки при выборке, которые я совершенно не могу понять - чем они обоснованы!
А на практике - использование СКД ещё потребует программного создания "схемы компоновки" для каждого такого запроса - что на СКД очень не удобно делать!
Но у меня тут больше философский был вопрос - почему обычный запрос корректно не отрабатывает? Это ошибка платформы? Мне, кажется, давным давно (ещё до появления СКД), у меня нормально такие запросы отрабатывали, просто с тех пор почти не сталкивался с такими запросами вне отчетов. Ведь что может быть проще - когда выбраны итоги "ИЕРАРХИЯ" - выгрузить в ДЗ физическую иерархию таблицы справочника! А сейчас - прям одни глюки при выборке, которые я совершенно не могу понять - чем они обоснованы!
А на практике - использование СКД ещё потребует программного создания "схемы компоновки" для каждого такого запроса - что на СКД очень не удобно делать!
Дерево сформировать то просто а вот вывести из такой структуры данных в форме в дерево значений можно быстро?
Чтобы картинка была такой к примеру:
Выбрали справочник из списка, его наименование подставилось в запрос, запрос выполнили и загрузили иерархию справочника в дерево на форме. Потом передвигаясь в дереве по пакам при выборе папки отрисовывается второй элемент - таблица значений элементами справочника находящегося в выбранной папке и т.д.
Чтобы картинка была такой к примеру:
Выбрали справочник из списка, его наименование подставилось в запрос, запрос выполнили и загрузили иерархию справочника в дерево на форме. Потом передвигаясь в дереве по пакам при выборе папки отрисовывается второй элемент - таблица значений элементами справочника находящегося в выбранной папке и т.д.
Прикрепленные файлы:
Вот это дерево (из предыдущего поста 18) сделано на основании элементарного запроса без всяких иерархий и группировок
Запрос.Текст = "ВЫБРАТЬ Спр.Родитель КАК Родитель, Спр.Ссылка КАК Папка
| ИЗ Справочник.Номенклатура КАК Спр
| ГДЕ Спр.ЭтоГруппа ";
Запрос.Текст = СтрЗаменить(Запрос.Текст,"Номенклатура", ИмяСправочника);
но потом пришлось рекурсивную процедуру писать аж из 8 строк,, а кое где пишут что можно сделать проще через группировки в запросе и просто загрузив данные в элемент формы - сколько не пробовал нек получается..
Есть примеры?
Запрос.Текст = "ВЫБРАТЬ Спр.Родитель КАК Родитель, Спр.Ссылка КАК Папка
| ИЗ Справочник.Номенклатура КАК Спр
| ГДЕ Спр.ЭтоГруппа ";
Запрос.Текст = СтрЗаменить(Запрос.Текст,"Номенклатура", ИмяСправочника);
но потом пришлось рекурсивную процедуру писать аж из 8 строк,, а кое где пишут что можно сделать проще через группировки в запросе и просто загрузив данные в элемент формы - сколько не пробовал нек получается..
Есть примеры?
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)