Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > Как обойти рекурсию


Автор: Maкsim 28.6.2010, 09:44
Есть код в нем рекурсивно происходит копирование группы справочника.

Можно ли обойтись без рекурсии? Я пробовал с помощью ТЗ но не могу восстановить 

иерархию?

Жду советов.




Перем ВидСпр;

//*----*----*----*----*----*----*----*----*----*----*----*----*----*----*
Процедура СкопироватьГруппу(НачГруппа, НовГруппа)
    НачСпр = СоздатьОбъект("Справочник."+ВидСпр);
    НовСпр = СоздатьОбъект("Справочник."+ВидСпр);
    
    НовСпр.ИспользоватьРодителя(НовГруппа);
    
    НачСпр.ИспользоватьРодителя(НачГруппа);
    НачСпр.ВыбратьЭлементы(1);
    Пока НачСпр.ПолучитьЭлемент()=1 Цикл
        Если НачСпр.Родитель<>НачГруппа Тогда
            Продолжить;
        КонецЕсли;     
        Если НачСпр.ЭтоГруппа()=1 Тогда
            НовСпр.НоваяГруппа();
            НовСпр.Наименование = НачСпр.Наименование;
            НовСпр.Записать();
            СкопироватьГруппу(НачСпр.ТекущийЭлемент(), НовСпр.ТекущийЭлемент());
            Продолжить;
        КонецЕсли;     
        НовСпр.Новый();
        НовСпр.Наименование = НачСпр.Наименование;
        НовСпр.Записать();
    КонецЦикла;
КонецПроцедуры //СкопироватьГруппу

//*----*----*----*----*----*----*----*----*----*----*----*----*----*----*
Процедура Сформировать()            
    Если ПустоеЗначение(ВыбГруппа)=1 Тогда
        Возврат;
    КонецЕсли;
    Если ВыбГруппа.ЭтоГруппа()=0 Тогда
        Возврат;
    КонецЕсли;
               
    ВидСпр = ВыбГруппа.Вид();
    Спр = СоздатьОбъект("Справочник."+ВидСпр);
    
    Спр.НоваяГруппа();
    Спр.Наименование = "Копия "+ВыбГруппа.Наименование;
    Спр.Записать();
    
    СкопироватьГруппу(ВыбГруппа, Спр.ТекущийЭлемент());
КонецПроцедуры

//*----*----*----*----*----*----*----*----*----*----*----*----*----*----*
Процедура ПриОткрытии()
    ВыбГруппа.ВыборГруппы(1);    
КонецПроцедуры //ПриОткрытии

Автор: AkelaSQL 28.6.2010, 10:04
А чем рекурсия-то не угодила?

Автор: Maкsim 28.6.2010, 10:09
А может быть так что рекурсия приведет к зависанию системы?

Мне нужно несколько алгоритмов решений.

Автор: AkelaSQL 28.6.2010, 10:20
Рекурсию можно заменить только циклом, но у него может быть такой-же недостаток....

Автор: Maкsim 28.6.2010, 10:22
А можно пример цикла

Автор: AkelaSQL 28.6.2010, 10:48
Ну право нет у меня времени и желания рисовать код, особенно не имея полноты описания задачи.

Как я догадываюсь (возможно ошибаюсь) задача заключается в том, чтобы скопировать группу и все вышестоящие уровни справочника. Так вот, решение этой задачи может быть достигнуто различными способами. Один из вариантов Ваш с рекурсией, он наиболее компактен и понятен. Можно поступить по другому:

1. Получить СпрНач.ПолныйКод() элемента (группы). Там указаны коды всех вышестоящих уровней через "/"
Распарсить эту строку, получить элементы по коду и создать их копии, я думаю не составит труда.

2. Использовать метод Уровень() и по его значению организовать цикл. Пока СпрНач.Уровень() > 0 Цикл ...

Добавлено через 1 минуту и 19 секунд
Или Пока ПустоеЗначение(Родитель) = 0 Цикл ....

Добавлено через 1 минуту и 46 секунд
 smile 

Автор: SaschaL 28.6.2010, 11:03
Можно просто:
Код

спр.ВыблатьЭлементы();
Пока Спр.ПолучитьЭлемент() =1 цикл
       Если Спр.ЭтоГруппа()=0 тогда
              // пишешь свой код по получению и внесению полученной информации

       КонецЕсли;
КонецЦикла;


Код приведен для 1С 7.7

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)