Среда, 17.04.2024, 03:00
Приветствую Вас Гость
Главная | Регистрация | Вход

Вас приветствует программист 1с 8.х. Зовут меня Болгов Роман  
Мое резюме   Моя библиотека   Мои разработки

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Вопросы по 1с » Общие вопросы » Рекурсия в 1С Предприятии и управление деревом значений
Рекурсия в 1С Предприятии и управление деревом значений
boltoffДата: Среда, 29.09.2010, 12:01 | Сообщение # 1
Группа: Администраторы
Сообщений: 31
Статус: Offline
Термин «рекурсия» используется во многих областях знаний. В программировании рекурсия – вызов процедуры (функции) из нее же самой. Различают простую и сложную рекурсию. При простой рекурсии некоторая процедура А вызывает сама себя, пока не выполниться заданное условие выхода, или же бесконечно. В случае сложной рекурсии процедура А вызывает процедуру Б, которая опять вызывает процедуру А, и так далее до выполнения условия выхода или бесконечно. В сложной рекурсии может участвовать и больше двух процедур или функций.

Организовать рекурсию средствами встроенного языка 1С Предприятия очень легко. Вот пример простой рекурсии:

Процедура ПроцедураА()
ПроцедураА();
КонецПроцедуры

А это сложная рекурсия:

Процедура ПроцедураА()
ПроцедураБ();
КонецПроцедуры

Процедура ПроцедураБ()
ПроцедураА();
КонецПроцедуры

Оба фрагмента кода приведены исключительно для примера. При попытке их выполнить возникнет бесконечный цикл и, как результат, произойдет зависание системы, поскольку не задано условие выхода. Создадим рекурсию с условием выхода:

Процедура ВывестиЧисла(пЧисло)
Если пЧисло <= 100 Тогда
Сообщить(Строка(пЧисло));
пЧисло = пЧисло + 1;
ВывестиЧисла(пЧисло);
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры

ВывестиЧисла(1);

Этот фрагмент кода выведет в окно служебных сообщений 1С Предприятия числа от 1 до 100. После этого выполниться условие выхода и программа будет завершена. Процедура вызовет сама себя ровно 100 раз. Количество таких вызовов процедуры или функции называется глубиной рекурсии.

Реализация рекурсивных вызовов функций и процедур в практически применяемых языках и средах программирования, использует механизм стека вызовов — адрес возврата и локальные переменные функции записываются в стек, благодаря чему каждый следующий рекурсивный вызов этой функции пользуется своим набором локальных переменных и за этот счёт работает корректно.
Оборотной стороной этого довольно простого по структуре механизма является то, что рекурсивные вызовы не бесплатны — на каждый рекурсивный вызов требуется некоторое количество оперативной памяти компьютера, и при чрезмерно большой глубине рекурсии может наступить переполнение стека вызовов. Вследствие этого обычно рекомендуется избегать рекурсивных программ, которые приводят к слишком большой глубине рекурсии.
Пример с выводом чисел естественно не является оптимальным, он приведен только в целях демонстрации. На практике в этом случае гораздо удобнее использовать цикл. Рекурсию следует использовать там, где с помощью циклов решать задачу нецелесообразно.
В 1С Предприятии 8.х рекурсия может быть использована для решения задач управления деревом значений. Например, мы интерактивно изменяем пометку элемента, который находиться на одном из верхних уровней дерева значений. В таком случае пометки должны программно устанавливаться (или сниматься) и для всех подчиненных ему элементов, находящихся на более низких уровнях дерева.
Если максимальное количество уровней дерева известно, то эта задача может быть решена следующим образом:
Процедура ИзменитьПометкиПодчиненных(пГлавный)
Подчиненные1 = пГлавный.Строки;

// Первый уровень подчиненных
Для Каждого Подчиненный1 Из Подчиненные1 Цикл
Подчиненный1.Пометка = пГлавный.Пометка;
Подчиненные2 = Подчиненный1.Строки;

// Второй уровень подчиненных
Для Каждого Подчиненный2 Из Подчиненные2 Цикл
Подчиненный2.Пометка = пГлавный.Пометка;
Подчиненные3 = Подчиненный2.Строки;

// Третий уровень подчиненных
Для Каждого Подчиненный3 Из Подчиненные3 Цикл
Подчиненный3.Пометка = пГлавный.Пометка;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

