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

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

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

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

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

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

 

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

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

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

 

17 Comments

  1. Поручик

    Баян или классическая задача, ещё с турбопаскалевых времён. Рекурсивное заполнение динамического списка или построение структуры каталогов.

    Reply ↓
  2. Alias

    Очевидный код для решения несложной задачи. Сейчас рекурсия — это уже азы программирования. Всё равно что учить что метод «Выбрать» — выбирает, а «Добавить» — добавляет.

    Быстрее написать самому чем искать готовое.

    За что ставить плюс? Твёрдый ноль — ни плюсов, ни минусов…

    Reply ↓
  3. jan27

    (2) эта работа писалась не для тех, кому быстрее написать самому )

    о рекурсии говорилось и в теме и в анонсе

    на что вы рассчитывали когда увидели слово рекурсия?

    «Выбрать» — не выбирает?;)

    Reply ↓
  4. Поручик

    (2) Не будем особо наезжать, человек может старался, обработку ваял. Хотя действительно, блин, детская задачка.

    Reply ↓
  5. jan27

    (4) не претендую на то, что обработка архисложная

    красивое решение…, спасибо, что кроме простоты задачки других нареканий относительно этого решения нет )

    Reply ↓
  6. anig99

    (5) что ж сказать… уровень программистов 1с «с претензией» падает всё ниже и ниже.

    Пора действительно организовывать песочницу — место где будут публиковать и обсуждать ЭЛЕМЕНТАРНЫЕ вещи, которые должны знать все.

    Reply ↓
  7. jan27

    (6) в чем заключается «претензия»?

    Вы думаете тут в основном качают всевозможные обработки те кому проще самому написать?

    ЗЫ Для меня, например, элементарной вещью, помимо рекурсии, является сканирование, сохранение и печать…, но я же не кричу об этом в вашей работе, я прекрасно понимаю, что это кому-то может пригодится

    Reply ↓
  8. anig99

    (7)

    Как и в случае со «строковым калькулятором» претензия одна — это не готовое решение, это полуфабрикат. Как обработка, она не делает НИЧЕГО, как статья она не несет ничего нового и оригинального для мало-мальски знакомого с элементарным программированием. Именно поэтому место таким вещам во всевозможных FAQ и Простых примерах программирования.

    Раз уж упомянули мою публикацию — у неё есть чёткое практическое применение в виде готовых обработок, которые можно использовать без дополнительного программирования. Хотя я и мог оставить пример процедуры и ссылку на справку от Microsoft, где всё это написано.

    Reply ↓
  9. Alias

    (2) Я рассчитывал увидеть нечто большее. Какое-нибудь красивое решение, нестандартный оригинальный подход, в котором вместо ожидаемого непроизводительного цикла очень удачно и к месту используется рекурсия. А ничего такого нет.

    То есть следующей можно ожидать статью типа «Суммирование числовой колонки дерева. Использование рекурсии». Даже интереснее вывода иерархии папок будет — там хотя бы можно показать как и зачем в рекурсии используется передача параметров по значению, и показать восходящую рекурсию (от нижних элементов к верхним)…

    Не в обиду, правда. 🙂 я ж минус не ставлю, просто и плюса не за что.

    Кстати, что касается самой обработки.

    Вместо СокрЛП(Каталог) = «» можно использовать типовую функцию ПустаяСтрока(Каталог)

    Если в колонке «Каталог» на форме поставить галочку «Отображать иерархию», то две строки

    ЭлементыФормы.Дерево.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать;

    ЭлементыФормы.Дерево.СоздатьКолонки();


    станут вообще лишними.

    Reply ↓
  10. tango

    (9) Изменено: Alias — 07.02.11 18:01 (италик)

    что значит «италик» здесь?

    Reply ↓
  11. anig99

    (10) добавил наклон в некоторые строчки. Называется Italic. Bold, Italic, Underline

    Reply ↓
  12. Поручик

    (10), (11) Спасибо, поржал. Кто в теме, тот поймёт почему.

    Reply ↓
  13. jan27

    спасибо за замечания

    Reply ↓
  14. anig99

    (13) собственно ссылки там тоже есть.

    Reply ↓
  15. dandrontiy

    как бы получить типовые расширения файлов, зная их расширения ?

    Reply ↓
  16. keeperofswords

    Спасибо за код! сэкономил много времени!! Так же решил доделать там — размер, дату , жирность, проваливаться в файл и т.д. Делюсь своим результатом — может будет полезно для дальнейшего развития отчета.

    Reply ↓
  17. jan27

    (16) Спасибо

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *