|   |   | 
| 
 | 8.2. Управляемое. Странное поведения выполнения кода рекурсивной функции | ☑ | ||
|---|---|---|---|---|
| 0
    
        Pro-tone 23.09.11✎ 10:18 | 
        Написал функцию для перебора строк дерева значений:
  &НаСервере Функция ПроверкаСуществующихПозицийСервер(ВыводимаяСтрока, ПарамМаршрут, ПарамТС, Уровень=0) Если Уровень = 0 Тогда ВыводимаяСтрока = ДанныеФормыВЗначение(ВыводимаяСтрока, Тип("ДеревоЗначений")); Рез = Истина; КонецЕсли; Для Каждого СтрокаДерева Из ВыводимаяСтрока.Строки Цикл Если СтрокаДерева.Маршрут = ПарамМаршрут И СтрокаДерева.ТС = ПарамТС Тогда Рез = Ложь; Прервать; КонецЕсли; ПроверкаСуществующихПозицийСервер(СтрокаДерева, ПарамМаршрут, ПарамТС, Уровень+1); КонецЦикла; Возврат Рез; КонецФункции После условного выхода из цикла по "Прервать" идет в "КонецФункции" как и должно быть, а вот после начинается хз что - выполнение идет снова в рекурсивный вызов внутри цикла "ПроверкаСуществующихПозицийСервер(СтрокаДерева, ПарамМаршрут, ПарамТС, Уровень+1);" ну и дальше понимаете только все хуже. Что это означает ? Глюки платформы ? | |||
| 1
    
        Axel2009 23.09.11✎ 10:19 | 
        так там небось прервать для одного из вызова функции, а в стеке штук 10, прервано из 1го, а в 9 то тоже надо прерывать     | |||
| 2
    
        Defender aka LINN 23.09.11✎ 10:20 | 
        (0) Оно туда не "идет". Оно туда возвращается.     | |||
| 3
    
        Pro-tone 23.09.11✎ 10:21 | 
        (1) мы прерываем цикл, "Прервать" вне него не работает     | |||
| 4
    
        Axel2009 23.09.11✎ 10:21 | 
        (3) цикл то прервал. а весь стек вызовов то кто прерывать будет?     | |||
| 5
    
        Pro-tone 23.09.11✎ 10:22 | 
        (2) я писал точно такое же на 7.7 все отлично прерывалось и выходило из цикла, так выводили в 7.7 например группировки в отчетах     | |||
| 6
    
        Pro-tone 23.09.11✎ 10:22 | 
        (4) ок. Как прервать весь стек вызовов если не через "Прервать" ?     | |||
| 7
    
        Axel2009 23.09.11✎ 10:26 | 
        заводишь переменную "НуЧтоПораПрерывать" = Истина. и прерывай     | |||
| 8
    
        Pro-tone 23.09.11✎ 10:38 | 
        Сделал так: 
  &НаСервере Функция ПроверкаСуществующихПозицийСервер(ВыводимаяСтрока, ПарамМаршрут, ПарамТС, Уровень=0, НуЧтоПораПрерывать = Ложь) Если Уровень = 0 Тогда ВыводимаяСтрока = ДанныеФормыВЗначение(ВыводимаяСтрока, Тип("ДеревоЗначений")); Рез = Истина; КонецЕсли; Для Каждого СтрокаДерева Из ВыводимаяСтрока.Строки Цикл Если НуЧтоПораПрерывать = Истина Тогда Прервать; КонецЕсли; Если СтрокаДерева.Маршрут = ПарамМаршрут И СтрокаДерева.ТС = ПарамТС Тогда Рез = Ложь; НуЧтоПораПрерывать = Истина; КонецЕсли; ПроверкаСуществующихПозицийСервер(СтрокаДерева, ПарамМаршрут, ПарамТС, Уровень+1, НуЧтоПораПрерывать); КонецЦикла; Возврат Рез; КонецФункции Теперь вываливает ошибку: {Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(198)}: Ошибка при вызове метода контекста (ПроверкаСуществующихПозицийСервер) Если ПроверкаСуществующихПозицийСервер(Дерево,СтруктураВыбораМаршрута.Маршрут,СтруктураВыбораМаршрута.ТС) = Ложь Тогда по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO: НачалоСвойства: param Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType по причине: Ошибка отображения типов: Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTree' | |||
| 9
    
        Pro-tone 23.09.11✎ 10:43 | 
        Я не пойму ! Почему такая ошибка, я ведь не возвращаю тип "ДеревоЗначений", я же возвращаю функцией в форму "Булево" !     | |||
| 10
    
        Pro-tone 23.09.11✎ 10:58 | 
        .     | |||
