Имя: Пароль:
1C
1С v8
рекурсия
,
0 начинающий1спрог
 
06.07.12
15:56
Как можно данную процедуру сделать рекурсивной? чтобы она в теле сама себя вызывала??

Процедура ПолучитьГруппыИерархически()

Выборка = Справочники.Номенклатура.Выбрать();

Пока Выборка.Следующий() Цикл
   Если Выборка.ЭтоГруппа Тогда
       Сообщить (выборка.Наименование);
   КонецЕсли;
КонецЦикла;

КонецПроцедуры
1 0_Serg_0
 
06.07.12
15:57
Процедура ПолучитьГруппыИерархически()

Выборка = Справочники.Номенклатура.Выбрать();

Пока Выборка.Следующий() Цикл
   Если Выборка.ЭтоГруппа Тогда
       Сообщить (выборка.Наименование);
       ПолучитьГруппыИерархически()

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

КонецПроцедуры
2 Лефмихалыч
 
06.07.12
15:58
(0) зачем тебе вечный цикл?
3 Господин ПЖ
 
06.07.12
15:58
накуа только...
4 Любопытная
 
06.07.12
15:58
(1) "Эта музыка будет вечной..." :)
И этот человек смеялся надо мной за удаление документов
5 Happy Bear
 
06.07.12
15:58
(1) круто
6 evorle145
 
06.07.12
15:59
(0),лучше бы сначала написал, чего хочешь получить
7 Rie
 
06.07.12
15:59
(1) Типо пошутил?

(0) Создай процедуру с параметром (обзови его, к примеру, Выборка).
Посмотри внимательно на параметры у Выбрать, в частности, на способ обхода.
8 0_Serg_0
 
06.07.12
15:59
(4) мож у него типа вечного двигателя?!
9 Fish
 
06.07.12
15:59
(2) С рекурсией вечного цикла в 1С не получится. 1С-ка упадёт :)))
10 Happy Bear
 
06.07.12
15:59
+(5) хотя на поставленный вопрос ответил )))
11 Rie
 
06.07.12
16:00
Задача, кстати, вполне реальная. Просто человек её недоформулировал.
12 Лефмихалыч
 
06.07.12
16:00
(9) ну, какое-то время серверную она отапливать будет
13 Asmody
 
06.07.12
16:00
(1) я думаю, 1С упадёт через 1 секунду…
14 Fish
 
06.07.12
16:01
(12) Сейчас проверил. На 1801-м уровне падает :)))
15 Любопытная
 
06.07.12
16:01
А, кстати, мне тут советовали...
(0) Фотку! Я требую! :)
16 Rie
 
модератор
06.07.12
16:02
Дамы и господа! Замечу, что начинающий1спрог попытался объяснить и задачу, и свою попытку её решить. Всё по правилам. Что криво спросил - так это по незнанию.
Посему - ближе к теме.
17 ks_83
 
06.07.12
16:03
Процедура ПолучитьГруппыИерархически(Ссылко)
Сообщть(Ссылко);
Если ЗнчниеЗаплнно(Ссылко.Родител) Тогды
ПолучитьГруппыИерархически(Ссылко.Родител);
КонецЕсли;
КнцПрцдуры
18 Ненавижу 1С
 
гуру
06.07.12
16:03
надеюсь в этой рекурсии не будет вызываться запрос?
19 Asmody
 
06.07.12
16:03
(16) только сама постановка задачи как-бэ намекает…
20 Лефмихалыч
 
06.07.12
16:03
(16) ты, если догадался, чего хочет автор, озвучь, не тяни кота за интригу
21 Rie
 
06.07.12
16:04
(20) Озвучил в (7). Если автору намёк не понятен - задаст дополнительный вопрос.
22 Ненавижу 1С
 
гуру
06.07.12
16:05
(21) автора вообще не видно
23 Asmody
 
06.07.12
16:05
(18) в этой рекурсии будет вызываться веб-сервис, который через com будет вызывать запрос, который будет вызывать рекурсию, которая будте вызывать веб-сервис, который…
24 Rie
 
06.07.12
16:05
(19) "Дата регистрации:
06.07.2012     сегодня "
Что выросло - то выросло.
25 Ненавижу 1С
 
гуру
06.07.12
16:06
(23) "запрос, который будет вызывать рекурсию"
вот ты немного нагнал ))
26 Nagaru
 
06.07.12
16:06
(22) Может он увидел решение в (7) и теперь переписывает код
27 Ненавижу 1С
 
гуру
06.07.12
16:06
(26) лихорадочно
28 Asmody
 
06.07.12
16:07
(25) "возьмём диффузию и поставим в шкаф…" (из лабораторной работы по физике)
29 Rie
 
