- Примеры запросов для работы с иерархическими справочниками
- Получение элементов иерархического справочника, находящихся в подчинении заданной группы
- Проверка наличия подчиненных элементов у элемента справочника
- Получение всех родителей элемента
- Вывод иерархического справочника в отчет
- Получение итогов по иерархии
- Не работает иерархия
- Нет иерархического просмотра по группам в справочнике
- Три способа получить дерево элементов иерархического справочника
Примеры запросов для работы с иерархическими справочниками
В данном разделе показаны примеры решения типовых задач при работе с иерархическими справочниками.
Получение элементов иерархического справочника, находящихся в подчинении заданной группы
Для получения подчиненных элементов иерархического справочника в языке запросов предусмотрена конструкция В ИЕРАРХИИ. Пример использования В ИЕРАРХИИ:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
В данном примере будут получены все записи справочника Номенклатура, находящиеся в группе &Группа, включая ее саму, ее подчиненные группы и элементы, принадлежащие подчиненным группам.
Если же нас интересуют только элементы и группы, находящиеся непосредственно в заданной группе, то такие элементы мы можем получить установив условие на поле Родитель. Пример:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Группа
Такой запрос выберет группы и элементы, находящиеся в подчинении группы со ссылкой &Группа.
Проверка наличия подчиненных элементов у элемента справочника
Для проверки наличия подчиненных записей элемента справочника можно пользоваться запросом, аналогичным представленному:
ВЫБРАТЬ ПЕРВЫЕ 1
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Родитель
В данном примере ссылка элемента, для которого необходимо проверить наличие дочерних элементов, записывается в параметр запроса «Родитель». После выполнения такого запроса необходимо проверить результат на пустоту. Если результат не пустой, то подчиненные записи есть. Иначе — нет. Пример:
Если Запрос.Выполнить().Пустой() Тогда
Сообщить(«Зписей нет»);
Иначе
Сообщить(«Записи есть»);
КонецЕсли;
Получение всех родителей элемента
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:
Запрос = Новый Запрос(«ВЫБРАТЬ
| Номенклатура.Родитель,
| Номенклатура.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|
|ГДЕ
| Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры»;
Пока Истина Цикл
Запрос.УстановитьПараметр(«ТекущийЭлементНоменклатуры», ТекущийЭлементНоменклатуры);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() — 1 Цикл
ТекущийЭлементНоменклатуры = Выборка[НомерКолонки];
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
Иначе
Сообщить(ТекущийЭлементНоменклатуры);
КонецЕсли;
КонецЦикла;
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки.
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
Вывод иерархического справочника в отчет
Для вывода иерархического справочника в отчет с сохранением иерархии необходимо пользоваться запросом аналогичным следующему:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование ИЕРАРХИЯ
Данный запрос выбирает все записи из справочника и производит упорядочивание по иерархии. Результат будет упорядочен по наименованию, с учетом иерархии.
Для того чтобы группы справочника размещались выше элементов необходимо в данном запросе заменить предложение УПОРЯДОЧИТЬ ПО на следующее:
УПОРЯДОЧИТЬ ПО
Номенклатура.ЭтоГруппа ИЕРАРХИЯ,
Наименование
Результат по-прежнему будет упорядочен по иерархии, однако группы будут располагаться выше элементов.
Возможна также замена предложения УПОРЯДОЧИТЬ ПО на предложение АВТОУПОРЯДОЧИВАНИЕ. В этом случае результат будет упорядочен в соответствии с настройками справочника, т.е. если в справочнике указано, что группы должны располагаться выше элементов, то они будут расположены выше.
Получить иерархическую структуру справочника также возможно и при помощи итогов.
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ Справочник.Номенклатура КАК Номенклатура
ГДЕ
(Номенклатура.ЭтоГруппа = ЛОЖЬ)
УПОРЯДОЧИТЬ ПО Наименование
ИТОГИ ПО Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ
Получение итогов по иерархии
Для получения итогов по иерархии в запросе необходимо в предложении ИТОГИ ПО указать ключевое слово ИЕРАРХИЯ после указания поля, по которому будет рассчитываться итоги. Пример отчета «Обороты номенклатуры» с получением итогов по иерархии:
ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ИЕРАРХИЯ
В результате данного запроса будут рассчитаны итоги не только для каждой номенклатуры, но и для групп, к которым принадлежит та или иная номенклатура.
В случае, когда не нужны итоги по элементам, а нужны итоги только по группам, нам необходимо использовать в итогах конструкцию ТОЛЬКО ИЕРАРХИЯ. Пример:
ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ТОЛЬКО ИЕРАРХИЯ
В результате данного запроса будут итоговые записи только для групп номенклатуры.
Источник
Не работает иерархия
Помощь в написании контрольных, курсовых и дипломных работ здесь.
как работает иерархия в vc6?
программный код в консольной программе выдаёт нежданный результат. И почему в консольной программе.
Не работает иерархия пользовательских классов исключений
Создал иерархию, но сообщения не выводятся, а исправить не могу. Подскажите пожалуйста, что надо.
Иерархия С++
Привет. Заинтересовал вопрос иерархии С++: код -> функции -> классы/структуры -> .
Иерархия
Помогите составить иерархию со словом емкость.
Вложения
| Desktop.rar (326.2 Кб, 3 просмотров) |
Иерархия
Здравствуйте! Проблема в следующем — сайт на wp (мой первый). Индексная страница статическая.
Доброго времени суток, такой вопрос: есть ли возможность показать UI объект (например изображение).
Иерархия классов
Цель работы: Целью лабораторной работы является получение практических навыков при использовании.
Иерархия классов!
Помогите! Создайте класс точка, которая имеет координаты. Класс эллипсов, и класс окружностей.
Иерархия порождения
Добрый вечер. Изучаю наследование, вот такое задание: создать иерархию порождения: транспор.
Источник
Нет иерархического просмотра по группам в справочнике
Создал справочник.
Ввел в него элементы. После решил, что лучше будет хранить элементы по группам. В иерархии.
Сделал так. Открыл справочник, создал группу. Переместил в нее элементы. Оно вроде как стали подчинены группе. Но иерархии в справочнике нет.
Через Ещё — режим просмотра, не активны никакие пункты. Как что бы была иерархия в справочнике.
почему не активны пункты в режим просмотра? что не так я сделал, от своей бездарности ?
(2) вообще ничего нет
(3) у справочника даже формы нет
я создаю справочник с 1 наименованием, ввел элементы, и сейчас сделал для них группы, но их нет
похоже это только я смогу решить, снести все и создать заново.
Почему только вот так вышло?
(7) Настройки можно и в режиме «Предприятие» поправить, но судя по картинке из (10) — группировок нет.
А справочник случайно не подчинённый?
(11) А что править? Можно ли это исправить не созданием нового справочника, и повтором всего. Так как не понятно его поведение.
А как может влиять на отсутствие иерархии, то что подчиненный справочник или нет?
в настройках формы нет родителя, это нормлаьно ?
(14) Отбор на сколько мне говорят мои знания, это фильтр, отбирая нужное и скрывая остальное в справочнике. Так ли это?
Мне же нужно элементы поместить в группы, если они для них созданы и показать их без групп, если они не добавлены группым.
(16) А как это обойти.
И где должен быть обязательно задать отбор?
То есть, я что то обязательно должен задавать тут. http://joxi.ru/DmBK7EquzREo72
Я создал справочник. Создал элементы. Создал группы. Перенес в них элементы. Иерархии нет. Зачем мне группы, если они просто в списке? Что за ограничение платформы.
Нельзя создать справочник, и поместить в него элементы, разнеся их по группам для удобства? Ясно. Сейчас это все дорабатывать нужно то есть.
(20) (21) >А как это обойти.
Я же написал уже как обойти — задать отбор по владельцу.
Всё равно какой, проверяется только факт его наличия.
>И где должен быть обязательно задать отбор?
Всё равно где — можно в коде, можно руками (в режиме Предприятие) включить.
>То есть что нет простого рабочего состояния получается?
Предполагается что подчинённые справочники обычно открываются с отбором по владельцу.
(24) В настройках списка какого. У справочника нет ни формы списка ни формы элемента.
То есть нужно создать? Автоматические формы не работают?!
(22)
>Что именно?
Ну сколько можно то?
Все равно что.
Поменять «Вид сравнения» на «Не равно» и указать любой мусор или прямо пустое оставить.
(24)
>В настройках списка не указана основная таблица.
Это точно мимо.
Иначе кнопок не было бы вообще.
Да и выше написано что форма автосгенерированная.
(25)
>Для каждого взгляда на справочник, нужно создавать свою форму!
Обычно нет.
(26)
>В настройках списка какого. У справочника нет ни формы списка ни формы элемента.
Что-то я туплю сегодня, пятница же.
Подумал было что автор и правда «не догоняет», хотел помочь.
Вот и отвечай после этого людям.
Источник
Три способа получить дерево элементов иерархического справочника
1) Идея проста — выбираем запросом элементы, не являющиеся папками, а всю иерархию нам построит запрос. Тут сразу начинаются неожиданности. Какую конструкцию использовать: ИЕРАРХИЯ или ТОЛЬКО ИЕРАРХИЯ? Вроде логично было бы ТОЛЬКО ИЕРАРХИЯ, т.к. итоги на уровне элементов нам не нужны (будут дубли). Заглядываем в справку: «ИЕРАРХИЯ. В результате будут рассчитаны итоги по контрольным точкам и итоги по иерархии для контрольных точек . При необходимости можно рассчитать итоги только значений по иерархии, без расчета итогов в контрольных точках. Для этого перед ключевым словом ИЕРАРХИЯ нужно указать ключевое слово ТОЛЬКО.»
Для однозначного понимания моих объяснений введу несколько «терминов», которыми буду пользоваться. Все листья дерева буду называть элементами. Узлы дерева, которые содержат только элементы — нижние папки, Остальные узлы, которые содержат хотя бы одну нижнюю папку — верхние папки.
Для ИЕРАРХИЯ — все логично: разбираем дерево итогов по иерархии для папок. У всех папок тип — ТипЗаписиЗапроса.ИтогПоИерархии. У элементов тип — ТипЗаписиЗапроса.ИтогПоГруппировке. Внутри группировки одна запись того же элемента но уже с типом ТипЗаписиЗапроса.ДетальнаяЗапись. Все как заявлено. Но если выгрузить в дерево, дубль пропадает!
Либо сформировать вручную
Для ТОЛЬКО ИЕРАРХИЯ все немного не так, как ожидалось. Верхние папки — ТипЗаписиЗапроса.ИтогПоИерархии, нижние — ТипЗаписиЗапроса.ИтогПоГруппировке. Внутри элементы с типом — ТипЗаписиЗапроса.ДетальнаяЗапись. НО, если верхняя папка содержит элементы, все они будут помещены в еще в одну вложенную группу с типом ТипЗаписиЗапроса.ИтогПоГруппировке. Поэтому выгрузить() приводит к дублированию! Цель такого дублирования думаю в том, чтобы все элементы обязательно содержались в папке с ТипЗаписиЗапроса.ИтогПоГруппировке, чтобы мы могли обходить выборку ОбходРезультатаЗапроса.ПоГруппировкам. Поэтому, если использовать ТОЛЬКО ИЕРАРХИЯ, лучше обойти выборку и сформировать ручками дерево, устраняя дублирование. При обходе нужно обязательно указывать второй параметр «Группировки». Привожу обход для ТОЛЬКО ИЕРАРХИЯ
Недостатки такого метода очевидны. Все папки вычисляет запрос, и мы не можем как-то их использовать. Например, при соединении с другой таблицей по номенклатуре, склеются только элементы, а на уровне папок нам доступны только вычисления в итогах. Проблема производительности здесь не рассматривается.
2) Для решения этой проблемы необходимо выбрать папки в запросе. Такой запрос не получиться выгрузить в дерево, но, если мы будем использовать в запросе УПОРЯДОЧИТЬ ПО . ИЕРАРХИЯ, а также выберем в запросе родителя, то обход дерева станет простым, мы будем обходить выборку в цикле и прицеплять следующий элемент к текущему или одному из его родителей. К кому цеплять покажет выбранное поле родитель.
Этот метод хорош, но его невозможно применить, если мы не можем получить сразу всю иерархию. Если у нас есть только набор элементов, нам необходимо предварительно построить всю иерархию.
3) Итак, у нас есть набор элементов (набор условий отбора на элементы), но мы не знаем их родителей, нам нужно их вычислить, а затем сформировать дерево. Тут нам не обойтись без Сергея (ildarovich) (отдельное спасибо ему за качественный контент) и его публикации //infostart.ru/public/158512/
Рассмотрим задачу получения только иерархии по набору элементов. Для решения задачи выберем для элементов все папки, в которых они содержатся, затем замыканием вычислим всех родителей этих папок, ну и далее выборка с обходом по 2 методу.
Источник