Как указать несколько расширений в фильтре диалога выбора файла 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке механизмов загрузки данных часто возникает ситуация, когда пользователю необходимо предоставить выбор из файлов нескольких форматов. Например, отчет может быть сохранен как в классическом формате Excel (.xls), так и в современном (.xlsx). Если настроить фильтр стандартным способом через вертикальную черту, операционная система разделит типы файлов на отдельные выпадающие списки, и пользователю придется вручную переключаться между ними в диалоговом окне. Разберем, как объединить несколько форматов в один пункт списка, проанализируем синтаксис маски и рассмотрим важные нюансы работы с файловыми диалогами на различных платформах.

Синтаксис объединения нескольких масок в одну строку

Стандартный пример из Синтаксис-помощника демонстрирует разделение типов файлов знаком вертикальной черты (|). Каждая пара «Описание|Маска» создает отдельную строчку в выпадающем меню проводника:


Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Текстовый документ (*.txt)|*.txt|Табличный документ (*.mxl)|*.mxl";

Чтобы диалоговое окно проводника отображало сразу файлы с расширениями .xls и .xlsx одновременно без переключения фильтра, используем разделение масок через точку с запятой (;). Посмотрим на рабочий пример формирования строки:


Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Табличные документы (*.xls, *.xlsx)|*.xls;*.xlsx";

В этой конструкции левая часть (до вертикальной черты) содержит человекочитаемое описание, которое выводится в интерфейсе, а правая часть указывает операционной системе список масок для отображения файлов.

Критические правила формирования строки фильтра

При заполнении свойства Фильтр объекта ДиалогВыбораФайла легко допустить неочевидные ошибки, из-за которых диалог перестает фильтровать файлы должным образом. Проанализируем эти правила подробнее:

  1. Запрет пробелов в маске после точки с запятой: В правой части фильтра (после вертикальной черты) пробелы воспринимаются операционной системой как часть расширения файла. Если написать *.xls; *.xlsx, то файлы второго типа искаться не будут, так как система попытается найти расширение, начинающееся с пробела. Записываем строго слитно: *.xls;*.xlsx. В левой поясняющей части пробелы разрешены без ограничений.
  2. Использование символов подстановки: Помимо явного перечисления, маски поддерживают стандартные символы шаблонов * (любое количество символов) и ? (один символ). Например, чтобы открыть все форматы электронных таблиц (включая .xls, .xlsx, .xlsm, .xlsb), можно использовать короткую маску *.xl*: Диалог.Фильтр = "Файлы Excel (*.xl*)|*.xl*";
  3. Ограничения в режиме сохранения файлов: Группировка масок через точку с запятой корректно работает исключительно при открытии (РежимДиалогаВыбораФайла.Открытие). Если использовать такую группировку в режиме сохранения (РежимДиалогаВыбораФайла.Сохранение), операционная система не сможет определить, какое именно расширение необходимо автоматически дописать к имени файла, если пользователь не указал его вручную. Для режима сохранения всегда разделяем форматы отдельными группами через | либо явно заполняем свойство Расширение.
  4. Регистрозависимость в операционных системах Linux и macOS: В отличие от Windows, файловые системы ОС Linux чувствительны к регистру символов. Если в диалоге указана маска *.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С:Предприятия.

Альтернативные решения для загрузки файлов

В современной разработке на базе Библиотеки стандартных подсистем (БСП) или при необходимости сразу передать файл на сервер применяются другие механизмы:

  1. Диалог помещения файлов на сервер: Метод НачатьПомещениеФайлаНаСервер() использует объект ПараметрыДиалогаПомещенияФайлов. Свойство Фильтр в нем заполняется точно так же, но данный метод нативно работает в любых браузерах через встроенные элементы загрузки:
    
    ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
    ПараметрыДиалога.Заголовок = "Выберите файл";
    ПараметрыДиалога.Фильтр = "Файлы Excel (*.xls;*.xlsx)|*.xls;*.xlsx";
    
  2. Методы БСП: При использовании подсистемы работы с файлами рекомендуется использовать процедуру общего модуля ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(). Она автоматически обрабатывает специфику операционной системы клиента и корректно инициализирует веб-расширения при их отсутствии.
← На главную