Получение группы верхнего уровня #414473


#0 by queit
Столкнулся со следующей задачкой: есть справочник, в котором вид иерархии - иерархия элементов, ограничения на количество уровней нет. Нужно в одном запросе получить, зная элемент n-го уровня, элемент 0-го уровня. Программно получить группу не составляет особого труда, а вот в запросе сложно. В общем, нетривиальная задачка. У кого какие мысли?
#1 by leshikkam
Динамический запрос в зависимости о уровня элемента
#2 by povar
ПолноеНаименование
#3 by queit
поподробнее ;) и что?
#4 by povar
+ мозг
#5 by queit
дико извеняюсь, секция v8 или запросы и построители
#6 by mikecool
все равно
#7 by queit
ПолноеНаименование - и что??? как это может помочь?
#8 by Mitriy
элементом 0-го уровня всегда будет пустая ссылка...
#9 by Aprobator
и зачем все это надо?
#10 by dimoff
и бред, так как и Уровень и ПолноеНаименование методы, система так же обратится к базе данных и будет по ссылкам искать родителей, то есть вместо того чтобы получить сразу ссылку будет куча ненужных телодвижений
#11 by mikecool
есть предложения?
#12 by dimoff
Одним запросом никак, если нет ограничения на уровни, идеально добавить реквизит РодительПервогоУровня, подписаться на ПередЗаписью и фигачить его туда, а взапросе потом спокойно получать
#13 by queit
нет элементом 0-го уровня будет элемент верхнего уровня справочника (т.к. иерархия элементов), а родитель будет пустой... отчет нужен со справочником подразделения и сотрудники, где вместо подразделения у сотра будет подразделение верхнего уровня
#14 by avtor
цикл Пока номенклатура.владелец не пустой выбрать номенклатура.владелец где номенклатура.элемент = &елемент элемент = номенклатура.владелец конец цикла вот так можно сделать)
#15 by queit
хочется одним запросом, чтобы без лишних телодвижений =)
#16 by queit
у меня просто есть хороший оптимизированный запрос, а этот момент слабое место в нем...вот и задался такой целью
#17 by avtor
может действительно ПолноеНаименование? Синтаксис: ПолноеНаименование Возвращаемое значение: Тип: Строка. Строка, включающая наименование элемента и наименования всех вышестоящих элементов. Наименования выводятся слева направо, начиная с самого верхнего уровня, разделяются символом "/". Описание: Получает наименование элемента справочника с учетом наименований всех вышестоящих элементов. Пример: Сообщить("Полное наименование данного элемента: " +          СсылкаНаЭлемент.ПолноеНаименование);
#18 by Scooter
пачка запросов тебе поможет
#19 by dimoff
+12 Хотя если б я писал не тиражное решение, то примерно проанализировал бы какой может быть уровень и написал бы запрос в виде Родитель, Родитель.Родитель, Родитель.Родитель.Родитель, и т.д. по числу наиболее вероятного максимального уровня, в крайнем случае обратился бы рекурсивно
#20 by avtor
и забрать до "/" ;-)
#21 by dimoff
Что тебе по 12 понятно? В 12 как раз единственный вариант, когда гарантированно одним запросом без лишних телодвижений
#22 by mikecool
и причем здесь владелец? :) динамически по количеству уровней иерархии добавить в текст запроса Родитель = "| Номенклатура.Родитель"; ТекстЗапроса = ТекстЗапроса + Родитель + " Как Родитель1, " пока ... выборка по уровням иерархии начиная со второго  ТекстЗапроса = ТекстЗапроса + Родитель + ".Родитель Как Родитель" + СчетчикЗапроса может типа так?
#23 by mikecool
+22 только остается проверять на нулл :((
#24 by Defender aka LINN
Символ "/" не является запрещенным, т.е. вполне может встретиться и в наименовании, а автор такого "кода" - сам понимаешь, в чем.
#25 by mikecool
+23 зато уже без обращений к базе :)
#26 by Aprobator
если в запросе то тогда придется делать подзапрос, который получит все содержимое подчиненности верхниего уровня справочника. т.е. делаем левое соединие 2 табл. по В ИЕРАРХИИ. 1 -я табл - элемент справочника у которых родитель пустой 2-я у которых не пустой.
#27 by Aprobator
+ соответственно поля Элементи СамыйВернийПапа. Идея думаю понятна?
#28 by dimoff
Какое кол-во бредятины, боже мой Интересно только 18 послушать
#29 by Лефмихалыч
знаю глупый способ: 1. Получить ТЗ с двумя колонками "Родитель0" и "Родитель", в Родитель0 будут группы верхнего уровня, в Родитель -все подчиненные им 2. Загнать ТЗ во временную атблицу и соединять в запросе по равенству родителя твоего элемента справочника полю Родитель ил ТЗ
#30 by mikecool
ты, окромя раздуть базу на поле , ничего не предложил... или я ошибаюсь?
#31 by dimoff
по В ИЕРАРХИИ работает очень долго для больших справочников
#32 by khajit
я так использовал получение:
#33 by dimoff
Я предложил все возможные варианты, в т.ч. и 19, возможно только в 18 что-то интересное, так как пакеты не знаю. Теперь по поводу "Раздуть базу". На сколько раздуется база при 100 тысячах элементов при добавлении ссылочного поля?
#34 by Aprobator
да уж Пачка запросов - как звучит!!! Пачка - тачка. :)
#35 by Scooter
да тоже через .опу таксказать ИМХО эффективней всего это реквизит с родителем 1го уровня а лучше вообще отказаться от такого алгоритма
#36 by dimoff
Этот вариант получит гран-при как самый тормозной из всех возможных
#37 by Aprobator
1 раз можно :).
#38 by dimoff
Моё ИМХО такое же, либо 19 если с вероятностью в 90%(что скорей всего) можно будет узнать реально используемое количество уровней.
#39 by Aprobator
да и сомнительно, что справочник подразделения см. может быть уж таким огромадным. Не номенклатура все таки.
#40 by Aprobator
упс не , а .
#41 by mikecool
звиняю, 19 не заметил а вот по поводу - раздуть базу, просто надо узнать постановку задачи - если отчет формируется раз в месяц, то и смысла хранения доп информации не вижу...
#42 by dimoff
возможно прав
#43 by khajit
для сравнения этого варианта первоначально использовалось  В ИЕРАРХИИ , после того как справчник дорос до 500-600 тыс объектов... отрабатывало оч медленно при использовании этой ф-ии тормозов не наблюдается
#44 by dimoff
Да.
#45 by Mitriy
что-то не пойму... а первые 1 не рулит??
#46 by dimoff
Согласен, гран-при таки за ВИЕРАРХИИ, твой вариант второе место при 500-600 тысячах :)
#47 by Aprobator
как в будет тяжеловато сделать при отсутствии ограничения по уровням см. .
#48 by dimoff
Жизнь не удалась :)
#49 by dimoff
Я несколько раз написал - в большинстве случаев на конкретной фирме реальный уровень вложенности чаще всего известен.
#50 by Aprobator
здесь идет речь конкретно о справочнике подразделения см. . Как то тяжелоа представить организацию с 500 - 600 тыс. подразделений :)
#51 by Mitriy
гы... уел ))
#52 by Aprobator
а можно немного урезать (кроме того, что подчинение может быть не только группе) и с учетом того, что эта функция должна вызываться тока для элементов справочника с уровнем не равным 0:
#53 by dimoff
Это вообще-то реализовано в типовых и циклом а не рекурсией
#54 by Aprobator
опс ошиься чуть. [1С] Функция ПолучитьВерхнегоРодителя(Ссылка)        Если Ссылка.Родитель.Пустая Тогда             Возврат Ссылка;        Иначе             Возврат ПолучитьВерхнегоРодителя(Ссылка.Родитель)        КонецЕсли; КонецФункции [/С]
#55 by Aprobator
дык я о том как урезать. Честно говоря с такой задачей не сталкивался, потому типовые не смотрел. Первое что в голову пришло. Хотя по логике цикл будет правильнее - память не будет кушать. Надо будет взять на вооружение. Мало ли когда приспичит.
#56 by Aprobator
+ а если с циклом и без запросу - то наверное так будет оптимально:
#57 by queit
всем спасибо за мысли и предложения... ввел ограничение на кол-во уровней, вернее приблизительно прикинул максимальное число уровней (взял 10, т.к. сомневаюсь что будет больше, а если и будет, то можно быстро подправить) получилось следующее: ВЫБРАТЬ    ИЗ
#58 by queit
запрос не оптимизирован, но это уже другой вопрос для другой ветки :-)
#59 by Aprobator
Не то слово. и в ИНАЧЕ наверное все таки стоит запихать пустую ссылку, а не ссылку на самого себя.
#60 by hhhh
Зачем вложенный запрос непонятно.   Выбор Когда Спр.Родитель = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) Тогда     Спр.Ссылка Когда Спр.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) Тогда .... ИЗ Справочник.Подразделения КАК Спр
#61 by mista2009
О! У меня такая же проблема!
#62 by queit
, благодарю за уменые мысли ;) на данном этапе думаю остановиться, дальше оптимизировать не вижу смысла:
#63 by Aprobator
а где иначе с пустым родителем?
#64 by Aprobator
+ вернее 1 - когда должно возвращать не ссылку на само себя, а пустую ссылку.
#65 by queit
разве здесь не обработается эта ситуация:
#66 by Aprobator
дык о чем и речь. Родителя нет и возвращается ссылка на сам элемент  вместо пустого значения.
#67 by queit
согласен =) просто у меня не может быть ситуации, когда пустой родитель...в пусть таком случае пусть ссылается сам на себя
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С