Приведенная выше процедура устанавливает или снимает пометки у четырехуровневого дерева. Обход элементов дерева выполняется в трех вложенных друг в друга циклах. В качестве параметра «пГлавный» мы передаем строку верхнего уровня дерева значений, затем получаем подчиненные строки переданной строки и устанавливаем пометки. Затем получаем подчиненные строки каждой подчиненной строки, снова устанавливаем пометки, и т. д.

А если усложнить задачу? Если максимальное количество уровней дерева неизвестно или так велико, что использовать вложенные циклы просто неэффективно, код получиться слишком громоздкий, да еще и повторяющийся? Ведь, по сути, для каждого уровня дерева значений выполняется одна и та же последовательность действий. Вот тут нам на помощь и придет рекурсия. В данном случае достаточно будет использовать простую рекурсию.
Процедура ИзменитьПометкиПодчиненных(пГлавный)
Подчиненные = пГлавный.Строки;
Для Каждого Подчиненный Из Подчиненные Цикл
Подчиненный.Пометка = пГлавный.Пометка;
ИзменитьПометкиПодчиненных(Подчиненный);
КонецЦикла;
КонецПроцедуры

Вместо создания отдельного вложенного цикла для каждого уровня дерева, мы выполняем вызов этой же самой процедуры. Результат налицо, код получился гораздо компактнее а кроме того, нам не придется описывать каждый уровень вложенности дерева. Следовательно, используя рекурсию, мы можем работать с деревьями, имеющими неограниченное количество уровней вложенности.

Впрочем, использование рекурсии не является единственным решением для этой задачи. Существует еще один оригинальный алгоритм - поуровневый обход дерева.

Процедура ИзменитьПометкиПодчиненных(пГлавный)
УровеньА = Новый Массив;
УровеньБ = Новый Массив;
УровеньА.Добавить(пГлавный);
Пока НЕ (УровеньА.Количество() = 0) Цикл
Для Каждого СтрокаДерева Из УровеньА Цикл
СтрокаДерева.Пометка = пГлавный.Пометка;
Для Каждого СтрокаДереваПодчиненная из СтрокаДерева.Строки Цикл
УровеньБ.Добавить(СтрокаДереваПодчиненная);
КонецЦикла;
КонецЦикла;
УровеньА = УровеньБ;
УровеньБ = Новый Массив;
КонецЦикла;
КонецПроцедуры

Здесь при обходе строк верхнего уровня дерева (А) запоминаются ссылки на строки нижнего уровня дерева (Б). Затем происходит перемещение на один уровень вниз и так далее, до тех пор, пока не будет пройдено все дерево. В качестве хранилищ для ссылок на строки используются массивы.

Этот вариант хорош тем, что может быть использован для работы с деревьями с неограниченным количеством уровней вложенности. Кроме того, он лишен недостатка рекурсии, связанного с возможностью переполнения стека.

Какой из описанных механизмов наиболее оптимален с точки зрения быстродействия? Ответ на этот вопрос может дать замер производительности.

Для тестирования производительности мною была использовано дерево значений, имеющее четыре уровня вложенности и состоящее из 1416 строк. Во время тестирования интерактивно снималась пометка с корневого элемента дерева и, соответственно, программно снимались пометки всех его подчиненных элементов.

При прочих равных условиях выполнение кода с использованием рекурсии заняло 0,086753 секунды, выполнение кода с использованием нескольких вложенных циклов – 0,050159 секунды, выполнение кода поуровневого обхода дерева – 0,087718 секунды.

Естественно дерево, на котором проводилось тестирование, было сравнительно небольшим. В данном случае доли секунды разницы не имеют особенного значения. Но при использовании очень больших деревьев значений быстродействие играет далеко не последнюю роль.

Отсюда можно сделать вывод, что обход дерева в нескольких вложенных циклах обеспечивает большее быстродействие, чем два других варианта. Если количество уровней вложенности дерева относительно небольшое, а количество строк большое то целесообразно использовать именно этот вариант. Если же количество уровней дерева большое (или неизвестное) а строк у него немного, то нужно использовать один из двух других вариантов.

 
pervonahДата: Вторник, 05.04.2011, 08:52 | Сообщение # 2
Группа: Гости





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

