v7: Рекурсивная функция #635038


#0 by kloptula
Есть вот такая функция, которая проверяет наличие строки в таблице значений и возвращает 1 в случае нахождения Так вот, эта функция возвращает не то, что должна. Например: нашлась строка с заданными реквизитами и функция должна вернуть 1, но если смотреть в отладчике, то сначала действительно возвращается 1, а вот потом рекурсия возвращается на предыдущий шаг и берет и возвращает 0. Че за х..ня не пойму ни как. Может сталкивался кто-нибудь с такой засадой
#1 by Лефмихалыч
как вызываешь ее?
#2 by HeroShima
А зачем рекурсия?
#3 by Лефмихалыч
видать холодно в кабинете, решил отопить путем нагрузки процессора
#4 by kloptula
Вызываю вот так                        Если НайтиЗначениеВТаблице(ТЗИтоговДоп, Запрос.Номенклатура, Запрос.Серия, Запрос.ЦенаПрод, НомСтр) = 0 Тогда
#5 by HeroShima
не иначе
#6 by hhhh
но ведь она у тебя ничего и не возвращает. Юморист. До пятницы еще несколько минут.
#7 by HeroShima
чувствуешь?
#8 by kloptula
Если ты про "продолжить", то после этого идет вывод строки в отчет в цикле, а я вывод этой строки пропускаю.
#9 by kloptula
#10 by HeroShima
он про не возвращает, но тебе и на это там наплевать
#11 by Лефмихалыч
*баный стыд... а не код. Как ты это говно читаешь?
#12 by kloptula
Как правильно возвращать результат в рекурсивной функции в 1С?
#13 by kloptula
Да это форум перековеркал. А код большей частью из ТиС типового
#14 by hhhh
чему то присвоить. Переменной какой нибудь. АП то у тебя функция выполняется просто так, результат куда-то в небо передаешь.
#15 by HeroShima
правильно возвращать значение по умолчанию вне условий, а затем ещё и проверять что вернули
#16 by hhhh
вот тут например вот где у тебя результат, ты говоришь, что 1. А он ведь в воздухе висит. Никуда потом не присваивается
#17 by kloptula
Вот так сделал. Один фиг тоже самое Функция НайтиЗначениеВТаблице(ТЗ, Номенклатура, Серия, ЦенаПрод, НомерСтроки)
#18 by kloptula
Или глобальную переменную объявлять для возврата значения, но это же некрасиво
#19 by HeroShima
Кому ты вернул результат? И убери рекурсию - за неё тут расстрелять нужно даже за работающую.
#20 by Лефмихалыч
#21 by Лефмихалыч
но лучше разбег, стена, конец карьеры
#22 by kloptula
Бл.. генитально
#23 by kloptula
(20 Спасибо дружище
#24 by kloptula
А без рекурсии получается громоздкий код, а с рекурсией красота
#25 by HeroShima
не вижу там громоздкости
#26 by kloptula
Где там?
#27 by HeroShima
в умозрительно трансформированном коде
#28 by kloptula
Изобрази, если не сложно
#29 by HeroShima
один малюсенький цикл
#30 by HeroShima
Очень надеюсь что тема - шутка.
#31 by kloptula
ну....
#32 by HeroShima
поверь на слово
#33 by GANR
Замени-ка ты эту рекурсию на массив (стэк) - прерви поиск, где тебе надо и всё пучком. Этот способ гораздо гибче.
#34 by GANR
А в сабже замени это НайтиЗначениеВТаблице(ТЗ, Номенклатура, Серия, ЦенаПрод, НомерСтроки+1); Возврат НайтиЗначениеВТаблице(ТЗ, Номенклатура, Серия, ЦенаПрод, НомерСтроки+1); Неудивительно, что она 0 возвращает
#35 by Semen
Тоже не понял, почему бы просто не перебрать в цикле ТЗ до момента позиционирования на записи удовлетворяющей условию
#36 by Stillcat
Да, слов нет. Вот твой "громоздкий код"
#37 by Stillcat
В рекурсии конечно великая сила, но в данном случае - из пушки по воробьям.
#38 by kloptula
Работает очень медленно по сравнению с моим вариантом. Лобовое решение, но не оптимальное
#39 by Simod
Оно не может работать медленнее, потому как ПолучитьСтроку работает быстрее, чем ПолучитьСтрокуПоНомеру Функции в в принципе нерабочая, т.к. нет проверки на выход из диапазона строк (НомерСтроки > ТЗ.КоличествоСтрок) Почитайте какие-нибудь книжки по программированию.
#40 by VladZ
Я бы использовал в таком случае "ИндексированнуюТаблицу". Условия вида: (ТЗ.СерияНоменклатуры = Серия) и (ТЗ.ЦенаПрод = ЦенаПрод) фильтруется на ура. Условие (ТЗ.ДатаПартии - ДатаПоступления) < 0 обрабатывать перебором по отфильтрованной ТЗ.
#41 by kloptula
А Вы попробуйте сравнить. ПолучитьСтроку работает с выборкой всей таблицы, и пока доберешься до нужной строки можешь перебрать почти всю таблицу. А найтиЗначение и потом ПолучитьСтрокуПоНомеру позиционирует сразу на нужную строку в таблице. Иногда лучше жевать, чем говорить
#42 by dk
если действительно нужна скорость, то индексы в ТЗ спасут
#43 by ADirks
если надо высокую скорость, то можно и посложней методы применить. Например сортировка + дихотомический поиск. Ну или сразу ИТ.
#44 by kloptula
Согласен, но код сложнее будет, т. к. придется сначала таблицу "переколбасить", а по производительности меня вариант с рекурсией вполне устроил.
#45 by ADirks
Код будет сложнее всего 1 раз. Есть же такая штука, "повторное использование кода". Например:
#46 by GenAcid
//Вариант 1 Для каждого СтрокаТЗ из ТЗ Цикл  ... Действительно "Иногда лучше жевать". И не мучай больше бедный стек вызовов, без особой нужды.
#47 by Stillcat
Вы не правы, Ваш вариант медленнее! Это что касается ПолучитьСтрокуи ПолучитьСтрокуПоНомеру Еще различия могут быть что сравнение по номенклатуре вынесено у Вас в отдельное условие и проверка напр. (ТЗ.ДатаПартии - ДатаПоступления) < 0) для большинства строк вообще не выполняется, Но в моём варианте условия тоже можно легко разделить.
#48 by GenAcid
Ах тыж 7ка)
#49 by Stillcat
Кто-нибудь знает, 1С проверяет сложные условия полностью или по сокращенной схеме?
#50 by ADirks
полность.
#51 by 0xFFFFFF
7.7 проверяет условие целиком, 8.х - по сокращенной. Это один из пунктов, почему меня подташнивает от 7.7
#52 by kloptula
Чего спорить-то? Изначально сделал по Вашему варианту. Меня не устроила скорость работы отчета. Поэтому и начал извращаться.
#53 by kloptula
Такое ощущение, что для большинства присутствующих - рекурсия что-то злое и неправильное. Лучше 100500 строк дополнительного кода написать, чтобы потом никто не разобрался, как оно работает
#54 by kloptula
можно было и запросом изъеб..ться, лучше уж "мучать  бедный стек вызовов", чем мучать бедный регистр остатков
#55 by Simod
Поиск с использованием А НайтиЗначение и ПолучитьСтрокуПоНомеру может быть быстрее, когда надо проверить несколько строк. Если надо проверить несколько десятков или сотен строк, то медленнее. Я так думаю, что там можно было все запросом получить и не изобретать велосипед с квадратными колесами..
#56 by Stillcat
Глупости
#57 by ptiz
Ну и код. Если к добавить индексы на 3 поля и использовать НайтиСтроки, то будет летать с 1ой космической.
#58 by kloptula
см. как раз мой случай, проверка нескольких строк
#59 by kloptula
Там в цикле проверка идет. Запрос в цикле не айс гонять
#60 by Simod
"Там в цикле проверка идет. Запрос в цикле не айс гонять" Твою ветку уже поместили сюда: Хочешь стать героем дня?
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С