#0
by queit
Столкнулся со следующей задачкой: есть справочник, в котором вид иерархии - иерархия элементов, ограничения на количество уровней нет. Нужно в одном запросе получить, зная элемент n-го уровня, элемент 0-го уровня. Программно получить группу не составляет особого труда, а вот в запросе сложно. В общем, нетривиальная задачка. У кого какие мысли?
#10
by dimoff
и бред, так как и Уровень и ПолноеНаименование методы, система так же обратится к базе данных и будет по ссылкам искать родителей, то есть вместо того чтобы получить сразу ссылку будет куча ненужных телодвижений
#12
by dimoff
Одним запросом никак, если нет ограничения на уровни, идеально добавить реквизит РодительПервогоУровня, подписаться на ПередЗаписью и фигачить его туда, а взапросе потом спокойно получать
#13
by queit
нет элементом 0-го уровня будет элемент верхнего уровня справочника (т.к. иерархия элементов), а родитель будет пустой... отчет нужен со справочником подразделения и сотрудники, где вместо подразделения у сотра будет подразделение верхнего уровня
#14
by avtor
цикл Пока номенклатура.владелец не пустой выбрать номенклатура.владелец где номенклатура.элемент = &елемент элемент = номенклатура.владелец конец цикла вот так можно сделать)
#16
by queit
у меня просто есть хороший оптимизированный запрос, а этот момент слабое место в нем...вот и задался такой целью
#17
by avtor
может действительно ПолноеНаименование? Синтаксис: ПолноеНаименование Возвращаемое значение: Тип: Строка. Строка, включающая наименование элемента и наименования всех вышестоящих элементов. Наименования выводятся слева направо, начиная с самого верхнего уровня, разделяются символом "/". Описание: Получает наименование элемента справочника с учетом наименований всех вышестоящих элементов. Пример: Сообщить("Полное наименование данного элемента: " + СсылкаНаЭлемент.ПолноеНаименование);
#19
by dimoff
+12 Хотя если б я писал не тиражное решение, то примерно проанализировал бы какой может быть уровень и написал бы запрос в виде Родитель, Родитель.Родитель, Родитель.Родитель.Родитель, и т.д. по числу наиболее вероятного максимального уровня, в крайнем случае обратился бы рекурсивно
#21
by dimoff
Что тебе по 12 понятно? В 12 как раз единственный вариант, когда гарантированно одним запросом без лишних телодвижений
#22
by mikecool
и причем здесь владелец? :) динамически по количеству уровней иерархии добавить в текст запроса Родитель = "| Номенклатура.Родитель"; ТекстЗапроса = ТекстЗапроса + Родитель + " Как Родитель1, " пока ... выборка по уровням иерархии начиная со второго ТекстЗапроса = ТекстЗапроса + Родитель + ".Родитель Как Родитель" + СчетчикЗапроса может типа так?
#24
by Defender aka LINN
Символ "/" не является запрещенным, т.е. вполне может встретиться и в наименовании, а автор такого "кода" - сам понимаешь, в чем.
#26
by Aprobator
если в запросе то тогда придется делать подзапрос, который получит все содержимое подчиненности верхниего уровня справочника. т.е. делаем левое соединие 2 табл. по В ИЕРАРХИИ. 1 -я табл - элемент справочника у которых родитель пустой 2-я у которых не пустой.
#29
by Лефмихалыч
знаю глупый способ: 1. Получить ТЗ с двумя колонками "Родитель0" и "Родитель", в Родитель0 будут группы верхнего уровня, в Родитель -все подчиненные им 2. Загнать ТЗ во временную атблицу и соединять в запросе по равенству родителя твоего элемента справочника полю Родитель ил ТЗ
#33
by dimoff
Я предложил все возможные варианты, в т.ч. и 19, возможно только в 18 что-то интересное, так как пакеты не знаю. Теперь по поводу "Раздуть базу". На сколько раздуется база при 100 тысячах элементов при добавлении ссылочного поля?
#35
by Scooter
да тоже через .опу таксказать ИМХО эффективней всего это реквизит с родителем 1го уровня а лучше вообще отказаться от такого алгоритма
#38
by dimoff
Моё ИМХО такое же, либо 19 если с вероятностью в 90%(что скорей всего) можно будет узнать реально используемое количество уровней.
#39
by Aprobator
да и сомнительно, что справочник подразделения см. может быть уж таким огромадным. Не номенклатура все таки.
#41
by mikecool
звиняю, 19 не заметил а вот по поводу - раздуть базу, просто надо узнать постановку задачи - если отчет формируется раз в месяц, то и смысла хранения доп информации не вижу...
#43
by khajit
для сравнения этого варианта первоначально использовалось В ИЕРАРХИИ , после того как справчник дорос до 500-600 тыс объектов... отрабатывало оч медленно при использовании этой ф-ии тормозов не наблюдается
#46
by dimoff
Согласен, гран-при таки за ВИЕРАРХИИ, твой вариант второе место при 500-600 тысячах :)
#49
by dimoff
Я несколько раз написал - в большинстве случаев на конкретной фирме реальный уровень вложенности чаще всего известен.
#50
by Aprobator
здесь идет речь конкретно о справочнике подразделения см. . Как то тяжелоа представить организацию с 500 - 600 тыс. подразделений :)
#52
by Aprobator
а можно немного урезать (кроме того, что подчинение может быть не только группе) и с учетом того, что эта функция должна вызываться тока для элементов справочника с уровнем не равным 0:
#54
by Aprobator
опс ошиься чуть. [1С] Функция ПолучитьВерхнегоРодителя(Ссылка) Если Ссылка.Родитель.Пустая Тогда Возврат Ссылка; Иначе Возврат ПолучитьВерхнегоРодителя(Ссылка.Родитель) КонецЕсли; КонецФункции [/С]
#55
by Aprobator
дык я о том как урезать. Честно говоря с такой задачей не сталкивался, потому типовые не смотрел. Первое что в голову пришло. Хотя по логике цикл будет правильнее - память не будет кушать. Надо будет взять на вооружение. Мало ли когда приспичит.
#57
by queit
всем спасибо за мысли и предложения... ввел ограничение на кол-во уровней, вернее приблизительно прикинул максимальное число уровней (взял 10, т.к. сомневаюсь что будет больше, а если и будет, то можно быстро подправить) получилось следующее: ВЫБРАТЬ ИЗ
#59
by Aprobator
Не то слово. и в ИНАЧЕ наверное все таки стоит запихать пустую ссылку, а не ссылку на самого себя.
#60
by hhhh
Зачем вложенный запрос непонятно. Выбор Когда Спр.Родитель = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) Тогда Спр.Ссылка Когда Спр.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) Тогда .... ИЗ Справочник.Подразделения КАК Спр
#62
by queit
, благодарю за уменые мысли ;) на данном этапе думаю остановиться, дальше оптимизировать не вижу смысла:
#66
by Aprobator
дык о чем и речь. Родителя нет и возвращается ссылка на сам элемент вместо пустого значения.
#67
by queit
согласен =) просто у меня не может быть ситуации, когда пустой родитель...в пусть таком случае пусть ссылается сам на себя
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Получение обновления
- Получение почты
- Как получить название группы справочника зная элемент этой группы?
- Группы внутри группы...
- 8-ка, получение значения из списка значений, по Строковому представлению
- получение из одного материала двух видов продукции 1С
- Получение почты: получение только непрочитанных сообщений?
- Получение самого верхнего родителя справочника в запросе
В этой группе 1С
- Как програмно внести данные в табличную часть справочника
- Открыть отчет в новом окне
- Как отобрать измерения в запросе определенного типа
- левое соединение по регистратору или обращение к полю
- Как в запросе дату выразить как Дата, а не Дата+время?
- Интеграция САП и 1С
- как программно открыть форму "редактирование списка значений"
- Изменять ширину колонок в табличном поле. КАК?!
- последних из регистра сведений Работники организации
- Определенный диапазон колонок у Excel (ADODB)
- Как вывести в отчете 1С 8.1 на каждом листе внизу табличку с переменными данными (ана
- Комплексная автоматизация на v8 - чем отличается от УПП?
- автозапуск внешней обработки из 1с
- УПП: первоначальная стоимость ОС
- Как получить уникальный код элемента справочника?
- Реализация одного и того же товара с НДС и Без НДС в Рознице в УПП 8.1
- JOB: Коммерческое предложение
- СКД: Как сделать выпадающий список у значения параметра в СКД
- Отчет по неликвидным товарам. Алгоритм.
- Серверы хранилища конфигурации 1с81 и 1с82 на одном сервере