1С 8.1: Иерархия папок в заданном каталоге. Использование рекурсивной функции.

Опубликовал Alexei Zhovner (jan27) в раздел Программирование - Практика программирования

Была поставлена такая задача, может кому пригодится.
Решение с использованием рекурсивной функции.
Обработка во вложении.
Алгоритм в описании.

Внешний вид отчета:

Модуль формы:

Процедура КаталогНачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартанаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите каталог";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        Каталог = ДиалогОткрытияФайла.Каталог;
    Иначе
        Каталог = "";
        Предупреждение("Каталог не выбран!");
    КонецЕсли;
КонецПроцедуры

Процедура Сформировать()
    Дерево.Строки.Очистить();
    Если СокрЛП(Каталог) = "" тогда
        Предупреждение("Необходимо указать начальный каталог");
        Возврат;
    КонецЕсли;
    ВыполнитьДействие(Дерево);
    ЭлементыФормы.Дерево.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать;
    ЭлементыФормы.Дерево.СоздатьКолонки();
КонецПРоцедуры

 

Модуль объекта:

Функция ЗаполнитьДерево (ПутьКаталога,врДерево)
    НайденныеФайлы = НайтиФайлы(ПутьКаталога,"*");
    Для каждого ф из НайденныеФайлы цикл
        Если ф.ЭтоКаталог() И НЕ ф.ПолучитьНевидимость() тогда
            НовСтр = врДерево.Строки.Добавить();
            НовСтр.Каталог = ф.Имя;
            ЗаполнитьДерево(ПутьКаталога+"\"+ф.Имя,НовСтр);
        КонецЕсли;
    КонецЦикла;
КонецФункции

Процедура ВыполнитьДействие(ДеревоЗн) Экспорт
    НовСтр = ДеревоЗн.Строки.Добавить();
    НовСтр.Каталог = Каталог;
    ЗаполнитьДерево(Каталог,НовСтр);   
КонецПРоцедуры

 

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

Наименование Файл Версия Размер
Иерархия папок
.erf 11,88Kb
07.02.11
60
.erf 11,88Kb 60 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Сергей Ожерельев (Поручик) 3441 07.02.11 15:31 Сейчас в теме
Баян или классическая задача, ещё с турбопаскалевых времён. Рекурсивное заполнение динамического списка или построение структуры каталогов.
2. Александр Полетаев (Alias) 32 07.02.11 15:32 Сейчас в теме
Очевидный код для решения несложной задачи. Сейчас рекурсия -- это уже азы программирования. Всё равно что учить что метод "Выбрать" -- выбирает, а "Добавить" -- добавляет.
Быстрее написать самому чем искать готовое.
За что ставить плюс? Твёрдый ноль -- ни плюсов, ни минусов...
3. Alexei Zhovner (jan27) 589 07.02.11 15:37 Сейчас в теме
(2) эта работа писалась не для тех, кому быстрее написать самому )
о рекурсии говорилось и в теме и в анонсе
на что вы рассчитывали когда увидели слово рекурсия?
"Выбрать" - не выбирает?;)
chmod660; +1 Ответить
4. Сергей Ожерельев (Поручик) 3441 07.02.11 15:38 Сейчас в теме
(2) Не будем особо наезжать, человек может старался, обработку ваял. Хотя действительно, блин, детская задачка.
5. Alexei Zhovner (jan27) 589 07.02.11 15:50 Сейчас в теме
(4) не претендую на то, что обработка архисложная
красивое решение..., спасибо, что кроме простоты задачки других нареканий относительно этого решения нет )
6. Александр Медведев (anig99) 2468 07.02.11 16:09 Сейчас в теме
(5) что ж сказать... уровень программистов 1с "с претензией" падает всё ниже и ниже.
Пора действительно организовывать песочницу - место где будут публиковать и обсуждать ЭЛЕМЕНТАРНЫЕ вещи, которые должны знать все.
7. Alexei Zhovner (jan27) 589 07.02.11 16:24 Сейчас в теме
(6) в чем заключается "претензия"?
Вы думаете тут в основном качают всевозможные обработки те кому проще самому написать?

ЗЫ Для меня, например, элементарной вещью, помимо рекурсии, является сканирование, сохранение и печать..., но я же не кричу об этом в вашей работе, я прекрасно понимаю, что это кому-то может пригодится
8. Александр Медведев (anig99) 2468 07.02.11 17:36 Сейчас в теме
(7)
Как и в случае со "строковым калькулятором" претензия одна - это не готовое решение, это полуфабрикат. Как обработка, она не делает НИЧЕГО, как статья она не несет ничего нового и оригинального для мало-мальски знакомого с элементарным программированием. Именно поэтому место таким вещам во всевозможных FAQ и Простых примерах программирования.
Раз уж упомянули мою публикацию - у неё есть чёткое практическое применение в виде готовых обработок, которые можно использовать без дополнительного программирования. Хотя я и мог оставить пример процедуры и ссылку на справку от Microsoft, где всё это написано.
9. Александр Полетаев (Alias) 32 07.02.11 17:59 Сейчас в теме
(2) Я рассчитывал увидеть нечто большее. Какое-нибудь красивое решение, нестандартный оригинальный подход, в котором вместо ожидаемого непроизводительного цикла очень удачно и к месту используется рекурсия. А ничего такого нет.
То есть следующей можно ожидать статью типа "Суммирование числовой колонки дерева. Использование рекурсии". Даже интереснее вывода иерархии папок будет -- там хотя бы можно показать как и зачем в рекурсии используется передача параметров по значению, и показать восходящую рекурсию (от нижних элементов к верхним)...
Не в обиду, правда. :) я ж минус не ставлю, просто и плюса не за что.

Кстати, что касается самой обработки.
Вместо СокрЛП(Каталог) = "" можно использовать типовую функцию ПустаяСтрока(Каталог)
Если в колонке "Каталог" на форме поставить галочку "Отображать иерархию", то две строки
ЭлементыФормы.Дерево.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать;
ЭлементыФормы.Дерево.СоздатьКолонки();

станут вообще лишними.
10. Михаил Ражиков (tango) 467 07.02.11 20:47 Сейчас в теме
(9) Изменено: Alias - 07.02.11 18:01 (италик)
что значит "италик" здесь?
11. Александр Медведев (anig99) 2468 07.02.11 20:54 Сейчас в теме
(10) добавил наклон в некоторые строчки. Называется Italic. Bold, Italic, Underline
12. Сергей Ожерельев (Поручик) 3441 07.02.11 22:02 Сейчас в теме
(10), (11) Спасибо, поржал. Кто в теме, тот поймёт почему.
13. Alexei Zhovner (jan27) 589 07.02.11 22:06 Сейчас в теме
14. Александр Медведев (anig99) 2468 08.02.11 08:10 Сейчас в теме
(13) собственно ссылки там тоже есть.
15. Дандронтий Крузенштерн (dandrontiy) 19.01.12 17:57 Сейчас в теме
как бы получить типовые расширения файлов, зная их расширения ?