Дерево по иерархическому справочнику

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

Есть справочник (Тест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):

ВЫБРАТЬ Тест1.Ссылка КАК Ссылка ИЗ Справочник.Тест1 КАК Тест1 УПОРЯДОЧИТЬ ПО Тест1.Ссылка ИЕРАРХИЯ АВТОУПОРЯДОЧИВАНИЕ
ДЗ = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ

(9) В сабже рассмотрены оба варианта . Но для меня это всё не логично. Логично было бы так:
«ИЕРАРХИЯ» — должна была бы вывести структуру как есть: элементы и группы (как это делает СКД)
«ТОЛЬКО ИЕРРАХИЯ» должна была бы вывести структуру групп без концевых элементов (как это делает СКД)!

(10) По результатам запроса Иерархии мы получаем ту линейную таблицу, о которой Вы говорили, со значениями родителя каждой строки.
И мы формируем новую иерархию через код — получается одно.
А СКД получая ту же линейную таблицу формирует её по своим правилам — получается другое.

(13)Во-первых, о линейной таблице я не говорил — мне нужна структура иерархического справочника как она есть — но в виде дерева значений!
Во-вторых, поведение обычного запроса, для меня, совершенно не логично и не корректно, в отличии от СКД.
В-третьих, должно было быть — одинаково (как в СКД) при данной тривиальной постановке задачи и настройки! Налицо — некорректная работа в платформе обычных запросов, при обработке иерархических данных!

Читайте также:  Выжигания по дереву лошадь

(9)Вот это в сабже не видели:

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

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

ВЫБРАТЬ Тест1.Ссылка КАК Ссылка ИЗ Справочник.Тест1 КАК Тест1 УПОРЯДОЧИТЬ ПО Тест1.Ссылка ИЕРАРХИЯ АВТОУПОРЯДОЧИВАНИЕ
ДЗ = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

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

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

ВЫБРАТЬ Тест1.Ссылка КАК Ссылка ИЗ Справочник.Тест1 КАК Тест1 УПОРЯДОЧИТЬ ПО Тест1.Код ИЕРАРХИЯ

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

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

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

Но всё равно, спасибо Вам, Олег, за решение!

Запрос = Новый Запрос; Запрос.Текст = ЭлементыФормы.ТекстЗапроса.ПолучитьТекст(); РезультатЗапроса = Запрос.Выполнить(); Если ПоГруппировкам=0 Тогда дз = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); Иначе дз = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); КонецЕсли; ЭлементыФормы.ДЗ.СоздатьКолонки();

(4)И что? Там запрос отработает правильно? У меня этот запрос никак не связан с интерактивной работой и отчётами, мне что — прикручивать в серверный бакэнд СКД чтобы просто корректно выполнить выборку из справочника? Да мне проще вручную собрать это ДЗ из линейной таблицы по родителю.

(5) Ну, запросы — они немножко о другом, вообще-то.
А отработает правильно, куда же он денется.
Если проще вручную собрать — собирайте вручную.

