Вставить строки в новое Дерево Значений с такой же иерархией как в старом
Здравствуйте, у меня есть дерево значений у которого у некоторых строк стоит галочка "НеТиповой". Я отобрал строки таким образом
Как мне теперь постепенно вставлять строки (которые соответствуют отбору) в новое дерево при этом сохраняя структуру? (Нужны только ветви у которых есть галочка)
Первое фото это как выводится ДЗ сейчас, вторая это как я пытаюсь сделать но не получается(
Подскажите пожалуйста как это сделать
&НаСервере
Процедура ВотТакВот()
Дерево = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
НовоеДерево = Дерево.Скопировать();
НовоеДерево.Строки.Очистить();
ПоехалиРекурсировать(Дерево, НовоеДерево);
ЗначениеВРеквизитФормы(НовоеДерево,"РезультатСравнения");
КонецПроцедуры
&НаСервере
Процедура ПоехалиРекурсировать(Дерево, НовоеДерево)
СтрокиДЗ = Дерево.Строки;
ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("НеТиповой", Истина);
Для Каждого ТекСтр Из СтрокиДЗ Цикл
МассивНайденных = ТекСтр.Строки.НайтиСтроки(ПараметрыПоиска, Истина);
// И проверку еще на последний элемент потом элемент
Если МассивНайденных.Количество() <> 0 Тогда
НоваяСтрока = НовоеДерево.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтр);
КонецЕсли;
ПоехалиРекурсировать(ТекСтр, НовоеДерево);
КонецЦикла;
КонецПроцедуры
ПоказатьКак мне теперь постепенно вставлять строки (которые соответствуют отбору) в новое дерево при этом сохраняя структуру? (Нужны только ветви у которых есть галочка)
Первое фото это как выводится ДЗ сейчас, вторая это как я пытаюсь сделать но не получается(
Подскажите пожалуйста как это сделать
Прикрепленные файлы:
![](/upload/forum/upload/56c/56ca8710b90fc0e5ce6c1b885f474907.png)
![](/upload/forum/662/662ebb546916e03057504617a09fdb00.png)
По теме из базы знаний
- Регулярные выражения – это просто. Построитель и отладчик регулярных выражений
- Интеграция сценарного тестирования в процесс разработки
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- Тонкости и подводные камни работы типового модуля интеграции Битрикс24 и 1С (Часть 2)
- Управление сборкой. Расширение для конфигурации СППР
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Можно предложить немного другой вариант - использовать условное оформление.
Пример во вложении.
При открытии формы заполнится дерево.
Можно в дереве ставить флаги в колонке Флаг.
После этого нажать кнопку Отобрать - останутся только отмеченные строки и родители.
Пример во вложении.
При открытии формы заполнится дерево.
Можно в дереве ставить флаги в колонке Флаг.
После этого нажать кнопку Отобрать - останутся только отмеченные строки и родители.
Прикрепленные файлы:
ТестОтбораДерева.epf
![](/upload/forum/upload/2e5/2e5bf5acfc5485e8c11e9ba42aef2129.png)
![](/upload/forum/upload/f18/f18d69f2bc7b496a923d698701eacfca.png)
1С обходит дерево начиная с корневых уровней и на этом этапе знать что внутри невозможно.
Альтернативный вариант обходить дерево не по структуре вложенности, а по уровням, начиная с самых вложенных, но 1С так не умеет. В 1С есть объект строка и в ней есть коллекция строки.
Поэтому только, либо добавляя временную колонку, которую проще потом удалить. Либо создавать какие-то временные структуры, в которых что-то временно хранить и поиск есть там что-то или нет. Поиск это долго.
В 1С проще добавить колонку посчитать, удалить лишние строки и потом удалить лишнюю колонку. Если в новое дерево, то ... понятно что.
Альтернативный вариант обходить дерево не по структуре вложенности, а по уровням, начиная с самых вложенных, но 1С так не умеет. В 1С есть объект строка и в ней есть коллекция строки.
Поэтому только, либо добавляя временную колонку, которую проще потом удалить. Либо создавать какие-то временные структуры, в которых что-то временно хранить и поиск есть там что-то или нет. Поиск это долго.
В 1С проще добавить колонку посчитать, удалить лишние строки и потом удалить лишнюю колонку. Если в новое дерево, то ... понятно что.
(5) А если таких строк пять, то добавите только одну?
Если вы не добавите родителя, то куда вы вложенные строки в галочкой будите добавлять?
Если вы всегда будите добавлять родителя, то чем будет отличаться новое дерево? Только строками самого нижнего уровня? И сколько раз надо запускать обработку?
Я ведь с помощью найти строки выясняю подходит мне или нет
Не надо ничего искать. У вас два раза рекурсия дерева. За первый проход считаем, за второй уже выясняем надо добавлять или нет.Если МассивНайденных.Количество() <> 0 Тогда
Если вы не добавите родителя, то куда вы вложенные строки в галочкой будите добавлять?
Если вы всегда будите добавлять родителя, то чем будет отличаться новое дерево? Только строками самого нижнего уровня? И сколько раз надо запускать обработку?
можно пойти другим путем (как обычно)
у вас же, уже есть процедура, которая как-то формирует ваше первое дерево!
доработайте ее что бы она могла формировать ДЗ с учетом отбора!
передаете в свою процедуру отбор, и при формировании/построении дерева проверяете элементы, если они
отвечают условиям отбора - добавляете в дерево, иначе пропускаете
у вас же, уже есть процедура, которая как-то формирует ваше первое дерево!
доработайте ее что бы она могла формировать ДЗ с учетом отбора!
передаете в свою процедуру отбор, и при формировании/построении дерева проверяете элементы, если они
отвечают условиям отбора - добавляете в дерево, иначе пропускаете
(7) Что делает отбор? Пусть у вас 10-ть уровней вложенности. На десятом где-то стоит галочка. Как узнать при проходе на пятом уровне, что на 10-м есть галочка или нет. Другими словами когда вы стоите на пятом уровне как вам узнать - текущую строку добавлять или нет? Или вы предлагаете на каждом проходе запускать вложенную рекурсию поиска. Рекурсия поиска в рекурсии добавления строк - зачем насиловать и без того медленную 1С, и зачем так сложно? :-)
(12)
Вы на каждом следующем уровне по факту одно и тоже ищете. Можно вообще ничего не искать. За один проход, а вы всё равно проходите рекурсией по дереву, проще просто посчитать. Не обязательно число может быть. Можно логического типа и удалить везде где ложь. Суть та же - разная реализация.
Ну то есть с тем что я сделал никуда дальше никак не уйти?)
Поиск в цикле не айс.
Вы на каждом следующем уровне по факту одно и тоже ищете. Можно вообще ничего не искать. За один проход, а вы всё равно проходите рекурсией по дереву, проще просто посчитать. Не обязательно число может быть. Можно логического типа и удалить везде где ложь. Суть та же - разная реализация.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот