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

Контекстное меню и перемещение строк.

В итоге либо строки не двигаются, либо происходит бесконечное зацикливание и выкидывает с 1с. Так же стандартные кнопки перемещения( контектсное меню) не отрабатывают.

КоллекцияСтрокДереваЗначений.Сдвинуть (ValueTreeRowCollection.Move)
Синтаксис:
Сдвинуть(, )
Параметры:
(обязательный)
Тип: Число.
Индекс строки, которую надо сдвинуть.
(обязательный)
Тип: Число.
Количество строк, на которые необходимо сдвинуть строку. Положительное смещение обозначает увеличение текущего индекса (сдвиг к концу коллекции), отрицательное — уменьшение текущего индекса (сдвиг к началу коллекции).
Описание:
Сдвигает строку на указанное количество позиций в коллекции строк данного уровня дерева значений.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Пример:
// сдвинем первую строку на следующую позицию

СтрокиСостава.Сдвинуть(0, 1);
// сдвинем вторую строку на предыдущую позицию

СтрокиСостава.Сдвинуть(1, -1);
Использование в версии:
Доступен, начиная с версии 8.0.

(4) для примера я повесил событие на свою кнопку. То есть при нажатии на кнопку мы смотрим какая сейчас активная строка дерева. Берем строку родителя. А дальше у Строки родителя у реквизита «Строки» вызываем метод «Сдвинуть», в параметрах которого указываем строку, которую хотим подвинуть(нашу текущую строку) и то на сколько ее нужно переместить. Только надо еще проверки какие-нибудь чтобы не улететь за границы.
//В примере на гифке Строка2 и Строка3 подчинены Строка1

(5)
1. Первую строку не сдвинуть,так как родитель отсуствтует.
2. Выход за границы индексов таблицы: «неправильное смещение внутри коллекции».

(6) «Первую строку не сдвинуть». Попробуй напрямую обратиться к строкам верхнего уровня дерева ИмяТвоегоДерева.Строки.Сдвинуть(НужнаяСтрока, Смещение)

(9) Все, что связано с деревьями, не только понимать, но и объяснять сложно) Сейчас попробую перефразировать. Если у строки нет родителя, то это строка первого уровня, а коллекция строк первого уровня, на сколько я помню, это просто ИмяТвоегоДерева.Строки. Вот именно у этой коллекции и вызывай метод Сдвинуть() чтобы подвигать строку

Читайте также:  Каким клеем лучше склеивать дерево между собой

(10) А ну и перед делать проверку на то, что это первая строка ?

А по поводу метода количества() как проверять ?

Да, проверять, что у нее нет родителя

Если мы хотим двинуться вниз по дереву, то Примерно следующее:

ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли;

Аналогично при движении наверх

ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; ЭлементыФормы.ГруппировкиНаПечать.ТекущиеДанные.Родитель.Строки.Сдвинуть(ТекущаяСтрока,1); ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли;

Вот так ?
Всё равно ловлю ошибку "неправильное смещение внутри коллекци"
И ИндексТекущейСтроки < РодительТекущейСтроки.Строки это число и колеекциястрок. как их сравнивать..

Количество() я пропустил, когда Вам ответ писал.

Я еще только не проверял индекс с 0 начинается или с 1. Так что в отладчике проверьте и если что код на Количество()-1 подкорректируйте

(13)Сначала проверки, потом сдвиги, а то Вы сначала сдвиг делаете, а потом идете проверку делать и если она проходит, то еще один сдвиг. Примерно так должно быть:

ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; Если РодительТекущейСтроки = Неопределено Тогда РодительТекущейСтроки = ГруппировкиНаПечать; КонецЕсли; ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки.Количество() Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли;

(16)Скиньте Ваш код как он есть сейчас, я попробую у себя внешнюю обработку сделать и смоделировать чтобы все работало

ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; Если РодительТекущейСтроки = Неопределено Тогда РодительТекущейСтроки = ГруппировкиНаПечать; КонецЕсли; ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки.Количество() Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока,1); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли;

(16)Вот код и пример обработки. У меня работает:

Процедура КнопкаВнизНажатие(Элемент) ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; Если РодительТекущейСтроки = Неопределено Тогда РодительТекущейСтроки = ГруппировкиНаПечать; КонецЕсли; ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки < РодительТекущейСтроки.Строки.Количество() - 1 Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока, 1); Иначе Сообщить("Мы в конце уровня дерева. Вниз двигаться нельзя"); КонецЕсли; КонецПроцедуры Процедура КнопкаВВерхНажатие(Элемент) ТекущаяСтрока = ЭлементыФормы.ГруппировкиНаПечать.ТекущаяСтрока; РодительТекущейСтроки = ТекущаяСтрока.Родитель; Если РодительТекущейСтроки = Неопределено Тогда РодительТекущейСтроки = ГруппировкиНаПечать; КонецЕсли; ИндексТекущейСтроки = РодительТекущейСтроки.Строки.Индекс(ТекущаяСтрока); Если ИндексТекущейСтроки <>0 Тогда РодительТекущейСтроки.Строки.Сдвинуть(ТекущаяСтрока, -1); Иначе Сообщить("Мы в начале уровня дерева. Вверх двигаться нельзя"); КонецЕсли; КонецПроцедуры

(19) Открыл у себя. Попадаю в сообщение() всегда..
Плюс у Вас не программно стоят колонки и иеархия отсуствтует видимая.

Читайте также:  Какое дерево лучше всего для фасада кухни

(20)Строки дерева добавь в таком порядке. Добавь первую строку. Встань на нее фокусом и добавь вторую строку. Потом опять встань на первую строку фокусом и добавь третью строку. Вторая и третья строка у тебя окажутся подчинены первой. Затем попробую подвигать вторую и третью строки местами. Лень было реализовывать полноценный инструмент добавления строк ради демки.

Разве это важно для демонстрации перемещения строк? По моему нет, я сделал просто демку, которая показывает как работает перемещение, то что это действительно дерево видно в конфигураторе, то, что строки подчинены друг другу если их корректно внести тоже можно увидеть в конфигураторе

Если ГруппировкиНаПечать.Колонки.Количество() = 0 Тогда ГруппировкиНаПечать.Колонки.Добавить("Использовать", Новый ОписаниеТипов("Булево")); ГруппировкиНаПечать.Колонки.Добавить("Группировка", Новый ОписаниеТипов("Строка")); ГруппировкиНаПечать.Колонки.Добавить("Значение", Новый ОписаниеТипов("СписокЗначений")); Иначе Если ГруппировкиНаПечать.Колонки.Найти("Значение") = Неопределено Тогда ГруппировкиНаПечать.Колонки.Добавить("Значение", Новый ОписаниеТипов("СписокЗначений")); КонецЕсли; КонецЕсли; ЭлементыФормы.ГруппировкиНаПечать.СоздатьКолонки(); ЭлементыФормы.ГруппировкиНаПечать.ЧередованиеЦветовСтрок = Истина; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Использовать.ДанныеФлажка = ЭлементыФормы.ГруппировкиНаПечать.Колонки.Использовать.Данные; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Использовать.Данные = ""; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Использовать.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.КнопкаСпискаВыбора = Истина; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.РежимВыбораИзСписка = Истина; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.СписокВыбора.ДоступныеЗначения = ПолучитьСписокКолонокТаблицыТовары(); ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.СписокВыбора = ПолучитьСписокКолонокТаблицыТовары(); ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Группировка.ЭлементУправления.РежимВыбораНезаполненного = РежимВыбораНезаполненного.ПриАктивизации; ЭлементыФормы.ГруппировкиНаПечать.Колонки.Значение.РежимРедактирования = РежимРедактированияКолонки.Вход; ЭлементыФормы.ГруппировкиНаПечать.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;

Видимо из-за этого и криво работает.. То есть у меня иеарирхия, каждая строки подчинена другой..

сли ГруппировкиНаПечать.Колонки.Количество() = 0 Тогда

ГруппировкиНаПечать.Колонки.Добавить("Использовать", Новый ОписаниеТипов("Булево"));

ГруппировкиНаПечать.Колонки.Добавить("Группировка", Новый ОписаниеТипов("Строка"));

ГруппировкиНаПечать.Колонки.Добавить("Значение", Новый ОписаниеТипов("СписокЗначений"));

Если ГруппировкиНаПечать.Колонки.Найти("Значение") = Неопределено Тогда

ГруппировкиНаПечать.Колонки.Добавить("Значение", Новый ОписаниеТипов("СписокЗначений"));

Источник

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

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

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

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

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

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

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

Читайте также:  Stardew valley чайное дерево

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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