(6)Спасибо. В обработке. Выгрузка через СКД работает (единственное — не хватало условия в запросе «ГДЕ Тест1.ЭтоГруппа = ЛОЖЬ», которое в моём сабже почему-то тоже пропало (хотя я его туда помещал). Но, такой подход требует создания схемы СКД — что несколько усложняет процесс. Но, может Вы правы — лучше вместо запроса прикрутить СКД для данного случая хотя бы. Другом решением было бы в самом первом варианте запроса попросту удалить из ДЗ нижние листья дерева — без них тоже будет правильный результат (для данного примера).

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

А на практике — использование СКД ещё потребует программного создания «схемы компоновки» для каждого такого запроса — что на СКД очень не удобно делать!

Читайте также:  Кедр дерево вечнозеленое дерево

Приложил к сабжу тестовую базу (и включил туда обе обработки: через запрос и через скд) — может кто-нибудь разъяснит, почем через запрос работает криво, а через СКД — корректно (хотя чаще бывает как раз наоборот)!

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

Дерево сформировать то просто а вот вывести из такой структуры данных в форме в дерево значений можно быстро?
Чтобы картинка была такой к примеру:

Выбрали справочник из списка, его наименование подставилось в запрос, запрос выполнили и загрузили иерархию справочника в дерево на форме. Потом передвигаясь в дереве по пакам при выборе папки отрисовывается второй элемент — таблица значений элементами справочника находящегося в выбранной папке и т.д.

Вот это дерево (из предыдущего поста 18) сделано на основании элементарного запроса без всяких иерархий и группировок

Запрос.Текст ;
Запрос.Текст = СтрЗаменить(Запрос.Текст,»Номенклатура», ИмяСправочника);

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

Источник

Создание дерева папок с помощью иерархического справочника

Элементы приложения можно группировать по папкам. В этом случае дерево папок будет отображаться в левой части экрана под названием приложения, справа вы увидите их содержимое.

Для создания структуры папок воспользуйтесь настройкой Иерархический справочник .

doctree_1

Настроить иерархию папок

  1. Откройте меню приложения, нажав на шестеренку рядом с его названием.
  2. Выберите пункт Иерархический справочник .
  3. Активируйте опцию Включить иерархический справочник .
  4. Нажмите Сохранить . Под названием приложения появится фильтр Все записи .
  5. Нажмите на изображение карандаша справа от фильтра Все записи .
  6. Добавьте папки.

Для создания вложенных папок:

  1. Нажмите на шестеренку справа от названия папки, в которой хотите настроить вложенную структуру. Откроется ее меню.
  2. В меню выберите пункт Добавить вложенную папку и введите название новой папки. Таких папок можно добавить несколько.
  3. Внутри каждой вложенной папки вы можете создать папки следующего уровня. Количество вложенных уровней не ограничено.

После того, как вы создали и настроили дерево, нажмите на крестик справа от фильтра Все записи , чтобы выйти из режима редактирования.

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

Добавить элемент в папку

Откройте карточку элемента. В левом верхнем углу указано, в какой папке он лежит. Если папка вложенная, то будет указан весь путь до нее. Если элемент еще не определен ни в одну из папок, будет указано Все записи .

doctree4

Чтобы поместить элемент в папку, нажмите на карандаш и в открывшемся списке выберите нужную папку. Затем нажмите Переместить . Таким же образом в дальнейшем вы сможете перемещать элементы между папками.

Читайте также:  Высота взрослого дерева грецкого ореха

По умолчанию на этапе создания элемента поместить его в папку нельзя. Это действие доступно только для тех элементов, которые уже хранятся в приложении. Чтобы поместить элемент в папку при добавлении, разместите на форме создания виджет Навигация по папкам.

Действия с папками

Чтобы открыть меню для работы с папкой, нажмите на карандаш рядом с фильтром Все записи . Затем нажмите на шестеренку справа от названия нужной папки. Откроется меню с доступными действиями.

  • Переименовать — введите новое название, как при создании папки;
  • Переместить — выберите любую папку в вашей структуре, куда хотите переместить текущую папку;
  • Права доступа — вы можете настроить права доступа для каждой папки;
  • Удалить – удаляя папку, вы одновременно удаляете и все вложенные в нее папки. Элементы приложения не удалятся и будут видны по фильтру Все записи.

Фильтры директории

Помимо стандартного поиска по элементам приложения, в иерархическом справочнике доступны фильтры директории. Это фильтры, которые вы создаете для поиска в рамках определенной папки. Для того, чтобы создать новый фильтр директории, откройте поиск по параметрам, заполните поля для поиска, нажмите Сохранить как фильтр директории .

folder_filter

Создавать и редактировать фильтры директории могут только пользователи, входящие в группу Администраторы.

Созданный фильтр будет добавлен в дерево папок — в ту папку, которая была открыта при его создании. Названия фильтров в дереве указаны курсивом, чтобы было легко отличить их от самих папок.
Нажав на фильтр, пользователь увидит все элементы, соответствующие параметрам поиска, к которым у него есть доступ. При этом можно дополнительно применить обычные фильтры, созданные для этого приложения.
Фильтр можно переименовать, переместить или удалить. Для этого нажмите на карандаш рядом с фильтром Все записи . Затем нажмите на шестеренку справа от названия нужной папки и выберите подходящий пункт меню.

Иерархический справочник на формах других приложений

Когда приложение с настроенным иерархическим справочником размещается на форме другого приложения, то при заполнении поля и выборе элемента также будет отображаться дерево папок.

Например, при создании заказа на его форму необходимо добавить договор, который хранится в приложении с настроенным иерархическим справочником. Для этого пользователь нажимает на значок лупы рядом с полем Договор .

В открывшемся окне слева отображается настроенное в приложении дерево папок. В правой части — список всех элементов в выбранной папке.

searach_tree

Чтобы найти элемент, укажите его название в строке поиска на верхней панели окна. Поиск будет осуществляться среди элементов в выбранной папке.

Настройки доступа

По умолчанию доступ к элементам регулируется на уровне приложения, но вы можете ограничивать доступ на уровне папок:

  1. настроить общие права доступа ко всем папкам приложения;
  2. установить доступ для отдельной папки приложения.

При этом по фильтру Все записи отобразятся элементы приложений из всех папок, к которым у вас есть доступ.

Подробнее об этих настройках читайте в статье «Ограничение на уровне папок приложения».

Источник

Оцените статью