|
Самое быстрое заполнение дерева значений иерархическим списком | ☑ | ||
---|---|---|---|---|
0
ac13
16.06.20
✎
08:57
|
Как быстро заполнить дерево значений иерархическим справочником?
Пусть это будет мега уродский метод, главное самый быстрый. Обход результата запроса с группировкой по иерархии очень медленный, поэтому я использую следующий извращенный способ, но и он недостаточно скоро выполняется. Получаю таблицу значений (сам запрос выполняется быстро): Номенклатура КАК Уровень4 Номенклатура.Родитель КАК Уровень3 Номенклатура.Родитель.Родитель КАК Уровень2 Номенклатура.Родитель.Родитель.Родитель КАК Уровень1 Дальше делаю прямой обход по таблице и заполняю дерево: Уровень1 = 0; Уровень2 = 0; Уровень3 = 0; Уровень4 = 0; Для каждого Стр из ТЗ Цикл Если Стр.Уровень1 <> Уровень1 Тогда НС1 = ДеревоЗначений.Строки.Добавить(); НС1.Номенклатура = Стр.Уровень1; Если Стр.Уровень2 <> Уровень2 Тогда НС2 = НС1.Строки.Добавить(); НС2.Номенклатура = Стр.Уровень2; Если Стр.Уровень3 <> Уровень3 Тогда НС3 = НС2.Строки.Добавить(); НС3.Номенклатура = Стр.Уровень3; НС4 = НС3.Строки.Добавить(); НС4.Номенклатура = Стр.Уровень1; Строки3 = НС3; КонецЕсли; Строки2 = НС2; КонецЕсли; Строки1 = НС1; Иначе Если Стр.Уровень2 <> Уровень2 Тогда НС2 = Строки1.Строки.Добавить(); НС2.Номенклатура = Стр.Уровень2; Если Стр.Уровень3 <> Уровень3 Тогда НС3 = НС2.Строки.Добавить(); НС3.Номенклатура = Стр.Уровень3; НС4 = НС3.Строки.Добавить(); НС4.Номенклатура = Стр.Уровень1; Строки3 = НС3; КонецЕсли; Строки2 = НС2; Иначе Если Стр.Уровень3 <> Уровень3 Тогда НС3 = Строки2.Строки.Добавить(); НС3.Номенклатура = Стр.Уровень3; НС4 = НС3.Строки.Добавить(); НС4.Номенклатура = Стр.Уровень1; Строки3 = НС3; Иначе НС4 = Строки3.Строки.Добавить(); НС4.Номенклатура = Стр.Уровень1; КонецЕсли; КонецЕсли; КонецЕсли; Уровень1 = Стр.Уровень1; Уровень2 = Стр.Уровень2; Уровень3 = Стр.Уровень3; Уровень4 = Стр.Уровень4; КонецЦикла; |
|||
1
ac13
16.06.20
✎
08:58
|
Можно быстрее? Когда обрабатывается 60000 строк, время заполнения может занимать до 15 минут.
|
|||
2
dka80
16.06.20
✎
09:02
|
Заполнить дерево выгрузив (а не обходя) в него результат запроса с группировками
|
|||
3
Веселый собака
16.06.20
✎
09:03
|
выгрузить с иерархией
|
|||
4
Конструктор1С
16.06.20
✎
09:20
|
А зачем ты сразу 60 тыщ строк вываливаешь? Кто-то будет их все читать? Выведи верхний уровень и подуровень. Если пользователь начнет разворачивать ветку (обработчик события есть подходящий), выводи на уровень глубже, и так далее
|
|||
5
ac13
16.06.20
✎
09:29
|
(4) дерево выводится в развернутом виде, так пользователю сразу нужно видеть самый низкий уровень, хотя это идея, можно попробовать, пусть разворачивают нужные ветки. спасибо!
|
|||
6
ac13
16.06.20
✎
09:31
|
(4) А как вывести, например, первый и второй уровень, при этом отображать плюсик для разворачивания более низкого уровня?
|
|||
7
Ненавижу 1С
гуру
16.06.20
✎
09:31
|
+(2) запрос с итогами, выгрузка с иерархией
|
|||
8
ASU_Diamond
16.06.20
✎
09:32
|
(0) через рекурсию было бы читабельнее
(5) в раскрытом виде он сколько искать будет нужный элемент в 60 000? всё равно по иерархии пойдет, да ещё сворачивать будет ненужные ветки. |
|||
9
Serg_1960
16.06.20
✎
09:50
|
Sorry, вопрос не в тему: хотел бы услышать задачу полностью и почему нельзя использовать иерархический справочник Номенклатура по прямому назначению?
|
|||
10
МихаилМ
16.06.20
✎
09:50
|
построитель запроса умеет тз в дерево значений конвертировать.
|
|||
11
Serg_1960
16.06.20
✎
09:58
|
Угу. И даже "умеет" так, что Дерево = Запрос.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
|
|||
12
Serg_1960
16.06.20
✎
10:00
|
PS: но 60 тысяч строк - убивает саму идею(смысл) выгрузки и показа юзверю.
|
|||
13
ac13
16.06.20
✎
10:15
|
(9) иерархический справочник загружается не полностью, а с определенными отборами.
загружаются не только элементы справочника, но еще связанные через регистр элементы другого справочника и после - обрабатывается сразу в дереве. на самом деле это был отчет и пользователи посчитали, что им удобнее всего будет работать с такой формой и сразу обрабатывать объекты. |
|||
14
ac13
16.06.20
✎
10:17
|
+(13) конечно можно было бы обрабатывать элементы прямо через форму отчета используя обработку расшифровки, но чтобы видеть результат - отчет придется переформировывать. перерисовывать табличный документ отчете ещё муторней. решил, что удобнее всего будет работать с деревом. одна проблема - быстро заполнить дерево.
но идея - не заполнять все уровни сразу более менее подходит, пока попробую так |
|||
15
Serg_1960
16.06.20
✎
10:32
|
(13) Ок. Имхо, задача сводится к построению такого запроса, который позволит выгрузить дерево сразу нужного вида, без постобработки.
|
|||
16
ac13
16.06.20
✎
10:45
|
(15) данных слишком много, одним запросом реально долго. лучше буду каждую ветку заполнять при раскрытии
|
|||
17
Конструктор1С
16.06.20
✎
11:28
|
(6) смотри по родителю.
первый уровень: Родитель = &ПустаяСсылка второй уровень: Родитель.Родитель = &ПустаяСсылка |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |