Имя: Пароль:
1C
1С v8
Рекурсивная обработка документа в зависимости от значения реквизита
, ,
0 Vld
 
14.12.14
19:31
В документе есть реквизит "ПредыдущийДокумент", который пуст, если он первый. Надо сделать рекурсивную функцию ОбработатьДок(), которая обработает каждый документ в цепочке до первого документа.
1 arccos6pi
 
14.12.14
19:32
(0) и в чем проблема?
2 Vld
 
14.12.14
19:33
Рекурсию не понимаю как написать
3 Vld
 
14.12.14
19:38
Функия ОбработатьДок(Документ)
   Возврат Документ.Номер=НовыйНомер();
КонецФункции
4 Фокусник
 
14.12.14
19:42
как-то так:

Функия ОбработатьДок(Документ)
    
Если ЗначениеЗаполнено(Документ.ПредыдущийДокумент) Тогда
   ОбработатьДок(Документ.ПредыдущийДокумент);
КонецЕсли;

   Возврат Документ.Номер=НовыйНомер();
КонецФункции
5 Chameleon1980
 
14.12.14
19:42
определяемся - с конца в начало или наоборот
в зависимости от этого в функции ОбработатьДокумент(Док)
делаем либо сначала опять вызов ОбработатьДокумент(Док), а потом сама обработка документа, а если порядок с конца в начало то в процедуре сначала обрабатываем док а потом вызываем рекурсию. Что тут не ясно?
6 Chameleon1980
 
14.12.14
19:44
ну и да... добавить что то типа

Если НЕ ЗначениеЗаполнено(Документ.ПредыдущийДокумент) Тогда
   Возврат;
КонецЕсли;
7 Chameleon1980
 
14.12.14
19:45
просто можно с хвоста начать, а можно доверху сначала дойти и оттуда начать
8 Vld
 
14.12.14
19:46
(5)
Надо так: в выборку попал документ за какую-то дату, и все предыдущие д.б. обработаны
9 Chameleon1980
 
14.12.14
19:48
вы не поняли. можно с конца пойти. Т.е. с дока который в выборку попал. А можно сначала по этой цепочке добраться до верха и начать оттуда до этого документа.

Если взять ситуацию, например с присваивании номеров - то правильнее будет сначала подняться до первого дока и оттуда идти.
10 Chameleon1980
 
14.12.14
19:51
иначе меньшие номера будут ниже.

Понимаю, что здесь скорее всего не то, но если бы ситуация была типа описанной мной, то логичнее меньшие номера присваивать более ранним докам. Дошла мысль?
11 Vld
 
14.12.14
19:52
(9) А в примере (4) это с конца?
12 Vld
 
14.12.14
19:54
(10) примерно понятно, но как рекурсия поднимется до самого раннего документа?
13 Vld
 
14.12.14
19:57
Да, первым должен обрабатываться самый первый из предыдущих
14 Chameleon1980
 
14.12.14
19:58
на бумажке попробуйте нарисовать
или мы компьютерщики уже про листочки с авторучками и карандашами забыли. просто навеяло недавно посмотренной передачей.
15 Chameleon1980
 
14.12.14
20:03
насколько помнится как-то так будет:

Процедура ОбработатьКонкретныйДокумент(Док)
    // тут что-то делаем с доком
КонецПроцедуры

Процедура ОбработатьРекурсивно(Док)
    Если Не ЗначениеЗаполнено(Док.ПредыдущийДокумент) Тогда
        Возврат;
    КонецЕсли;
    
    // это текст если сверху вниз
    ОбработатьРекурсивно(Док.ПредыдущийДокумент);
    ОбработатьКонкретныйДокумент(Док);
    
    // это если с конца
    ОбработатьКонкретныйДокумент(Док);
    ОбработатьРекурсивно(Док.ПредыдущийДокумент);
КонецПроцедуры

Процедура ВыполнитьОбработку()
    НайденныйДок=Выборка.Документ;
    ОбработатьРекурсивно(НайденныйДок);
КонецПроцедуры
16 Chameleon1980
 
14.12.14
20:04
надо пробовать - может забыл про какой нюанс
17 Vld
 
14.12.14
20:07
(15) Очень похоже на то, что нужно
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан