Как можно получить иерархию папок из видовс в 1с через обработку?
---
Сделал так:

```1c
    &НаКлиенте
    Процедура ВыполнитьОбработку(Команда)

    ЗаполнитьДерево (Каталог);

    Сообщить("Обработка выполнена");

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

    &НаСервере
    Функция ЗаполнитьДерево (ПутьКаталога)

    НайденныеФайлы = НайтиФайлы(ПутьКаталога,"*");
    Для каждого ф из НайденныеФайлы цикл

    Если ф.ЭтоКаталог() И НЕ ф.ПолучитьНевидимость() тогда
    //Сообщить(ф.ПолноеИмя);
    Ном = НайтиНоменклатуруПоКоду(ф.Имя);
    Если ЗначениеЗаполнено(Ном) Тогда

    НомДопРек = Ном.ПолучитьОбъект();
    //Получаем ссылку на доп реквизит
    ДопРеквизитПроверено = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Фотографии для сайта", Истина);
    ЕстьСтроки = НомДопРек.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизитПроверено));//Пусть результатом поиска будут "ЕстьСтроки"
    Если ЕстьСтроки.Количество() = 0 Тогда
    СтрокаТЧ = НомДопРек.ДополнительныеРеквизиты.Добавить();
    СтрокаТЧ.Свойство = ДопРеквизитПроверено;
    Иначе
    СтрокаТЧ = ЕстьСтроки[0];
    КонецЕсли;

    Если СтрокаТЧ.Значение <> ф.ПолноеИмя Тогда
    Если СтрокаТЧ.Значение <> Неопределено Тогда
    Сообщить("Путь для номенклатуры: " + Строка(Ном.Наименование) + ", с кодом: " + Строка(Ном.Код) + " был изменен!");
    КонецЕсли;

    СТрокаТЧ.Значение = ф.ПолноеИмя;
    НомДопРек.Записать();
    КонецЕсли;

    КонецЕсли;

    ЗаполнитьДерево(ПутьКаталога+"\"+ф.Имя);
    КонецЕсли;
    КонецЦикла;

    КонецФункции

    &НаКлиенте
    Процедура КаталогНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартанаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = ";
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите каталог";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
    Каталог = ДиалогОткрытияФайла.Каталог;
    Иначе
    Каталог = ";
    Предупреждение("Каталог не выбран!");
    КонецЕсли;
    КонецПроцедуры
```
---
IMHO - только путем написания такой обработки
---
Как вариант использовать команду TREE в CMD, затем считать содержимое окна.
Как работать с bat и содержимым окна из 1С посмотрите здесь:
https://forum.infostart.ru/forum9/topic285286/
---
```1c
    Функция ПолучитьВыборкупоФайлам(Каталог, ИскатьВПодкаталогах = Ложь)

    НайденныеФайлы = НайтиФайлы(Каталог, "*", ИскатьВПодкаталогах);

    СписокГрупп = Новый СписокЗначений;

    СписокИтогов = Новый СписокЗначений;

    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Имя" , Новый ОписаниеТипов("Строка"));
    ТЗ.Колонки.Добавить("ПолноеИмя" , Новый ОписаниеТипов("Строка"));
    ТЗ.Колонки.Добавить("Путь" , Новый ОписаниеТипов("Строка"));

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

    КолонкаИерархии = "Путь";
    ТЗ.Колонки[КолонкаИерархии].Имя = КолонкаИерархии + "Врем";
    ТЗ.Колонки.Добавить(КолонкаИерархии, Новый ОписаниеТипов("Строка"));
    Для Каждого текСтрока Из ТЗ Цикл
    текСтрока[КолонкаИерархии]= текСтрока[КолонкаИерархии + "Врем"];
    КонецЦикла;

    ПЗ = Новый ПостроительЗапроса;

    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

    Для Каждого текГруппа Из СписокГрупп Цикл
    ПЗ.ИсточникДанных.Колонки[текГруппа.Значение].Измерение = Истина;
    КонецЦикла;

    Для Каждого текИтог Из СписокИтогов Цикл
    ПЗ.ИсточникДанных.Колонки[текИтог.Значение].Итог = текИтог.Значение;
    КонецЦикла;

    ПЗ.ЗаполнитьНастройки();
    ПЗ.Выполнить();

    Возврат ПЗ.Результат;

    КонецФункции
```

(1) для иерархии используй "СписокГрупп "
---
```1c
    ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогФыбораФайла.Фильтр = "Лист Microsoft Office Excel (*.xlsx)|*.xlsx|Лист Microsoft Office Excel (*.xls)|*.xls";
    ДиалогФыбораФайла.Заголовок = "Выберите файл";
    ДиалогФыбораФайла.ПредварительныйПросмотр = Истина;
    ДиалогФыбораФайла.ИндексФильтра = 0;
    Если ДиалогФыбораФайла.Выбрать() Тогда
    Объект.ИмяФайла = ДиалогФыбораФайла.ПолноеИмяФайла;
    КонецЕсли;
```

Выбираете нужный файл и записываете его полное имя (путь) в реквизит ИмяФайла. Пример для Excel-файлов. Если фильтр не установить, можно будет выбрать любой тип.
---
Как я понял автора: ему задали показать ВСЮ структуру папок на диске или даже на ВСЕХ дисках компа
a'la Explorer
---
Насколько я понял, более реальная задача указать путь именно к конкретному файлу. Если кто-то из нас не прав, автор обязательно поправит)
---
```1c
    НайтиФайлы()
```

И перебираем все элементы массива
---
Задание чуть другое, надо просмотреть все название папок в видовс по определенному пути (название этих папок -это код номенклатуры из 1С). и если название(код) совпадает с кодом номенклатуры ту записать путь к этой папке в доп реквизит номенклатуры
---
Может и Иерархию папок сверять. чтобы она совпадала в "виндовс" и в 1С?
И приводить как-то в соответствие: если, к примеру, товар в 1С переместили в другую папку, то и в "виндовс" переместить ...
---
Сделал так:

```1c
    &НаКлиенте
    Процедура ВыполнитьОбработку(Команда)

    ЗаполнитьДерево (Каталог);

    Сообщить("Обработка выполнена");

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

    &НаСервере
    Функция ЗаполнитьДерево (ПутьКаталога)

    НайденныеФайлы = НайтиФайлы(ПутьКаталога,"*");
    Для каждого ф из НайденныеФайлы цикл

    Если ф.ЭтоКаталог() И НЕ ф.ПолучитьНевидимость() тогда
    //Сообщить(ф.ПолноеИмя);
    Ном = НайтиНоменклатуруПоКоду(ф.Имя);
    Если ЗначениеЗаполнено(Ном) Тогда

    НомДопРек = Ном.ПолучитьОбъект();
    //Получаем ссылку на доп реквизит
    ДопРеквизитПроверено = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Фотографии для сайта", Истина);
    ЕстьСтроки = НомДопРек.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизитПроверено));//Пусть результатом поиска будут "ЕстьСтроки"
    Если ЕстьСтроки.Количество() = 0 Тогда
    СтрокаТЧ = НомДопРек.ДополнительныеРеквизиты.Добавить();
    СтрокаТЧ.Свойство = ДопРеквизитПроверено;
    Иначе
    СтрокаТЧ = ЕстьСтроки[0];
    КонецЕсли;

    Если СтрокаТЧ.Значение <> ф.ПолноеИмя Тогда
    Если СтрокаТЧ.Значение <> Неопределено Тогда
    Сообщить("Путь для номенклатуры: " + Строка(Ном.Наименование) + ", с кодом: " + Строка(Ном.Код) + " был изменен!");
    КонецЕсли;

    СТрокаТЧ.Значение = ф.ПолноеИмя;
    НомДопРек.Записать();
    КонецЕсли;

    КонецЕсли;

    ЗаполнитьДерево(ПутьКаталога+"\"+ф.Имя);
    КонецЕсли;
    КонецЦикла;

    КонецФункции

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