06.07.12
16:08
Процедура ПеребратьРекурсивно(Выборка)
   Пока Выборка.Следующий() Цикл
       Если УраЭтоЛист(Выборка) Тогда
           ОбработатьЛист(Выборка);
       Иначе
           Подвыборка = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры

// Автор, это оно?
30 hhhh
 
06.07.12
16:09
может всё-таки

Выборка = Справочники.Номенклатура.ВыбратьИерархически();
???
31 Pro-tone
 
модератор
06.07.12
16:11
(0) автор, сформулируй задачу для чего это надо. От этого надо плясать =)
32 начинающий1спрог
 
06.07.12
16:13
(31) я пляшу от того что задача моя натренировать навык использования рекурсий. никаких бесконечных циклов. просто чтобы перебрал справочник номенклатура рекурсивно и выбрал из него группы
33 hhhh
 
06.07.12
16:15
(32) если ты начинающий, то займись нормальным делом. Рекурсии тебе понадобятся лет через десять. Чего их тренировать?
34 Mort
 
06.07.12
16:18
(32) Начни с вычисления факторила.

ПыСы: Странно из всех предложенных вариантов, абсолютно все кромешный адъ.
35 Rie
 
06.07.12
16:19
(32)
ВЫБРАТЬ
   Номенклатура.Ссылка КАК Группа
ИЗ
   Справочники.Номенклатура КАК Номенклатура
ГДЕ
   Номенклатура.ЭтоГруппа

// не оно?
36 начинающий1спрог
 
06.07.12
16:19
я начинающий. мой наставник дал задание :) ему скорее лучше знать что мне надо. говорит, мол, в конфигурировании, рекурсии это дело нужное.

(34) с факториалами всякими я натренировался, тут суть на деле испробовать
37 Rie
 
06.07.12
16:20
(34) Факториал рекурсией? Ну, Вы, батенька, извращенец... :-)
38 начинающий1спрог
 
06.07.12
16:21
(35) запрос запросом, это понятно. надо бы рекурсию впихнуть без исп-я всяких запросов
39 Rie
 
06.07.12
16:21
(36) Рекурсия - дело нужное. Но любой инструмент нужен не просто так, а для чего-то. Помедитируй над этим.
40 Адимр
 
06.07.12
16:21
(32) в (0) имхо не лучший пример использования рекурсии.
41 Reset
 
06.07.12
16:21
(32) На

ПолучитьГруппыИерархически();

Процедура ПолучитьГруппыИерархически(Группа=Неопределено)
 Выборка=Справочники.Номенклатура.Выбрать(?(Группа=Неопределено,Справочники.Номенклатура.ПустаяСсылка(),Группа));
 Пока Выборка.Следующий() Цикл
   Если Выборка.ЭтоГруппа Тогда
     Сообщить(Выборка.Наименование);
     ПолучитьГруппыИерархически(Выборка.Ссылка);
   КонецЕсли;
 КонецЦикла;
КонецПроцедуры
42 Mort
 
06.07.12
16:22
А со справочником - дам пару наводок (добр бобр ибо пьян)

- Нужно юзать параметр процедуры. Или глобальную переменную на худой конец.
- Получать выборку нужно каждый раз не из всего справочника, а по полученному в параметре функции родителю.

(37) Мне никогда в жизни не приходила задача вычислить факториал. Ваще никогда. Факториал как пример привел потому что это хрестоматийный пример, не более.

ну вот, пока писал, выложили что-то похожее решение.
43 Ненавижу 1С
 
гуру
06.07.12
16:22
Приведите достойный пример использования рекурсии
44 Rie
 
06.07.12
16:23
(38)
"Другой юноша нес свое: "Я нашел, как применить здесь нестирающиеся шины из полиструктурного волокна с вырожденными аминными связями и неполными кислородными группами. Но я не знаю пока, как использовать регенерирующий реактор на субтепловых нейтронах. Миша, Мишок! Как быть с реактором?" Присмотревшись к устройству, я без труда узнал велосипед."
(А.Н.Стругацкий, Б.Н.Стругацкий, "Понедельник начинается в субботу")
45 Mort
 
06.07.12
16:24
(43) Любая операция с однородным деревом, требующая анализа содержимого строк.
46 начинающий1спрог
 
06.07.12
16:24
(41) аллилуя! спасибо, заработало.
(39) бесспорно. буду тренировать навык
всем спасибо) отличный форум
47 Адимр
 
06.07.12
16:24
48 Mort
 
06.07.12
16:25
+(45) + Например установка значения трехпозиционного флажка в дереве.
49 Reset
 
