gifts2017

Рекурсомания или интеллигентно ковыряемся в носу:-)

Опубликовал Александр Венгер (venger) в раздел Программирование - Работа с интерфейсом

Рекурсия - как женщина, затратна, но как красива, чертовка :)

И тот, кто найдет в коде цикл, пусть кинет в свой монитор камнем :-)

Демонстрация рекурсивной работы с ТаблицейЗначений (двухмерный массив, по сути), СпискомЗначений (одномерный массив) и с родителями элемента справочника (типа, дерево можно сказать).

Скачать файлы

Наименование Файл Версия Размер
recursion_mania.zip 180
.1245787035 47,13Kb
25.09.09
180
.1245787035 47,13Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Венгер (venger) 24.06.09 00:25
(0) Кстати, в процессе наткнулся на такой глючек платформы 7.7 (7.70.023):

Например, если написать так (вы ж понимаете, что это для примера:-):
-----------------
сп=СоздатьОбъект("СписокЗначений");
сп.ДобавитьЗначение("Значение_1");
сп.ДобавитьЗначение("Значение_2");
сп.ТекущаяСтрока(8);
Сообщить("Всего: "+сп.РазмерСписка()+" Текущая: "+сп.ТекущаяСтрока());
-----------------
То, скушает и не подавится, более того, выведет:
-----------------
Всего: 2 Текущая: 8
-----------------

Со строками в ТаблицеЗначений лучше обстоит, но тоже не подавится:
-----------------
тз=СоздатьОбъект("ТаблицаЗначений");
тз.НоваяКолонка("Кол1");
тз.НоваяСтрока();
тз.НоваяСтрока();
тз.НоваяСтрока();
тз.ТекущаяСтрока(2);
Сообщить("Всего: "+тз.КоличествоСтрок()+" Текущая: "+тз.ТекущаяСтрока());
тз.ТекущаяСтрока(8);
Сообщить("Всего: "+тз.КоличествоСтрок()+" Текущая: "+тз.ТекущаяСтрока());
-----------------
Просто скушает, делать ничего не будет (при установке текущей в 8-м), но и не скажет ничего, что печально:-) Т.е. выведет:
-----------------
Всего: 3 Текущая: 2
Всего: 3 Текущая: 2
-----------------

А вот с колонками ТЗ уже как положено:
-----------------
тз=СоздатьОбъект("ТаблицаЗначений");
тз.НоваяКолонка("Кол1");
тз.НоваяСтрока();
тз.НоваяСтрока();
тз.НоваяСтрока();
тз.ТекущаяКолонка(5);
-----------------
Заругается и выдаст ошибку, как положено:
-----------------
тз.ТекущаяКолонка(5);
{Отчет.......}: Номер за пределами значения!
-----------------

Вот такие дела:-)
2. vip (vip) 24.06.09 01:17
(1) Вообще-то, если внимательно почитать СП, то метод ТекущаяСтрока() относится к ЭЛЕМЕНТАМ ДИАЛОГА "Список", "Поле со списком" и "Таблица значений".
3. Малышко В.Н. (molot) 24.06.09 01:33
Наглядненько, +

Только в программы - не совсем, кажись, уместно...
4. cdr (phsin) 24.06.09 09:44
Конфигурация Альфа Авто - вся конфигурация построена на рекурсии - в одном месте тронешь в другом тААкое вылезет...
так что с рекурсией шутки плохи, особенно если не ты писал ;)
5. Сергей Рудаков (fishca) 24.06.09 10:13
По мне так лучше цикл, рекурсия может боком вылезти :(
6. Александр Венгер (venger) 24.06.09 11:00
(5) Вчера поругался с циклом, он до сих пор дуется и не разговаривает со мной:-) Пришлось выкручиваться без него:-)
7. Александр Венгер (venger) 24.06.09 11:21
(2) > метод ТекущаяСтрока() относится к ЭЛЕМЕНТАМ ДИАЛОГА

Я читал, но работает ТекущаяСтрока() и с элементами диалога, и с объектами, созданными функцией СоздатьОбъект:-) Так что в таком случае, это еще один глючек, раз относится к элементам диалога, а работает с программно созданными:-)

