| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 секунд |
| Автор: SaschaL 28.6.2010, 11:03 | ||
Можно просто:
Код приведен для 1С 7.7 |