Модераторы: stron
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обойти рекурсию 
:(
    Опции темы
Maкsim
Дата 28.6.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.6.2010

Репутация: нет
Всего: нет



Есть код в нем рекурсивно происходит копирование группы справочника.

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

иерархию?

Жду советов.




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

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

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

//*----*----*----*----*----*----*----*----*----*----*----*----*----*----*
Процедура ПриОткрытии()
    ВыбГруппа.ВыборГруппы(1);    
КонецПроцедуры //ПриОткрытии
PM MAIL   Вверх
AkelaSQL
Дата 28.6.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



А чем рекурсия-то не угодила?


--------------------
user posted image
PM MAIL ICQ   Вверх
Maкsim
Дата 28.6.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.6.2010

Репутация: нет
Всего: нет



А может быть так что рекурсия приведет к зависанию системы?

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

PM MAIL   Вверх
AkelaSQL
Дата 28.6.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



Рекурсию можно заменить только циклом, но у него может быть такой-же недостаток....


--------------------
user posted image
PM MAIL ICQ   Вверх
Maкsim
Дата 28.6.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.6.2010

Репутация: нет
Всего: нет



А можно пример цикла
PM MAIL   Вверх
AkelaSQL
Дата 28.6.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



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

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

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

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

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

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


--------------------
user posted image
PM MAIL ICQ   Вверх
SaschaL
Дата 28.6.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 880
Регистрация: 13.12.2006
Где: Челябинская обл г .Нязепетровcк

Репутация: 8
Всего: 9



Можно просто:
Код

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

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


Код приведен для 1С 7.7
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "1C: Предприятие, SAP, ERP и учётные системы"
stron

Запрещается!

1. Обсуждение крэков, кейгенов и других подобных программ

Пробуйте искать сами или обращайтесь в приват к участникам форума.

Темы с подобными вещами будут немедленно удаляться, а нарушители - получать предупреждения.

Также запрещается обсуждение проблем работы этих программ (что куда вписать, куда что скопировать и т.п...)

2. Давать ссылки на взломанные продукты

  • Пожалуйста, пользуйтесь поиском перед тем, как задать вопрос - возможно ответ уже есть на форуме.
  • Название темы должно отражать её суть
  • Действия модераторов можно обсудить здесь

С уважением, stron, Pegas.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | 1C: Предприятие, SAP, ERP и учётные системы | Следующая тема »


 




[ Время генерации скрипта: 0.0932 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.