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