Копирование группы справочника с иерархией и элементами в другую группу


Копирование группы справочника с иерархией и элементами в другую группу

Как-то возникала необходимость, решил поделиться.

Естественно нужно поменять тип справочника в реквизитах обработки и в запросе на нужный вам.

Например, если вы хотите использовать эту обработку для справочника "Номенклатура", то вам надо зайти в реквизиты обработки и изменить тип реквизита "Откуда" и "Куда" на "СправочникСсылка.Номенклатура" и далее в модуле формы обработки в тексте запроса заменить "БизнесПроекты" на "Номенклатура". Т.е. вместо текста:

 

 Запрос = Новый Запрос("ВЫБРАТЬ
| БизнесПроекты.Ссылка
|ИЗ
| Справочник.БизнесПроекты КАК БизнесПроекты
|ГДЕ
| БизнесПроекты.Ссылка В ИЕРАРХИИ(&Группа)"
);

у вас должно получиться:

  

 Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)"
);


 

Вобщем, чтобы было нагляднее выкладываю весь код модуля формы:

 

Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос = Новый Запрос("ВЫБРАТЬ
| БизнесПроекты.Ссылка
|ИЗ
| Справочник.БизнесПроекты КАК БизнесПроекты
|ГДЕ
| БизнесПроекты.Ссылка В ИЕРАРХИИ(&Группа)"
);
Запрос.УстановитьПараметр("Группа", Откуда);
Результат = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
СЗ = Новый СписокЗначений; //Будем запихивать туда родителей
Пока Результат.Следующий() Цикл
ТекСпр = Результат.Ссылка.ПолучитьОбъект();
Если ТекСпр.Родитель = Откуда.Родитель Тогда //Копируем корень
Если НЕ ТекСпр.ЭтоГруппа Тогда
Предупреждение("Для элементов надо допилить, работает только для групп.",,"Аларм!");
Возврат;
КонецЕсли;
элементСправочника = ТекСпр.Скопировать();
элементСправочника.Родитель = Куда;
элементСправочника.Записать();
СЗ.Добавить(элементСправочника.Ссылка); //Запихали корневого родителя
Иначе  //Копируем все остальное
элементСправочника = ТекСпр.Скопировать();
элементСправочника.Родитель = СЗ[СЗ.Количество()-1].Значение;
элементСправочника.Записать();
Если ТекСпр.ЭтоГруппа Тогда
СЗ.Добавить(элементСправочника.Ссылка); //А здесь запихиваем всех остальных родителей
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Файлы обработки:

-