Добрый день.

Вот вопрос возник - нужно прочитать состав каталога со всеми подчиненными, причем сделать это быстро. Файлов МНОГО.
Естественно первый лобовой метод -

```1c
    НайденныеФайлы = НайтиФайлы(Адрес, "*.*");
    Для Каждого Файл Из НайденныеФайлы Цикл
    Попытка
    Если Файл.ЭтоФайл() Тогда
    Стр=ТабФайлов.Добавить();
    Стр.ДатаВремя=Файл.ПолучитьВремяИзменения();
    Стр.Длина=Файл.Размер();
    Стр.ПутьОригинальный=Файл.ПолноеИмя;
    Иначе
    ЗаполнитьРекурсивно (Адрес+"\"+Файл.Имя,Тип,Глубина+1,Режем,Префикс);
    КонецЕсли;
    Исключение
    Сообщить ("+ОписаниеОшибки());
    Возврат Ложь;
    КонецПопытки;
    КонецЦикла;
```

Работает. Но м-е-е-е-е-е-дленнно... Все время занимает чтение имени, времени и размера.
Банальный батник 2.bat в текстовый файл выкидывает раз в 5 быстрее практически то же самое:

```1c
    @for /D %%i IN (%1\*.*) do @(@dir "%%i"
    @call 2 "%%i")
```

Сравнение времени - час и 5 минут. Причем кэш системы почти не влияет, проверял.
Конечно можно поанализировать выгрузку текстового файла, но как-то неправильно это.
Кто решал подобное? Может есть решение красивее? Не в параллельность и не на сервере - серверный пользователь никогда не будет иметь достаточных прав для чтения файлов.
---
как то так:

```1c
    Процедура ПолучитьИнформациюОФайлах(Путь)
    ТабФайлов.Очистить();
    ФСО = Новый COMОбъект("Scripting.FileSystemObject");
    Folders = ФСО.GetFolder(Путь);
    ЗаполнитьИнформациюПоФайлам(Folders.Files);
    ОбходПодпапок(ФСО.GetFolder(Путь));
    КонецПроцедуры

    Функция ОбходПодпапок(Folder)
    Для Каждого Subfolder Из Folder.SubFolders Цикл
    ЗаполнитьИнформациюПоФайлам(Subfolder.Files);
    ОбходПодпапок(Subfolder);
    КонецЦикла;
    КонецФункции

    Процедура ЗаполнитьИнформациюПоФайлам(Files)
    Перем Стр, файл;

    Для Каждого файл Из Files Цикл
    Стр = ТабФайлов.Добавить();
    Стр.DateCreated = файл.DateCreated;
    Стр.DateLastAccessed = файл.DateLastAccessed;
    Стр.DateLastModified = файл.DateLastModified;
    Стр.Name = файл.Name;
    Стр.Path = файл.Path;
    Стр.Size = файл.Size;
    КонецЦикла;

    КонецПроцедуры
```
---
как то так:

```1c
    Процедура ПолучитьИнформациюОФайлах(Путь)
    ТабФайлов.Очистить();
    ФСО = Новый COMОбъект("Scripting.FileSystemObject");
    Folders = ФСО.GetFolder(Путь);
    ЗаполнитьИнформациюПоФайлам(Folders.Files);
    ОбходПодпапок(ФСО.GetFolder(Путь));
    КонецПроцедуры

    Функция ОбходПодпапок(Folder)
    Для Каждого Subfolder Из Folder.SubFolders Цикл
    ЗаполнитьИнформациюПоФайлам(Subfolder.Files);
    ОбходПодпапок(Subfolder);
    КонецЦикла;
    КонецФункции

    Процедура ЗаполнитьИнформациюПоФайлам(Files)
    Перем Стр, файл;

    Для Каждого файл Из Files Цикл
    Стр = ТабФайлов.Добавить();
    Стр.DateCreated = файл.DateCreated;
    Стр.DateLastAccessed = файл.DateLastAccessed;
    Стр.DateLastModified = файл.DateLastModified;
    Стр.Name = файл.Name;
    Стр.Path = файл.Path;
    Стр.Size = файл.Size;
    КонецЦикла;

    КонецПроцедуры
```
---
О! Я думал ветка уже скисла )
Посмотрел скорость.
Судя по всему это то же самое, что и 1с вызывает. Через Dir вышло в несколько раз быстрее - 1 200 000 за 10 примерно минут

Команда="dir /S """+Источник+""" > "+ИмяФайла+" ";
КомандаСистемы(Команда, КаталогВременныхФайлов());

и дальше прочесть текстовый вывод.
---
Так результат батника можно записать в файл и открыть. И все это из 1с.
КомандаСистемы()
ЗапуститьПриложение()
---
Так и сделал. Но как-то некрасиво... Временный файл, чтение через хз что... Неужели api нет?
---
Через COM средствами системы,не?
---
Да, правильно. Но КАК? Не специалист я по СОМ...
---
Получилось быстрее?
---
все относительно.
Обычный диск ( не SSD).
папок = 109 606; файлов = 664 093; время выполнения = 12 минут.
---
Нет. самый быстрый вариант:
Команда="dir /S """+Источник+""" > "+ИмяФайла+" ";
КомандаСистемы(Команда, КаталогВременныхФайлов());

и дальше прочесть текстовый вывод.
1 200 000 за 10 примерно минут. Задержка уже на сервере происходит только.