Изменить строку дерево значений 1с

Как у строки дерева поменять родителя?

есть большое дерево (порядка 100тыс элементов) как перетащить ветку целиком к другому узлу?

копировать и потом удальть — не камильфо.

СтрокаДереваЗначений (ValueTreeRow)
Родитель (Parent)
Использование:

Процедура ПеренестиТекущуюЕдиницуВРодителя(СсылкаЧтоКидаем,СсылкаКудаКидаем)
Если СсылкаКудаКидаем=Неопределено Тогда
СсылкаКудаКидаем=Справочники.ЕдиницыКонфигурации.ПустаяСсылка();
КонецЕсли;
ОбъектЧтоКидаем=СсылкаЧтоКидаем.ПолучитьОбъект();
ОбъектЧтоКидаем.Родитель=СсылкаКудаКидаем.Ссылка;
ОбъектЧтоКидаем.Записать();
ОбновитьЕдиницыКонфигурации(Новый Массив);
КонецПроцедуры

(8) Предлагаешь выгрузить дерево в иерархический справочник, поменять родителя, загрузить дерево из иерархического справочника?

(10) в моей задачи так и требовалось, т.к. потом отчеты вывожу иерархические 🙂 иерархию мне надо было сохранять (компы и их конфигурация)

(+11) потом удобно списывать (перемещать)всё это оборудование с программным обеспечением разом за один мах и иерархия сохраняется причем :).

столкнулся с аналогичной проблемой. У меня иерархия файловой системы, приходиться удалять и добавлять заново.

(14) Если у переносимой ветки нет подстрок, то этого достаточно, иначе между заполнением и удаление вставить цикл по подстрокам с рекусивным вызовом

СкопироватьУзелДерева (мСтрокаДерева.Строки, НайденаяСтрока);
НайденаяСтрока.Родитель.Строки.Удалить(НайденаяСтрока);

Процедура СкопироватьУзелДерева (СтрокиПолучателя, УзелИсточник)
НоваяСтрока = СтрокиПолучателя.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, УзелИсточник);
Для каждого эл Из УзелИсточник.Строки Цикл
СкопироватьУзелДерева (НоваяСтрока.Строки, эл);
КонецЦикла;
КонецПроцедуры

Процедура Перенести(Ветка,Куда)
НоваяВетка=Куда.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяВетка,Ветка);
Для каждого ПодСтрока из Ветка.Строки цикл Перенести(Подстрока,НоваяВетка); КонецЦикла;
Ветка.Родитель.Строки.Удалить(Ветка);
КонецПроцедуры

Параметры: Ветка,куда — строки дерева значений

Кстати, согласен, сначала скопировать все, а потом удалить только голову, вероятно, немного быстрее будет, чем всех дочек поэлементно удалять.

Процедура Скопировать(Ветка,Куда)
НоваяВетка=Куда.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяВетка,Ветка);
Для каждого ПодСтрока из Ветка.Строки цикл Перенести(Подстрока,НоваяВетка); КонецЦикла;
КонецПроцедуры

Процедура Перенести(Ветка,Куда)
Скопировать(Ветка,Куда);
Ветка.Родитель.Строки.Удалить(Ветка);
КонецПроцедуры

(0)может надо поменять структуру данных?
например использовать не дерево а структуру и ТЗ? или еще как

если речь о дереве значений то использовать метод ПереместитьУзел(УзелПриемник, УзелПеремещения)

и тот и другой узел может являться просто корнем пустого дерева, корнем не пустого дерева, строкой дерева, узлом дерева.

Всякий опытный программист имеет в своем арсенале этот метод для разных систем программирования, встроенного такого метода, как правило, нет.

(23) я бы проще обьяснил. в дереве каждая строка может иметь или не иметь родителя-подчиненных. Дальше просто включать здравый смысл.

дерево и каждая его строка — это коллекции вложенных строк, дальше здравый смысл)

Читайте также:  Дерево для участка декоративное

Источник

Дерево значений 1с. Описание и примеры использования

ДеревоЗначений — это программный объект встроенного языка, позволяющий строить произвольные иерархические наборы данных в памяти компьютера, отображать их в табличном и\или древовидном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать строки).