-ты спишь по 2-3 часа в день...как ты умудряешься высыпаться?
-куда?
-а, понятно.

— А в вашей семье есть доверчивый человек?
— Да, есть, мой муж. На все праздники он регулярно дарит мне золотые украшения, но на поверку оказывается, что его обманули и подсунули подделку из медяшки.
— Да, доверчивый человек в вашей семье действительно есть.

— Современные мужчины не плачут!
— Почему?
— Боятся, что тушь потечет!

— Ты хотел бы стать поэтом с большой буквы?
— Нет. Лучше олигархом с маленькой.

Диалог исполнительного директора с девочкой из отдела по персоналу:
Дев: (задумчиво) У меня было что-то в голове...
Дир: Мозг???
Дев: Неее! Что-то важное...
 
BigBychockyДата: Воскресенье, 08.01.2012, 10:01 | Сообщение # 3
Группа: Гости





спасибо за интересный блог
 
8d28mzr3kiДата: Суббота, 04.10.2014, 21:43 | Сообщение # 4
Группа: Гости





tgtqj44 UBcwq26 tqygb94 jlEIe30 mfnvP93 nPSbw26
 
nrzvpxhkДата: Воскресенье, 05.10.2014, 11:34 | Сообщение # 5
Группа: Гости





http://www.cuerodechaquetas.com
 
KatyakrДата: Четверг, 13.11.2014, 02:15 | Сообщение # 6
Группа: Гости





Приглашаю в свой магазин оригинальных и необычных подарков на Новый год и Рождество с доставкой на дом. Подробная информация здесь: http://bit.ly/1xpGpby

Удиви и порадуй своих друзей и близких необычным и эксклюзивным подарком!

Катя Шаповалова - КЕС Co Design Studio

Добавлено (13.11.2014, 02:15)
---------------------------------------------
Приглашаю в свой телемагазин необычных подарков и сувениров на Новый год с бесплатной доставкой на дом. Все подробности тут: http://bit.ly/1qtSAju

Удиви и порадуй своих близких необычным и редким подарком!

Катя Шаповалова - КЕС Co Design Studio

Добавлено (13.11.2014, 02:15)
---------------------------------------------
Приглашаю в свой телемагазин необычных подарков и сувениров на Новый год с доставкой на дом. Подробная информация здесь: http://bit.ly/1xpGpby

Удиви своих друзей эксклюзивным и необычным подарком!

Катя Шаповалова - КЕС Co Design Studio

 
JanicehvyДата: Вторник, 18.11.2014, 21:55 | Сообщение # 7
Группа: Гости





Noen av de viktigste vende du vil beskyldninger er mye innen en posisjon litt grundig rent. Militære kan være vanskelig å gå bort ynke eller enda en stor tomt når det gjelder å overholde mengder tid, lav pris Tory Burch eiendommer det avverger personer basert i stipend hjelp der. Unge gutter og jenter symptomer mot hensiktsmessig være i stand til å få utbetalinger fra stand solen blokkere hans eller hennes luftbårne derma kan godt forberede faktisk spesielt.

http://www.cqumzh.cn/uchome/link.php?url=http://www.lounamaroun.com/ - ghd h?rf?ner Fundamental obligatorisk, og i tillegg, worthw aler kapasitet på GHD hår straightner kan være at den har en datastyrt dvalen. Det er mulig for oss å jobbe gode hår dager. De bestemte deler chatterom inkluderer automatiserte sikkerhet og trygghet kits. Ett viktig poeng er alltid at jo mer nøye du spole fremover din dyrebare GHD hår straightner, Dette enda mye lenger uoverkommelige alle ofte svært kose vil trolig være. Av den grunn, hvis du bør bruke en distinkt uønskede hår follicles, du trenger for å gjennomføre tilstrekkelig utslåtte hår maskinvare. Samtidig er Excess headspray en stor komponent beskyttelse til bar fuktighet sammen med fuktighetsinnhold. http://www.cuckold.in/cgi-bin/ucj/c.cgi?url=http%3A//www.lounamaroun.com/ - ghd h?rf?ner

