База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как перенести группу «05. КРЕПЕЖ» в папку «19. АВТОТОВАРЫ» в 1С дереве? › Ответ в теме: Как перенести группу «05. КРЕПЕЖ» в папку «19. АВТОТОВАРЫ» в 1С дереве?
Код, который вы привели, корректно реализует перенос узла дерева значений (группы «05. КРЕПЕЖ») в другую ветку (в папку «19. АВТОТОВАРЫ») с сохранением всех вложенных подузлов.
Разберу по шагам, что происходит и как это работает:
1. Выгрузка результата запроса в дерево значений с иерархией:
|
1 |
ДеревоВыгрузки = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); |
Это формирует структуру дерева, где каждая строка может содержать подчинённые строки в свойстве .Строки.
2. Поиск узлов по справочнику номенклатуры:
|
1 2 3 4 5 6 7 8 9 10 11 |
Для каждого Строка из ДеревоВыгрузки.Строки Цикл Если Строка.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("УТ000016443") Тогда // 19. АВТОТОВАРЫ СтрокаА = Строка; КонецЕсли; КонецЦикла; Для каждого Строка из ДеревоВыгрузки.Строки Цикл Если Строка.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00004044") Тогда // 05. КРЕПЕЖ СтрокаК = Строка; КонецЕсли; КонецЦикла; |
Здесь вы проходите по верхнему уровню дерева и находите две строки: папку «19. АВТОТОВАРЫ» и группу «05. КРЕПЕЖ».
3. Перенос группы «05. КРЕПЕЖ» в папку «19. АВТОТОВАРЫ»:
|
1 2 3 4 5 6 |
Если СтрокаА <> Неопределено И СтрокаК <> Неопределено Тогда НовСтрока = СтрокаА.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НовСтрока, СтрокаК); ПеренестиСтроки(НовСтрока, СтрокаК); ДеревоВыгрузки.Строки.Удалить(СтрокаК); КонецЕсли; |
— Создаёте новую строку в дочерних элементах папки «19. АВТОТОВАРЫ».
— Копируете все реквизиты из «05. КРЕПЕЖ» в новую строку.
— Вызываете процедуру ПеренестиСтроки, которая рекурсивно переносит все подчинённые строки из «05. КРЕПЕЖ» в новую строку.
— Удаляете исходную строку «05. КРЕПЕЖ» из корня дерева.
—
Что важно:
— Процедура ПеренестиСтроки должна быть реализована рекурсивно, чтобы скопировать все вложенные подузлы. Пример реализации:
|
1 2 3 4 5 6 7 |
Процедура ПеренестиСтроки(СтрокаПриемник, СтрокаИсточник) Для каждого ПодСтрока Из СтрокаИсточник.Строки Цикл НоваяПодСтрока = СтрокаПриемник.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НоваяПодСтрока, ПодСтрока); ПеренестиСтроки(НоваяПодСтрока, ПодСтрока); КонецЦикла; КонецПроцедуры |
— Если ПеренестиСтроки не реализована, вложенные элементы не будут перенесены.
— После удаления исходной строки «05. КРЕПЕЖ» в корне дерева, она будет только в новой ветке «19. АВТОТОВАРЫ».
—
Рекомендации:
— Убедитесь, что ПеренестиСтроки реализована именно так, как показано выше.
— Если дерево имеет несколько уровней вложенности, такой рекурсивный перенос сохранит всю структуру.
— Если нужно изменить ключи или связи в дереве (например, если есть поля КлючСтроки и КлючСвязи), то после переноса нужно обновить эти ключи, чтобы не было конфликтов.
—
Если нужно, могу помочь с полной реализацией процедуры переноса и обновления ключей в дереве значений.