Как и таблица значений, дерево состоит из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Однако, в отличие от таблицы значений, строки дерева значений могут иметь подчиненные строки любой глубины вложенности.

Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.

Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.

Дерево значений является полностью динамическим объектом, т.е. Вы можете манипулировать не только строками дерева, добавляя и удаляя их, но и колонками.

Дерево значений может использоваться явно при создании в коде необходимого количества переменных типа ДеревоЗначений , либо неявно: при добавлении элемента управления ТабличноеПоле на обычную форму, и ТаблицаФормы — на управляемую. Здесь мы рассмотрим только программную работу с деревом значений.

Создание дерева значений

Как и большинство объектов встроенного языка, новая дерево значений может быть создано с помощью оператора Новый :

Свойства и методы дерева значений

Имя Тип Описание
Свойства
Колонки КоллекцияКолонокДереваЗначений содержит коллекцию колонок дерева значений
Строки КоллекцияСтрокДереваЗначений содержит коллекцию корневых строк дерева значений
Методы
ВыбратьСтроку() СтрокаДереваЗначений открывает диалог для интерактивного выбора строки дерева значений
Скопировать() ДеревоЗначений создает новый объект копированием текущего (копируются все колонки и строки)

Колонки дерева значений

Прежде чем начать работу с деревом значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:

Имя Тип Описание
Имя Строка символьный идентификатор колонки, по которому к ней можно обращаться из кода. Может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания
Заголовок Строка строковое представление колонки на форме. Может содержать произвольные символы
ТипЗначения ОписаниеТипов тип значения содержимого ячеек в этой колонке. Свойство ограничивает пространство доступных значений, которые можно указать в данной колонке
Ширина Число ширина колонки на форме (выражается в количестве символов)

Доступ к колонкам производится через свойство Колонки объекта ДеревоЗначений . Для добавления новой колонки используется метод Колонки.Добавить():

дз.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); дз.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); дз.Колонки.Добавить("Свойство");//можно хранить произвольные данные 

Для того, чтобы определить наличие колонки с нужным именем используется метод Колонки.Найти():

найдКолонка = дз.Колонки.Найти("Наименование"); Если найдКолонка = Неопределено Тогда Сообщить("Колонка не найдена!"); Иначе Сообщить("Индекс колонки color: red;">+ дз.Колонки.Индекс(найдКолонка)); КонецЕсли; 

Перебор колонок выполняется следующим образом:

Для каждого Колонка Из дз.Колонки Цикл Сообщить(Колонка.Имя + ": " + Колонка.ТипЗначения); КонецЦикла; //Результат: // Наименование: Строка // Количество: Число // Свойство: 

Для удаления колонки используется метод Колонки.Удалить():

найдКолонка = дз.Колонки.Найти("Свойство"); Если НЕ найдКолонка = Неопределено Тогда дз.Колонки.Удалить(найдКолонка); КонецЕсли; 

Методы коллекции колонок дерева значений

Вставить() Вставляет новую колонку в указанную позицию коллекции
Добавить() Добавляет новую колонку в конец коллекции
Индекс() Возвращает индекс колонки в коллекции колонок
Получить() Возвращает колонку по ее индексу
Количество() Возвращает количество колонок в коллекции
Найти() Ищет колонку в коллекции по имени
Очистить() Удаляет все колонки из коллекции
Сдвинуть() Сдвигает колонку влево или вправо
Удалить() Удаляет колонку из коллекции
Читайте также:  Лимон дерево символ чего

Строки дерева значений

С колонками разобрались. Давайте теперь разберемся со строками. Строки дерева значений можно программно добавлять и удалять, перемещать и сортировать, а также выполнять операции поиска и отбора.

В отличие от таблицы значений, доступ к строкам дерева значений производится через свойство Строки объекта ДеревоЗначений или объекта СтрокаДереваЗначений . Каждая строка является узлом иерархии, поэтому обладает следующими свойствами и методами:

