Таблица значений в дерево значений. #730233


#0 by kolts23381
Есть Таблица значений. Колонки у нее такие: категория,родительская категория,наименование категории. Нужно ее перевести в дерево значений. Какой алгоритм, а то бьюсь - не получается, пока только отсортировал таблицу :). Желательно чтоб работало побыстрее, потому что кое как циклом и я сделаю но будет скорей всего медленно.
#1 by mehfk
Передай таблицу в запрос. Добавь ИТОГИ в запрос. Выгрузи в ДЗ. Профит.
#2 by kolts23381
А несколько уровней вложенности будет работать?
#3 by iceman2112
сколько записей в тз?
#4 by iceman2112
и откуда ты эту таблицу получил? Это не справочник?
#5 by kolts23381
Нет, это не справочник. Таблицу я получил из ТЕКДОКА(система подбора запчастей для автомобилей). Теперь нужно постоить дерево категорий запчастей.
#6 by kolts23381
В таблице где то 300 записей и где-то 4 уровня вложенности
#7 by iceman2112
тогда сделай так чтобы "категория" была индентификатором строки в ТЗ. После первого цикла посчитаешь уровень вложенности для каждого элемента и максимально вложенный элемент, потом начнешь строить дерево с самого верхнего
#8 by iceman2112
получится что то районе 300х5 операции
#9 by iceman2112
Затупил, 300х2, после первого цикла сортируем во уровню вложенности или передаем таблицу в запрос и группируем по уровню вложенности, и после второго цикла уже получаем дерево
#10 by kolts23381
А можно подробнее, а то что то до меня не доходит.
#11 by kolts23381
Категория и родительская категория это числа а наименование это соответственно строка.
#12 by iceman2112
#13 by kolts23381
Кое какие подвижки есть, правда сделал по другому. Обычно когда что то долго не получается лучше оставить на завтра, но хочется добить. Сейчас другой косяк. Есть на форме элемент таблица значений. Тип значения - деревозначений, то есть именно здесь я и хочу отображать свое дерево. но мне нужно чтоб отображалась только одно колонка, в переменной деревозначений у меня 3 колонки. Добавить колонку в сам элемент не срабатывает, создатьколонки - создает 3 колонки. Попытался видимость колонок устанавивать в ложь но тогда вообще дерево не работает пропадают плюсики. КАК быть?
#14 by Zhuravlik
- это в качестве зарядки для мозгов. В - дело говорит.
#15 by Souvenire
Ничо не понял. А какая религия не позволяет ТЗ в запрос пихнуть?
#16 by kolts23381
2 года писал запросы изучая нюансы по мере необходимости, но сейчас не знаю как это сделать :).
#17 by Zhuravlik
"Есть на форме элемент таблица значений. Тип значения - деревозначений," - так и не понял, о чем это... Как-то так:
#18 by Souvenire
ТЗ из ТЧ документа? тогда типизация не нужна, можно как здесь: Про типизацию здесь: пример запроса в
#19 by GANR
В кои веки 1С-запросы (ИЕРАРХИЯ) помогали преобразовать таблицу вида (Отец, Сын, Поле1, поле2...) в дерево значений? СКД с Хрусталевским примером на 323 странице - это может быть, но я бы для решения этой задачи другой подход использовал. Для этого нужна РЕКУРСИЯ, на вход которой подаются "корневые" строки ТЗ - строки в которых Отец = Пусто, ну а далее - ищем для каждой строчки дочерние строки (где сын = отец, внук, правнук и пр.). Смысл понятен? Нагуглить сможешь?
#20 by Souvenire
во все веки. Про клюшки не знаю.
#21 by GANR
Если иерархия загнана в справочник или если дерево имеет фиксированный уровень вложенности - это поможет, но в топике ситуация явно другая.
#22 by kolts23381
Первым делом я гуглил. Так как когда у меня были деревья по программе в универе деревья я был далек от программирования и все списал то тему не усвоил. За 2 года эта надобность возникла в первый раз. Можно конечно отбросить мою обработку и погрузиться в дебри деревьев, но не сильно хочется. Пока сделал вот так, предварительно отсортировав таблицу по значению родительскаякатегория.     КонецЦикла; Вроде работает, буду проверять на предмет непредвиденных багов.
#23 by GANR
Подай на вход алгоритму 3-7 уровней вложенности
#24 by kolts23381
4-5 отработает быстро около 10 думаю будет долго.
#25 by GANR
в правильности уверен?
#26 by Souvenire
"фиксированный уровень вложенности" - это откуда? динамически изменяющееся количество колонок? сейчас пять, а потом 28?
#27 by 0xFFFFFF
Что за клюшечные мазохисты в ветке собрались? После 1го поста можно было закрывать.
#28 by kolts23381
Нет это значит что у одной строки может быть 3 подстроки а у другой 6 а еще одной ни одной. Вложенность относится к строкам. Запросом из не получилось. Появляются иногда какие то 3 строки не в том месте.
#29 by Souvenire
каждое поле, ИТОГИ по которой у тебя в запросе - в порядке следования и будут ветвями дерева. Я не понимаю о чем вы говорите.
#30 by kolts23381
Получается 3 уровня вложенности для каждой строки
#31 by kolts23381
По моему функция  ДеревоКатегорий.Строки.НайтиСтроки(СтруктураПоиска,Истина) Ищет только в непосредственных потомках
#32 by iceman2112
Такие вот мазохисты, кинь запрос этот плз.
#33 by iceman2112
Че гадать то, СП?
#34 by iceman2112
Я же тебе предложил отличный вариант, чтобы не заниматься такой ерундой типо, НайтиСтроки, сделать идентификатором индекс категории она же - у тебя поле "категория"
#35 by Zhuravlik
Из описания в я сделал вывод о трех уровнях вложенности. И если таблицу значений нужно превратить в дерево - святая моя уверенность - в восьмерке только запросом. И быстрее, и проще для понимания. Подобной проблемой я и сам страдал, когда сидел на клюшках - - вот до чего дошел в итоге. Это по-сути и есть преобразование плоской таблицы в дерево значений, с произвольным количеством группировок. И то, в итоге пришел к индексированной таблице которая раз и навсегда отучила страдать всякой фигней :)
#36 by GANR
Тогда вопрос: как указать запросу в секции ИТОГИ по какому полю строить иерархию неограниченного уровня вложенности? С иерархическим справочником то просто - там платформа сама все определит.
#37 by GANR
+ Да и какой это мазохизм - простенькая задачка требующая понимания рекурсивного механизма. Только и всего.
#38 by Zhuravlik
"неограниченного уровня вложенности" - в исходном условии не было таких слов. Для этого либо динамически формировать текст запроса, либо конечно рекурсией. С рекурсией дольше. И код сложнее.
#39 by kolts23381
Все не сплю, ковыряю. В общем проблема в том что дочерний узел создается раньше родительского это происходит из за того что индекс у него меньше чем у родительского. Надо либо нормализовать таблицу либо что-то другое думать. В принципе я так и думал что так может быть. Так и не дошли руки до твоего способа из поста , не разобрался я в нем пока.
#40 by GANR
Вот динамически текст запроса строить ни за что бы не стал в подобных ситуациях. Рекурсии сколько помню реализовывал - всегда выходили 20-30 строчек. Посмотри пункт 22 в топике - может на идеи натолкнет. ЗЫ могу сам написать, но хочу чтобы автор поднялся в программировании на ступеньку выше.
#41 by kolts23381
Из поста код работает но вылазят ошибки тогда когда ид категории меньше чем ид его родителя. То есть категория создается раньше чем ее родитель. В моем конкретном случае такого почти нет. Так как время поджимает я или оставлю так либо сделаю второй проход который будет это устранять.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

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