Контекстное меню и перемещение строк.
В итоге либо строки не двигаются, либо происходит бесконечное зацикливание и выкидывает с 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) в моей задачи так и требовалось, т.к. потом отчеты вывожу иерархические 🙂 иерархию мне надо было сохранять (компы и их конфигурация)
(+11) потом удобно списывать (перемещать)всё это оборудование с программным обеспечением разом за один мах и иерархия сохраняется причем :).
столкнулся с аналогичной проблемой. У меня иерархия файловой системы, приходиться удалять и добавлять заново.
(14) Если у переносимой ветки нет подстрок, то этого достаточно, иначе между заполнением и удаление вставить цикл по подстрокам с рекусивным вызовом
СкопироватьУзелДерева (мСтрокаДерева.Строки, НайденаяСтрока);
НайденаяСтрока.Родитель.Строки.Удалить(НайденаяСтрока);
Процедура СкопироватьУзелДерева (СтрокиПолучателя, УзелИсточник)
НоваяСтрока = СтрокиПолучателя.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, УзелИсточник);
Для каждого эл Из УзелИсточник.Строки Цикл
СкопироватьУзелДерева (НоваяСтрока.Строки, эл);
КонецЦикла;
КонецПроцедуры
Процедура Перенести(Ветка,Куда)
НоваяВетка=Куда.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяВетка,Ветка);
Для каждого ПодСтрока из Ветка.Строки цикл Перенести(Подстрока,НоваяВетка); КонецЦикла;
Ветка.Родитель.Строки.Удалить(Ветка);
КонецПроцедуры
Параметры: Ветка,куда - строки дерева значений
Кстати, согласен, сначала скопировать все, а потом удалить только голову, вероятно, немного быстрее будет, чем всех дочек поэлементно удалять.
Процедура Скопировать(Ветка,Куда)
НоваяВетка=Куда.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяВетка,Ветка);
Для каждого ПодСтрока из Ветка.Строки цикл Перенести(Подстрока,НоваяВетка); КонецЦикла;
КонецПроцедуры
Процедура Перенести(Ветка,Куда)
Скопировать(Ветка,Куда);
Ветка.Родитель.Строки.Удалить(Ветка);
КонецПроцедуры
(0)может надо поменять структуру данных?
например использовать не дерево а структуру и ТЗ? или еще как
если речь о дереве значений то использовать метод ПереместитьУзел(УзелПриемник, УзелПеремещения)
и тот и другой узел может являться просто корнем пустого дерева, корнем не пустого дерева, строкой дерева, узлом дерева.
Всякий опытный программист имеет в своем арсенале этот метод для разных систем программирования, встроенного такого метода, как правило, нет.
(23) я бы проще обьяснил. в дереве каждая строка может иметь или не иметь родителя-подчиненных. Дальше просто включать здравый смысл.
дерево и каждая его строка - это коллекции вложенных строк, дальше здравый смысл)
Источник