Но, речь еще и в том, что разница с элементами диалога лишь в том, что в СпискеЗначений, если установить текущую строку больше, чем размер списка, отработает, также как с текущей строкой ТЗ, т.е. ниче не сделает, но тихо промолчит, что не гуд:-) А вот со столбцом, все как положено:-)
vinsentfire; +1 Ответить
8. Александр Венгер (venger) 24.06.09 12:10
(4) > Конфигурация Альфа Авто - вся конфигурация построена на рекурсии - в одном месте тронешь в другом тААкое вылезет...

Жесть, это чтоб после долгих безуспешных попыток доработок конфы, всегда звали автора и кланялись ему в ножки:-))))

9. GSoft. (GSoft) 24.06.09 13:47
у меня в профайле был пример рекурсии, счаз поковыряюсь и дам ссылку
вот
http://infostart.ru/blogs/156/
http://infostart.ru/projects/827/
10. Александр Венгер (venger) 24.06.09 14:11
(10) Тоже гуд, соберем все рекурсию в одном месте:-)))
Вот http://infostart.ru/projects/3356/
11. Альтаир (Altair777) 24.06.09 14:26
Для позиционирования на строке ТЗ я предпочитаю использовать ПолучитьСтрокуПоНомеру(<Номер>)
12. Александр Венгер (venger) 24.06.09 17:28
(11) А если это элемент диалога? Ведь когда я пишу функцию, мне по барабану, будет эта ТЗ элементом диалога или создана программно, будет строку выбирать пользователь интерактивно или я буду задавать ее программно, может быть в одном месте так, а в другом так:-))) Но функция ДОЛЖНА быть одна, а не по десять разных на каждый через одно место сделанный метод 1С:-))) Я ж не 1С'ник, чтобы такую НЕ универсальность терпеть:-))))

Вот пример, закинь ТЗ как элемент диалога и запусти такой код:

тз.НоваяКолонка("Кол1");
тз.НоваяСтрока();
тз.НоваяСтрока();
тз.НоваяСтрока();
тз.НоваяСтрока();
тз.НоваяСтрока();
Сообщить("Всего: "+тз.КоличествоСтрок()+" Текущая: "+тз.НомерСтроки);
Сообщить("Всего: "+тз.КоличествоСтрок()+" Текущая: "+тз.ТекущаяСтрока());
тз.ПолучитьСтрокуПоНомеру(3);
Сообщить("Всего: "+тз.КоличествоСтрок()+" Текущая: "+тз.НомерСтроки);
Сообщить("Всего: "+тз.КоличествоСтрок()+" Текущая: "+тз.ТекущаяСтрока());

И знаешь что выведет?
----------------------
Всего: 5 Текущая: 5
Всего: 5 Текущая: 1
Всего: 5 Текущая: 3
Всего: 5 Текущая: 1
----------------------

А теперь выполни тоже, только убери ТЗ с формы диалога и первой строчкой вставь тз = СоздатьОбъект("ТаблицаЗначений");

И выведет уже так:
---------------------
Всего: 5 Текущая: 5
Всего: 5 Текущая: 0
Всего: 5 Текущая: 3
Всего: 5 Текущая: 0
---------------------

И ты понимаешь, в чем прикол, что интерактивный выбор строки пользователем ты можешь узнать одним методом, а программное позиционирование другим:-)

Более того, замени в этом примере тз.ПолучитьСтрокуПоНомеру(3); на тз.ТекущаяСтрока(3); и для программно сформированной ТЗ ты увидишь:
---------------------
Всего: 5 Текущая: 5
Всего: 5 Текущая: 0
Всего: 5 Текущая: 5
Всего: 5 Текущая: 3
---------------------

А для элемента диалога ТЗ:
---------------------
Всего: 5 Текущая: 5
Всего: 5 Текущая: 1
Всего: 5 Текущая: 5
Всего: 5 Текущая: 3
---------------------

И клиника тут тоже в том, что спозиционировать строку, так, чтобы и курсор на нее встал, когда это элемент диалога, тебе нужно тоже, одним методом, а когда программно созданную другим.

Короче, где универсальность?:-) Т.е. сегодня я пишу функцию, которая ТЗ как элемент диалога не предполагает, а завтра, если мне нужно тот же алгоритм, но еще и учитывая действия пользователя, то я должен другую писать? Жирно не будет?:-)))
13. DAVID (СССР) 13.08.09 10:20