| 11
    
        Pro-tone 23.09.11✎ 11:06 | 
        ..     | |||
| 12
    
        Axel2009 23.09.11✎ 11:10 | 
        а в остановке по ошибке что в Рез содержится?     | |||
| 13
    
        Pro-tone 23.09.11✎ 11:11 | 
        "Истина"     | |||
| 14
    
        Pro-tone 23.09.11✎ 11:11 | 
        &НаСервере
  Функция ПроверкаСуществующихПозицийСервер(ВыводимаяСтрока, ПарамМаршрут, ПарамТС, Уровень=0, НуЧтоПораПрерывать = Ложь) Если Уровень = 0 Тогда ВыводимаяСтрока = ДанныеФормыВЗначение(ВыводимаяСтрока, Тип("ДеревоЗначений")); ДеревоЗН = ВыводимаяСтрока; ЗначениеВДанныеФормы(ДеревоЗН, Дерево); Рез = Истина; КонецЕсли; Для Каждого СтрокаДерева Из ВыводимаяСтрока.Строки Цикл Если НуЧтоПораПрерывать = Истина Тогда Рез = Ложь; Прервать; КонецЕсли; Если СтрокаДерева.Маршрут = ПарамМаршрут И СтрокаДерева.ТС = ПарамТС Тогда Рез = Ложь; НуЧтоПораПрерывать = Истина; КонецЕсли; ПроверкаСуществующихПозицийСервер(СтрокаДерева, ПарамМаршрут, ПарамТС, Уровень+1, НуЧтоПораПрерывать); КонецЦикла; Возврат Рез; КонецФункции вернее ЛОЖЬ | |||
| 15
    
        Axel2009 23.09.11✎ 11:14 | 
        (14) а если в самом начале указать Возврат Ложь; ошибка тоже будет?     | |||
| 16
    
        H A D G E H O G s 23.09.11✎ 11:15 | 
        (9) Ты это дерево в параметрах возвращаешь     | |||
| 17
    
        H A D G E H O G s 23.09.11✎ 11:15 | 
        (9) У тебя же не через ЗНАЧ параметр передается.     | |||
| 18
    
        Axel2009 23.09.11✎ 11:16 | 
        либо 2ую функцию на сервере которая будет запускать рекурсивную функцию     | |||
| 19
    
        Pro-tone 23.09.11✎ 11:17 | 
        (15) да, та же ошибка
  (16) (17) хм, надо так ? Функция ПроверкаСуществующихПозицийСервер(Знач(ВыводимаяСтрока), ПарамМаршрут, ПарамТС, Уровень=0, НуЧтоПораПрерывать = Ложь) | |||
| 20
    
        Axel2009 23.09.11✎ 11:18 | 
        без скобок     | |||
| 21
    
        Pro-tone 23.09.11✎ 11:23 | 
        Вот так заработало !!!!!!!!
  &НаСервере Функция ПроверкаСуществующихПозицийСервер(ЗНАЧ ВыводимаяСтрока, ПарамМаршрут, ПарамТС, Уровень=0, НуЧтоПораПрерывать = Ложь) Если Уровень = 0 Тогда ВыводимаяСтрока = ДанныеФормыВЗначение(ВыводимаяСтрока, Тип("ДеревоЗначений")); ДеревоЗН = ВыводимаяСтрока; ЗначениеВДанныеФормы(ДеревоЗН, Дерево); Рез = Истина; КонецЕсли; Для Каждого СтрокаДерева Из ВыводимаяСтрока.Строки Цикл Рез = Истина; Если НуЧтоПораПрерывать = Истина Тогда Рез = Ложь; Прервать; КонецЕсли; Если СтрокаДерева.Маршрут = ПарамМаршрут И СтрокаДерева.ТС = ПарамТС Тогда Рез = Ложь; НуЧтоПораПрерывать = Истина; КонецЕсли; ПроверкаСуществующихПозицийСервер(СтрокаДерева, ПарамМаршрут, ПарамТС, Уровень+1, НуЧтоПораПрерывать); КонецЦикла; Возврат Рез; КонецФункции (17), (20) Спасибо вам добрые люди !!! Только я так в СП не нашел что такое "Знач" (( | |||
| 22
    
        MadHead 23.09.11✎ 11:25 | 
        (21) по ссылке или по значению передается параметр     | |||
| 23
    
        Pro-tone 23.09.11✎ 11:41 | 
        (22) Ок. Спасибо     | |||
| 24
    
        Axel2009 23.09.11✎ 12:16 | 
        (23) в СП ищи Процедура или Функция. там описывается     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |