При разработке механизмов загрузки данных часто возникает ситуация, когда пользователю необходимо предоставить выбор из файлов нескольких форматов. Например, отчет может быть сохранен как в классическом формате Excel (.xls), так и в современном (.xlsx). Если настроить фильтр стандартным способом через вертикальную черту, операционная система разделит типы файлов на отдельные выпадающие списки, и пользователю придется вручную переключаться между ними в диалоговом окне. Разберем, как объединить несколько форматов в один пункт списка, проанализируем синтаксис маски и рассмотрим важные нюансы работы с файловыми диалогами на различных платформах.
Стандартный пример из Синтаксис-помощника демонстрирует разделение типов файлов знаком вертикальной черты (|). Каждая пара «Описание|Маска» создает отдельную строчку в выпадающем меню проводника:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Текстовый документ (*.txt)|*.txt|Табличный документ (*.mxl)|*.mxl";
Чтобы диалоговое окно проводника отображало сразу файлы с расширениями .xls и .xlsx одновременно без переключения фильтра, используем разделение масок через точку с запятой (;). Посмотрим на рабочий пример формирования строки:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Табличные документы (*.xls, *.xlsx)|*.xls;*.xlsx";
В этой конструкции левая часть (до вертикальной черты) содержит человекочитаемое описание, которое выводится в интерфейсе, а правая часть указывает операционной системе список масок для отображения файлов.
При заполнении свойства Фильтр объекта ДиалогВыбораФайла легко допустить неочевидные ошибки, из-за которых диалог перестает фильтровать файлы должным образом. Проанализируем эти правила подробнее:
*.xls; *.xlsx, то файлы второго типа искаться не будут, так как система попытается найти расширение, начинающееся с пробела. Записываем строго слитно: *.xls;*.xlsx. В левой поясняющей части пробелы разрешены без ограничений.* (любое количество символов) и ? (один символ). Например, чтобы открыть все форматы электронных таблиц (включая .xls, .xlsx, .xlsm, .xlsb), можно использовать короткую маску *.xl*:
Диалог.Фильтр = "Файлы Excel (*.xl*)|*.xl*";
РежимДиалогаВыбораФайла.Открытие). Если использовать такую группировку в режиме сохранения (РежимДиалогаВыбораФайла.Сохранение), операционная система не сможет определить, какое именно расширение необходимо автоматически дописать к имени файла, если пользователь не указал его вручную. Для режима сохранения всегда разделяем форматы отдельными группами через | либо явно заполняем свойство Расширение.*.xls;*.xlsx, файл с именем в верхнем регистре (например, REPORT.XLS) будет скрыт в окне выбора. Для кроссплатформенных конфигураций полезно указывать оба регистра:
Диалог.Фильтр = "Файлы Excel|*.xls;*.XLS;*.xlsx;*.XLSX";
Если в фильтре задано несколько групп (разделенных символом |), мы можем заранее определить, какая группа будет активной при открытии окна. Для этого используется свойство ИндексФильтра. Нумерация индексов всегда начинается с нуля. Разберем пример:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Все таблицы (*.xls;*.xlsx)|*.xls;*.xlsx|Текстовые файлы (*.txt;*.csv)|*.txt;*.csv";
// Устанавливаем по умолчанию второй пункт списка (текстовые файлы)
Диалог.ИндексФильтра = 1;
В современных конфигурациях 1С (при работе на управляемых формах с выключенным режимом модальности, а также в веб-клиенте) синхронный метод Выбрать() вызывает ошибку блокировки интерфейса. Вместо него вызываем асинхронный метод Показать() с передачей обработчика оповещения. Посмотрим на полный пример реализации:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для загрузки данных";
Диалог.ПолноеИмяФайла = "";
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.Фильтр = "Документы Excel (*.xls;*.xlsx)|*.xls;*.xlsx|Все файлы (*.*)|*.*";
Диалог.ИндексФильтра = 0;
Оповещение = Новый ОписаниеОповещения("ВыбратьФайлЗавершение", ЭтотОбъект, Диалог);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьФайлЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
ВыбранныйПуть = ВыбранныеФайлы[0];
// Выполняем дальнейшую обработку полученного файла
КонецЕсли;
КонецПроцедуры
Обратите внимание: для работы объекта ДиалогВыбораФайла в браузере (веб-клиент) на клиентском компьютере должно быть установлено расширение работы с файлами 1С:Предприятия.
В современной разработке на базе Библиотеки стандартных подсистем (БСП) или при необходимости сразу передать файл на сервер применяются другие механизмы:
НачатьПомещениеФайлаНаСервер() использует объект ПараметрыДиалогаПомещенияФайлов. Свойство Фильтр в нем заполняется точно так же, но данный метод нативно работает в любых браузерах через встроенные элементы загрузки:
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл";
ПараметрыДиалога.Фильтр = "Файлы Excel (*.xls;*.xlsx)|*.xls;*.xlsx";
ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(). Она автоматически обрабатывает специфику операционной системы клиента и корректно инициализирует веб-расширения при их отсутствии.