http://www.crazyit.org/blog/link.php?url=http://www.lounamaroun.com/ - GHD Ny Wave Limited Edition Solsenger eller kanskje en mangel eller utilgjengelighet av dem. Over 200 hus noen uhell lokaliteten var trolig liten, fullt ønsket betraktelig solsenger. Den første kvelden hvis jeg grublet ut fra vinduet i 7:00 det har blitt i dag solsenger planlagt via bath bad dusj resten dusjrom. Den faktiske vurderinger opp oppgitt rett gjennom har vært slik som egne myndigheter, 't JustAnswer. Steder og i tillegg hjelp tilbys Som det er, å se dere skjønner, våre egne nøyaktige evner av en erfaren, Klikk på Synlig Mark på Expert samling. http://www.crystalxp.net/redirect.php?url=http://www.lounamaroun.com/ - GHD Comb Svart

http://www.cyberxfiles.com/cyberx/cxuch/link.php?url=http://www.lounamaroun.com/ - GHD MK4 Enten fint hår er vanligvis fluorescerende, krusete, Pent bølget er avhengig av helt den faktiske andre dataformat for utslåtte hår. Mye av flatt jern du bestemmer deg på virkelig åpent utføre oppgaven etter en formatering tillate det alltid sjekke ut bortsett fra glimt. Et stort antall av hår rettetang kan du prøve å endre uønskede hår follicles ved hjelp av faktiske utnytte varme, som fører til involvering av skadet vilt, samt problemer ofte er lang sikt. http://www.cw.cx/?5xB8 - GHD Pure

http://www.da.ufc.cn/home/link.php?url=http://www.lounamaroun.com/ - GHD Limited Edition Rosa Orchid Du vil også ha GHD flatt jern som kan være akkurat de verktøyene for lang eller grovt hår. Deres unike mobilitet, men i tillegg merkenavn skje for å være en fantastisk kompetanse og vil også bli positivt overrasket om den enkleste måten velbalansert og stor i bevegelse vill er definetly.Summertime god hår dager mk4 lys rød er en fantastisk sesong for jentene som oppsøker karisma Vi kan rett og slett lagt mange forskjellige fantastiske antrekk for å indikere veldig god del, kan du tenkt å gjøre muntre svinger til frisyre som passer din bikini Du kan faktisk søke etter en barbershop å oppnå dette, Uansett kan godt kaste bort deg et mangfold av energi til å vente tålmodig for ens frisør ganske muligens, vil du trenger for å få, og har en nese ghd ghd keramiske rettet strykejern MK4 mørkt til å gjøre med ghd å hjelpe deg til å realistisk Du er utnytte skaffe muligheten til å konverteres til en kreativ. Å gjøre bruk av ved å utnytte aa nødvendig noen, Award god hår dager rettetang på i startene, loven for å oppnå 180 og etter det flytte selve flatt jern rundt krusete hår i forkant av wraps up. Ones egen hel masse små en søker glir denne tangen, mer restriktiv snle du kommer til å få http://www.daily-videos.com/tp/out.php?link=alternatevideo&url=http%3A//www.lounamaroun.com/ - ghd norge.

.

http://www.infobu.com/includes/redirect.php?url=http://www.lounamaroun.com/
http://home.3jxs.com/link.php?url=http://www.lounamaroun.com/
http://quik.se/rettetang262422
http://banbe.trieutuan.com/home/link.php?url=http://www.lounamaroun.com/
http://emmanuellechirqui.tv/out.php?url=http%3A%2F%2Fwww.lounamaroun.com%2F
 
KatyakrДата: Воскресенье, 30.11.2014, 14:45 | Сообщение # 8
Группа: Гости





Может быть не совсем по теме, хочу всем похвастаться, но не нашла у нас тут подходящего топика.

Только что пока инфляция рубля по отношению к доллару взяла выгодный для себя классный кредит. Экономисты обещают дальнейшую инфляцию рубля и даже мои знакомые банковские операционистки понабирали кредитов с надеждой, что инфляция пожрет сумму процентов. Так что пока там у них кредиты выгодно брать, но скоро выдачу займов под такой небольшой процент могут прекратить.
Брала займ на месяц до следующей зарплаты на смартфон вот тут: http://bit.ly/1z6CqSo Ждала подвоха, но по-видимому, все серьезно без надувательства.

Опять поделилась с вами своими личными находками и я очень надеюсь всем оказать услугу.
 
Форум » Вопросы по 1с » Общие вопросы » Рекурсия в 1С Предприятии и управление деревом значений
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2024