При разработке различных механизмов выгрузки, пакетной обработки документов или загрузки данных разработчики 1С часто сталкиваются с задачей выбора пользователем целевого каталога. Однако при стандартном использовании объекта ДиалогВыбораФайла в режиме выбора папки файлы внутри каталогов не отображаются. Разберем причины такого поведения платформы и рассмотрим практические способы решения этой задачи.
Причины и ограничения платформы
Выясним причину, почему стандартный диалог скрывает файлы. Объект ДиалогВыбораФайла при установленном свойстве РежимДиалогаВыбораФайла.ВыборКаталога вызывает системное диалоговое окно операционной системы (Windows, Linux, macOS). На системном уровне такое окно предназначено исключительно для навигации по иерархии папок и скрывает любые файлы. Кроме того, свойство Фильтр объекта ДиалогВыбораФайла в режиме выбора каталога игнорируется платформой 1С. В среде веб-клиента на работу диалогов также накладываются ограничения браузерной модели безопасности.
Поэтому отобразить файлы в стандартном окне выбора каталога напрямую невозможно. Рассмотрим подробнее альтернативные варианты реализации нужного поведения.
Проанализируем наиболее простое и часто применяемое решение: открыть диалог в режиме выбора файла, предложить пользователю выбрать любой файл внутри нужного каталога, а затем программно отсечь имя файла и получить путь к папке.
Разберем по шагам, как это реализовать:
ДиалогВыбораФайла в режиме РежимДиалогаВыбораФайла.Открытие.*.*).Путь объекта Файл.Посмотрим на пример асинхронного вызова диалога на клиенте в управляемых формах:
&НаКлиенте
Процедура ВыбратьКаталогЧерезФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите любой файл в требуемой папке";
Диалог.Фильтр = "Все файлы (*.*)|*.*";
Диалог.МножественныйВыбор = Ложь;
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Или ВыбранныеФайлы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ПолноеИмяФайла = ВыбранныеФайлы[0];
ФайлИнфо = Новый Файл(ПолноеИмяФайла);
ВыбранныйКаталог = ФайлИнфо.Путь;
Сообщить("Выбранный каталог: " + ВыбранныйКаталог);
КонецПроцедуры
Преимущество метода: не требуется разрабатывать собственный интерфейс, используется стандартное системное окно проводника со всеми функциями поиска, сортировки и предпросмотра файлов.
Если требуется предоставить пользователю возможность видеть состав каталога и выбирать сам каталог, даже если в нем нет файлов или нельзя требовать клика по конкретному файлу, создадим собственную форму проводника в 1С.
Рассмотрим структуру такого решения:
НайтиФайлы() или асинхронный метод НачатьПоискФайлов() для сканирования файловой системы.Посмотрим на пример получения содержимого каталога на клиенте:
&НаКлиенте
Процедура ОбновитьСодержимоеКаталога(ПутьКПапке)
НайденныеФайлы = НайтиФайлы(ПутьКПапке, "*.*");
ЭлементыКаталога.Очистить();
Для Каждого ТекущийФайл Из НайденныеФайлы Цикл
НоваяСтрока = ЭлементыКаталога.Добавить();
НоваяСтрока.Имя = ТекущийФайл.Имя;
НоваяСтрока.ЭтоКаталог = ТекущийФайл.ЭтоКаталог();
Если Не ТекущийФайл.ЭтоКаталог() Тогда
НоваяСтрока.Размер = ТекущийФайл.Размер();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Преимущество метода: полный контроль над поведением интерфейса, фильтрацией отображаемых данных и логикой подтверждения выбора каталога пользователем.