Переносим иерархию групп и элементов из одной папки в другую.

Задача: В справочнике "Номенклатура" есть две группы "Неактуальная номенклатура" и "Актуальная номенклатура". Нужно перенести номенклатуру вместе с иерархией групп и элементов из группы "Нактуальная номенклатура" в группу "Актуальная номенклатура".

Разделим задачу на два этапа: сначала скопируем иерархию групп, а потом перенесём элементы. Подробно остановимся только на первом этапе, так как второй не вызывает сложностей.

Текст запроса для копирования групп:

Запрос.Текст = 
"ВЫБРАТЬ
|	Номенклатура.Ссылка КАК НеактуальнаяГруппа,
|	Номенклатура.Наименование КАК НаименованиеНеактуальнойГруппы
|ПОМЕСТИТЬ ВТ_НеактуальныеГруппы
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|	Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНеактуальнаяНоменклатура)
|	И Номенклатура.ЭтоГруппа = ИСТИНА
|
|СГРУППИРОВАТЬ ПО
|	Номенклатура.Ссылка,
|	Номенклатура.Наименование
|
|ИНДЕКСИРОВАТЬ ПО
|	НаименованиеНеактуальнойГруппы
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	НеактуальныеГруппы.НеактуальнаяГруппа,
|	НеактуальныеГруппы.НаименованиеНеактуальнойГруппы КАК НаименованиеНеактуальнойГруппы,
|	НеактуальныеГруппы.НеактуальнаяГруппа.Родитель КАК РодительНеактуальнойГруппы,
|	НеактуальныеГруппы.НеактуальнаяГруппа.Родитель.Наименование КАК НаименованиеРодителяНеактуальнойГруппы,
|	Номенклатура.Ссылка КАК АктуальнаяГруппа
|ИЗ
|	ВТ_НеактуальныеГруппы КАК НеактуальныеГруппы
|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
|		ПО НеактуальныеГруппы.НаименованиеНеактуальнойГруппы = Номенклатура.Наименование
|			И (Номенклатура.Ссылка В ИЕРАРХИИ (&ГруппаАктуальнаяНоменклатура))
|			И Номенклатура.Ссылка.ЭтоГруппа = Истина
|
|СГРУППИРОВАТЬ ПО
|	НеактуальныеГруппы.НеактуальнаяГруппа,
|	НеактуальныеГруппы.НаименованиеНеактуальнойГруппы,
|	НеактуальныеГруппы.НеактуальнаяГруппа.Родитель,
|	Номенклатура.Ссылка
|
|УПОРЯДОЧИТЬ ПО
|	НеактуальныеГруппы.НеактуальнаяГруппа ИЕРАРХИЯ,
|	НеактуальныеГруппы.НаименованиеНеактуальнойГруппы";
	
Запрос.УстановитьПараметр("ГруппаНеактуальнаяНоменклатура", Справочники.Номенклатура.НайтиПоНаименованию("Неактуальная номенклатура"));
Запрос.УстановитьПараметр("ГруппаАктуальнаяНоменклатура", Справочники.Номенклатура.НайтиПоНаименованию("Актуальная номенклатура"));
Результат = Запрос.Выполнить();

Во временную таблицу ВТ_НеактуальныеГруппы мы выбираем вложенные группы из "Неактуальная номенклатура". Далее "левым соединением" выбираем группы из "Актуальная номенклатура", условие связи – равенство наименования.

При обходе выборки запроса мы будем создавать недостающие группы в папке "Актуальная номенклатура". Главная сложность в том, чтобы в выборке группы располагались с учётом иерархии. То есть, сначала должен идти родитель, потом подчинённые элементы, иначе возникнут трудности при заполнении реквизита "Родитель" для вновь создаваемых групп. Для выстраивания выборки в таком порядке, в запросе задаём упорядочивание:

|УПОРЯДОЧИТЬ ПО
|	НеактуальныеГруппы.НеактуальнаяГруппа ИЕРАРХИЯ

Осталось обработать выборку – создать группы, и потом перенести элементы номенклатуры.