Имя Тип Описание
Свойства
Родитель СтрокаДереваЗначений ссылается на строку верхнего уровня. Для корневой строки имеет значение Неопределено
Строки КоллекцияСтрокДереваЗначений содержит коллекцию подчиненных строк
Методы
Владелец() ДеревоЗначений возвращает ссылку на дерево значений, которому принадлежит строка
Уровень() Число возвращает уровень вложенности строки в иерархии дерева. Для строки, не имеющей родителя, уровень будет равен 0 (верхний уровень или корневой уровень). Подчиненная ей строка будет иметь уровень 1 и т.д.

Добавление и удаление строк

Для добавления новой строки используется метод Строки.Добавить(). Метод возвращает объект СтрокаДереваЗначений , с которым доступны дальнейшие манипуляции:

СтрокаДЗ = дз.Строки.Добавить(); 

И только теперь мы можем заполнить строку данными. Для этого обращаемся к ячейкам строки, указывая идентификаторы колонок через точку:

СтрокаДЗ.Наименование = "Стул деревянный"; СтрокаДЗ.Количество = 1; СтрокаДЗ.Свойство = ТекущаяДата(); 

Для удаления строки используется метод Строки.Удалить(). Строку можно удалить передав методу либо саму строку, либо ее индекс:

//удаление строки дз.Строки.Удалить(СтрокаДЗ); //удаление по индексу ИндексСтроки = дз.Строки.Индекс(СтрокаДЗ); дз.Строки.Удалить(ИндексСтроки); //безопасное удаление НайдСтрока = дз.Строки.Найти("Стул деревянный", "Наименование"); Если НЕ НайдСтрока = Неопределено Тогда дз.Строки.Удалить(НайдСтрока); КонецЕсли; 

Перебор строк дерева значений

Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :

Для Каждого СтрокаДЗ Из дз.Строки Цикл ИндСтроки = дз.Строки.Индекс(СтрокаДЗ); Сообщить("Строка[" + ИндСтроки + "]: " + СтрокаДЗ.Наименование); КонецЦикла; //в редких случаях Для ИндСтроки = 0 По дз.Строки.Количество() - 1 Цикл СтрокаДЗ = дз.Строки.Получить(ИндСтроки); Сообщить("Строка[" + ИндСтроки + "]: " + СтрокаДЗ.Наименование); КонецЦикла; 

Поиск строк

Поиск в дереве значений можно выполнять не только по значению в колонке (в этом случае будет возвращена первая найденная строка), но и по набору свойств (в этом случае возвращается массив строк).

//удаление первой найденной строки НайдСтрока = дз.Строки.Найти("Стул деревянный", "Наименование"); Если НЕ НайдСтрока = Неопределено Тогда дз.Строки.Удалить(НайдСтрока); КонецЕсли; //удаление всех найденных строк ПараметрыПоиска = Новый Структура("Наименование", "Стул деревянный"); мНайдСтроки = дз.Строки.НайтиСтроки(ПараметрыПоиска); Для каждого НайдСтрока Из мНайдСтроки Цикл дз.Строки.Удалить(НайдСтрока); КонецЦикла; 

Поиск возможен даже среди вложенных строк. Внимательно изучите документацию к методам Строки.Найти() и Строки.НайтиСтроки().

Читайте также:  Рыхлый мягкий центр дерева

Все методы коллекции строк дерева значений:

Вставить() Вставляет строку на указанное место коллекции строк
ВыгрузитьКолонку() Выгружает значения ячеек указанной колонки из текущей коллекции строк в массив значений
Добавить() Добавляет новую строку в коллекцию строк
ЗагрузитьКолонку() Загружает значения из массива в ячейки указанной колонки коллекции строк
Индекс() Возвращает индекс строки дерева значений в коллекции
Итог() Возвращает просуммированный итог по колонке дерева значений
Количество() Возвращает количество строк в коллекции строк
Найти() Выполняет поиск строки по значению
НайтиСтроки() Выполняет поиск строк по указанным параметрам
Очистить() Удаляет все строки из текущей коллекции строк
Получить() Возвращает строку по ее индексу
Сдвинуть() Сдвигает строку вверх или вниз по коллекции строк
Сортировать() Выполняет сортировку строк в коллекции по указанным колонкам
Удалить() Удаляет строку из коллекции строк

Иерархию свойств и типов значений, связанных с деревом значений, схематически можно представить в виде дерева:

Источник

Оцените статью