06.07.12
16:25
(43) Деревья, особенно с произвольной "вложенностью" ?
50 Ненавижу 1С
 
гуру
06.07.12
16:26
(45)(49) а чем справочник не дерево?
51 Pro-tone
 
модератор
06.07.12
16:27
для (32) есть решение (35) без всякий рекурсий. Бесполезно изучать механизмы решения диффуров (дифференциальных уравнений) не имея знаний из области азов алгебры :)
52 Mort
 
06.07.12
16:29
(50) Ну дерево не обязательно справочник. А даже если и справочник. Сделай форму множественного выбора из иерархического справочника, только не простую, а чтобы галочками можно было отмечать элементы(ну как в дереве сравнения конфигурации) и группы (с простановкой подчиненных и обновления родительских).
53 Pro-tone
 
модератор
06.07.12
16:29
(45) Да, дерево значений рулит под рекурсии. Много очень гемора, но зато какая красивая реализация!
54 Ненавижу 1С
 
гуру
06.07.12
16:31
(51) но он же просто изучает РЕКУРСИЮ, а не то как эту задачу лучше решить

например доказать, что чило простых чисел бесконечно можно введя специальную топологию на натуральных числах, по идея - хрень ненужная в данном случае, но методически верная именно для изучения
55 Ненавижу 1С
 
гуру
06.07.12
16:31
(52) что-то желания нет ))
56 Pro-tone
 
модератор
06.07.12
16:31
(43) помнишь 7.7 ? а помнишь как там настраиваемые группировки выводились в отчетах? ))
57 Ненавижу 1С
 
гуру
06.07.12
16:31
(56) эх времена...
60 Mort
 
06.07.12
16:32
(55) Я просто привел пример, что использование рекурсии не только для решения задач из учебника может понадобиться.
61 Ненавижу 1С
 
гуру
06.07.12
16:32
(60) согласен с тобой полностью, красивый пример
62 Mort
 
06.07.12
16:32
Кстати у Фомина в его книге про СИ это прекрасно рассказывается.
63 Asmody
 
06.07.12
16:33
сборы-разборы xml-ек каких-нибудь тоже красиво рекурсиями решается
64 Mort
 
06.07.12
16:34
+(62) В смысле вообще рекурсия и т.п. Про обход бинарного дерева, например. До сих пор помню Центр-Лево-Право, Лево- Центр - Право и т.д.
65 Pro-tone
 
модератор
06.07.12
16:34
+ (56) смотрю щас на все эти СКД, и думаю - никогда не понять тому, кто начал сразу с 8ки, что такое тяжкий кодерский труд в 1С
66 Rie
 
06.07.12
16:35
Рекурсия полезна, когда идёт речь о потенциально неограниченных запросах на память. Иначе она сводится к более другим циклам.
67 Asmody
 
06.07.12
16:35
(64) да почти все задачи на графах (а дерево есть частный случай графа) так или иначе можно свести к рекурсии
68 Rie
 
06.07.12
16:35
(67) Или к циклу + очередь/дерево/стек.
69 Asmody
 
06.07.12
16:36
(65) тяжкий кодерский труд был на фокспро и клиппере. 1С — это сказка
70 Rie
 
06.07.12
16:36
+(68) Зачастую задачи на графах даже лучше сводить к цикл + дек.
71 Asmody
 
06.07.12
16:37
73 начинающий1спрог
 
06.07.12
16:51
(41)Может вопрос глупый, но пытаюсь разобраться, не пойму, что это за вопрос в методе
Выбрать(?(Группа=Неопределено,Справочники.Номенклатура.ПустаяСсылка(),Группа));

нигде не могу найти описание
74 Rie
 
06.07.12
16:56
(73) Условное выражение.
75 Ненавижу 1С
 
гуру
06.07.12
16:59
(73)


? (вычислить выражение по условию)
Синтаксис:
   ?(<Логическое выражение>, <Выражение 1>, <Выражение 2>)

Параметры:
   <Логическое выражение>
   Логическое выражение, результат вычисления которого определяет одно из результирующих выражений, которые будут вычислены. Если результат его вычисления Истина, то будет вычисляться <Выражение 1>. Если результат Ложь – то <Выражение 2>.

   <Выражение 1>
   Результирующее выражение, которое будет вычисляться, если результат логического выражения Истина.

   <Выражение 2>
   Результирующее выражение, которое будет вычисляться, если результат логического выражения Ложь.

Возвращаемое значение:
Результат вычисления одного из результирующих выражений.

Описание:
Позволяет вычислить одно из двух заданных выражений в зависимости от результата вычисления логического выражения.
Закон Брукера: Даже маленькая практика стоит большой теории.