Рекурсивный поиск каталога среди каталогов.

02.04.15

Задачи пользователя - Поиск данных

Внимание особо умных. Предложенная процедура актуальна для конфигураций на платформе 8.1 и ниже.
В них для функции НайтиФайлы не был реализован рекурсивный поиск в подкаталогах.
Это указано в справке.

Задача
Найти путь к  вложенному каталогу.
Пример

Каталог AST содержит каталоги A1, S1, T1
Каталог A1 содержит каталоги 0001, 0002, 0003
каталог S1 содержит каталоги 1001, 1002, 1003
Каталог Т1 содержит каталоги 2001, 2002, 2003

На входе функции КорневойКаталог = "D:\AST"
                            КаталогПоиска = "1002"
На выходе функции НайденныйПуть = "D:\AST\A1\1002"

Уточнение - имена КаталогПоиска уникальны и не повторяются.
Функция НайтиФайлы не помогает - она ищет их только в текущем каталоге.
Перем СписокКаталогов ;

Функция ФайлСуществует (Знач ПутьКФайлу) Экспорт
    Файл = Новый Файл (ПутьКФайлу);
    Возврат Файл.Существует();
КонецФункции

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

КонецПроцедуры

Процедура ПоказатьДокументыНажатие(Элемент)
   
    Если ФайлСуществует(ПапкаПользователя) = ложь Тогда
        
// Разбираем строку пути и вычленяем имя (только имя) каталога пользователя
ФлагПоиска1 = 0; ТСтрока = ПапкаПользователя; Пока ФлагПоиска1 = 0 Цикл НомерСимвола = Найти(ТСтрока,"\"); ДлСтроки = СтрДлина(ТСтрока); НоваяСтрока = Прав(ТСтрока, ДлСтроки - НомерСимвола); Если Найти(НоваяСтрока,"\") = 0 тогда ФлагПоиска1 = 1; Прервать; КонецЕсли; ТСтрока = НоваяСтрока; КонецЦикла; // Путь к каталогу хранения - это путь к каталогу - внутри которого осуществляем поиск.
// в общем случае это имя диска
 ПутьХранения = Константы.ПутьККаталогуХранения.Получить()+ "\"; СписокКаталогов = Новый СписокЗначений; ПоискКаталога (ПутьХранения);
// Поиск имени каталога в списке каталогов.
// И соответсвенно реакция
НайденныйКаталог = СписокКаталогов.НайтиПоЗначению(НоваяСтрока); Если НайденныйКаталог = Неопределено Тогда Предупреждение ("Каталог пользователя потерян." + Символы.ПС + "Поиск каталога результатов не дал." + Символы.ПС + "Нужна ручная корректировка"); Возврат ; Иначе ТекстВопроса = "Каталог пользователя потерян." + Символы.ПС + "Каталог обнаружен в новом месте." + Символы.ПС + "Старое размещение: "+ ЭтотОбъект.ПапкаПользователя + Символы.ПС + "Новое размещение : "+ НайденныйКаталог.Представление + Символы.ПС + "Скорректировать размещение?"; РезультатВопроса = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда Сообщить ("Путь к найденному каталогу " + НайденныйКаталог.Представление); Возврат ; Иначе ЭтотОбъект.ПапкаПользователя = НайденныйКаталог.Представление; Сообщить ("Внесение изменений."); Попытка ЭтотОбъект.Записать (); Исключение Предупреждение("Не удалось записать объект """ + ЭтотОбъект + """ |" + ОписаниеОшибки(),60); КонецПопытки; КонецЕсли; КонецЕсли; КонецЕсли; // Здесь вызываем обработку открытия папки по указанному пути КонецПроцедуры

Рекурсивый поиск каталога

См. также

Поиск данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

10800 руб.

14.05.2012    159655    339    253    

573

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    25149    dimanich70    82    

149

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4505    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    25466    atdonya    25    

58

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    6075    ke.92@mail.ru    17    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    16560    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4270    73    progmaster    10    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Romeo_1c_programmer 33 19.09.14 15:42 Сейчас в теме
Данная задача решается проще с использованием функции "Найти файлы". Пример кода:

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

Показать
Прикрепленные файлы:
ПоискКаталога.epf
user970589; jobkostya1c_ERP; DitriX; BigB; +4 1 Ответить
3. jobkostya1c_ERP 100 21.09.14 14:04 Сейчас в теме
(1) Romeo_1c_programmer, конечно, поглядим на практике когда возникнет необходимость поиска. Нужны разные идеи и алгоритмы. Хотя в 1С стараются не доводить до того чтоб заниматься сложным поиском. Итак проблем хватает с путями на FTP.
4. betepon 71 30.09.14 18:26 Сейчас в теме
(1) Romeo_1c_programmer, (2) DitriX,
Попробуйте процедуру от Romeo_1c_programmer использовать в 8.1
Вас, как и меня, ожидает СЮРПРИЗ - она не работает. "Ошибка - слишком много параметров" ;)))
А правильный синтаксис для 8.1 выглядит так
Результат = НайтиФайлы(Путь, "*");
Но поиск будет производится только в каталоге (Путь). Это написано в справке. И во внутренние каталоги НайтиФайлы () заглянуть не может :))).
Это реализовано только начиная с 8.2

Не волнуйтесь - не Вы первые подсказываете заглянуть в справку и написать код, как это сделал Romeo_1c_programmer.
И не Вы последние ошибаетесь.

Так что для конфигураций ниже 8.2 этот алгоритм пока единственный.
5. user970589 10 15.12.21 16:28 Сейчас в теме
(1)
"Найд

Большое человеческое спасибо! )
2. DitriX 2102 20.09.14 13:07 Сейчас в теме
Это называется - не люблю читать внимательно справку :)
Оставьте свое сообщение