gifts2017

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

Опубликовал arhal-ya@yandex.ru в раздел Программирование - Практика программирования

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

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

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

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

 

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

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

  

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


 

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

 

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

Скачать файлы

Наименование Файл Версия Размер
КопированиеГруппыСправочникаСЭлементами 79
.epf 6,76Kb
03.04.12
79
.epf 6,76Kb Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение

Комментарии

1. Алексей Ермилов (Alex_E) 04.04.12 07:25
А просто взять и мышкой перетащить не судьба?
2. Николай (rinatru) 04.04.12 07:59
есть аналог... уже с выбором справочника в форме.
давайте не будем плодить плохие клоны.
умение пользоваться методом Скопировать() похвально, рад за вас
3. Сергей Рудаков (fishca) 04.04.12 09:13
стандартного функционала разве не достаточно?
Прикрепленные файлы:
4. arhal (arhal-ya@yandex.ru) 04.04.12 09:29
(1) Alex_E,
1. Пробовал в 8.1? Может у тебя судьба отличная от всех остальных пользователей 1с?
2. Читай внимательнее тему, особенно слово "Копирование".
5. arhal (arhal-ya@yandex.ru) 04.04.12 09:30
(3) fishca,
Еще раз - читаем слово "Копирование" в теме публикации.
6. Алексей Ермилов (Alex_E) 04.04.12 09:38
(4) arhal, Судьба у мня обычная. Переносить из группы в группу можно было ещё в 7.7, кнопочка соответственная была и в 7.7 и в 8.0 и в 8.1 и в 8.2. В 8.2 можно ещё и мышкой. Слово копирование в публикации - крутое слово. Для чего - непонятно :-( Может что бы создать несколько одинаковых элементов номенклатуры в разных папках?
7. arhal (arhal-ya@yandex.ru) 04.04.12 09:40
(2) rinatru,
Не встречал.
Во первых это простой оригинальный инструмент а не клон. Кстати, не увидел ссылку на аналог.
Во вторых не претендует на универсальность типа выбора справочника - потому и делюсь задаром.
По поводу "Скопировать()" - это пафос уставшего от своей значимости кодера 1С? Зачем тогда было вообще лезть в код если и так все знаешь и умеешь? Тем более в такой "плохой клон".
8. arhal (arhal-ya@yandex.ru) 04.04.12 09:48
(6) Alex_E,
Слово копирование в публикации - крутое слово. Для чего - непонятно :-( Может что бы создать несколько одинаковых элементов номенклатуры в разных папках?
Правильно, а если внимательнее почитать тему, то не только элементов, но и групп с учетом вложенной иерархии. Насчет "крутое" не знаю - слово как слово, меня особо не впечатляет:)
9. Николай (rinatru) 04.04.12 09:58
(7) arhal,

я не лез в код.. просто предположил, что использовался метод Скопировать()...
перед тем как выкладывать свой простой продукт, рекомендуется использовать поиск аналогов...
пафоса нет, просто рекомендация

аналог вот здесь -- >> http://infostart.ru/public/92395/
специально потратил 2 минуты, чтобы найти аналог и показать его тебе
10. arhal (arhal-ya@yandex.ru) 04.04.12 11:06
(9) rinatru,
пафоса нет
,
специально потратил 2 минуты
- ... :)
Посмотрел аналог - клоном и не пахнет. Справедливости ради надо заметить - удобней для конечного пользователя потому что есть выбор любого справочника. Использование транзакции наверно обусловлено скорее избыточностью алгоритма копирования (в котором, например может быть не найден родитель при копировании o_O) а не критичностью процесса.
Собственно резюме:
- для конечного пользователя лучше "аналог".
- для кодера, сисадмина и прочих причастных к 1с не только поверхностно - лучше "мой плохой клон" потому как алгоритм раза в три проще и допиливать, соответственно, удобнее.
11. Roni Smith (Roni) 25.04.12 15:09
Я тоже считаю что не аналог. А когда нужно скопировать более 1000 элементов мышкой пощелкать тяжеловато будет...
12. Ranika (Ranika) 25.04.12 15:10
Спасибо! Просто, удобно :)
14. yuraskas Рупышев (yuraskas) 19.09.13 16:59
15. yuraskas Рупышев (yuraskas) 27.09.13 09:44
Код не рабочий. Иерархия не сохраняется.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа