Разработка и Конфигурация · 12 мин
Как открыть диалог выбора файла в 1С
Как открыть диалог выбора файла в 1С через ДиалогВыбораФайла: режимы, фильтры, асинхронные вызовы, проверка результата и типичные ошибки разработчика.
Диалог выбора файла в 1С открывается через объект встроенного языка ДиалогВыбораФайла. Он позволяет пользователю указать файл для загрузки, выбрать каталог для сохранения или задать имя нового файла. Объект доступен и в тонком, и в толстом, и в веб-клиенте, но способ вызова зависит от режима работы конфигурации и настроек совместимости.
Главная сложность для начинающего разработчика — асинхронная модель. В современных конфигурациях с отключенным режимом использования модальных вызовов метод Выбрать() недоступен, и вместо него применяется Показать() с описанием оповещения. Ниже разобраны оба подхода, режимы диалога, фильтры, проверка результата и типичные ошибки.
Материал ориентирован на платформу 1С:Предприятие 8.3. Примеры кода приведены для клиентской части управляемой формы, но большинство приёмов работает и в обычных формах.
Объект ДиалогВыбораФайла: создание и базовые свойства
Объект создаётся конструктором Новый ДиалогВыбораФайла(Режим), где параметр — одно из значений системного перечисления РежимДиалогаВыбораФайла. После создания диалог настраивается через свойства, и только затем открывается пользователю.
Ключевые свойства, которые используются чаще всего:
Фильтр— строка вида «Текстовые файлы (.txt)|.txt|Все файлы (.)|.», ограничивает отображаемые типы файлов;ИмяФайла— начальное имя файла или полный путь, с которого откроется диалог;Каталог— стартовый каталог диалога;Заголовок— текст в заголовке окна;МножественныйВыбор— разрешает выбрать несколько файлов (только для режима Открытие);ПроверятьСуществованиеФайла— требует, чтобы указанный файл существовал (актуально для режима Открытие).
Минимальный пример создания диалога для открытия файла:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для загрузки";
Диалог.Фильтр = "Файлы Excel (.xlsx)|.xlsx|Все файлы (.)|.";
Диалог.МножественныйВыбор = Ложь;
Режимы диалога: открытие, сохранение и выбор каталога
Режим определяет поведение диалога и тип результата. Выбирать его нужно исходя из задачи, а не из привычки: неверный режим приведёт к тому, что пользователь не сможет выполнить нужное действие или получит лишние предупреждения системы.
Режим Открытие
Используется, когда нужно получить путь к существующему файлу — например, для загрузки данных из Excel или выбора картинки. Поддерживает множественный выбор: в этом случае результатом будет массив имён файлов, а не одна строка.
Режим Сохранение
Применяется, когда пользователь должен указать, куда сохранить новый файл: выгрузку отчёта, печатную форму, файл обмена. Диалог сам предупредит, если файл с таким именем уже существует. Свойство Расширение задаёт расширение по умолчанию, которое подставится, если пользователь его не ввёл.
Режим ВыборКаталога
Нужен, когда требуется папка, а не конкретный файл: каталог выгрузки, папка с обменными файлами. В этом режиме фильтр и множественный выбор не имеют смысла, а результат — путь к каталогу.
Сравнение режимов
Путь к существующему файлу; поддерживает множественный выбор и фильтр
Путь для нового файла; есть защита от перезаписи и подстановка расширения
Путь к папке; фильтр и множественный выбор не работают
Синхронный вызов: метод Выбрать()
Метод Выбрать() открывает диалог модально и возвращает Истина, если пользователь подтвердил выбор, или Ложь при отмене. Выбранный путь после этого читается из свойств ИмяФайла (один файл или каталог) или ВыбранныеФайлы (массив при множественном выборе).
Если Диалог.Выбрать() Тогда
ПутьКФайлу = Диалог.ИмяФайла;
Сообщить("Выбран файл: " + ПутьКФайлу);
Иначе
Сообщить("Выбор отменён");
КонецЕсли;
Синхронный вариант проще для понимания, но работает только если в свойствах конфигурации включён режим использования модальности. В большинстве современных типовых конфигураций модальность отключена, и вызов Выбрать() приведёт к ошибке выполнения. Кроме того, в веб-клиенте синхронные вызовы файловой системы ограничены браузером.
Асинхронный вызов: метод Показать() с оповещением
Асинхронный вариант — рекомендуемый способ для управляемых форм. Диалог открывается методом Показать(ОписаниеОповещения), а результат приходит в указанную процедуру после закрытия окна. Код не блокируется, и это соответствует требованиям веб-клиента.
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Файлы данных (.xml)|.xml";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат; // пользователь нажал «Отмена»
КонецЕсли;
ПутьКФайлу = ВыбранныеФайлы[0];
// дальнейшая обработка файла
КонецПроцедуры
Обратите внимание: в обработчик оповещения всегда приходит массив выбранных файлов, даже если множественный выбор выключен. При отмене параметр равен Неопределено — это и есть признак, по которому нужно прерывать обработку. Процедура-обработчик обязательно объявляется с директивой Экспорт, иначе платформа не сможет её вызвать.
- 1Создайте объект ДиалогВыбораФайла с нужным режимом
- 2Задайте фильтр, заголовок и стартовый каталог
- 3Сформируйте ОписаниеОповещения с именем процедуры-обработчика
- 4Вызовите Диалог.Показать(Оповещение)
- 5В обработчике проверьте, что массив файлов не равен Неопределено
- 6Возьмите путь из первого элемента массива и продолжите обработку
Фильтры и начальные настройки диалога
Фильтр задаётся строкой с парами «описание|маска», разделёнными символом вертикальной черты. Несколько масок в одном пункте перечисляются через точку с запятой: "Изображения (.jpg;.png)|.jpg;.png". Если фильтр не задан, диалог показывает все файлы.
Свойство Каталог удобно, когда файлы обычно лежат в предсказуемом месте — например, в папке выгрузки из банк-клиента. Если каталог не существует, диалог откроется в каталоге по умолчанию операционной системы, ошибки не будет. Свойство ПолноеИмяФайла объединяет каталог и имя файла в одну строку.
Для режима сохранения полезно сразу подставить осмысленное имя: Диалог.ИмяФайла = "Выгрузка_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".xml". Это снижает риск, что пользователь сохранит файл под случайным именем и потом не найдёт его.
Сохраняйте последний выбранный каталог в реквизите формы или в настройках пользователя и подставляйте его в свойство Каталог при следующем открытии диалога. Это заметно ускоряет повторные загрузки, когда файлы лежат в одной папке.
Проверка результата и работа с выбранным файлом
Сам диалог не гарантирует, что с файлом можно работать: пользователь мог выбрать файл, к которому нет доступа, или файл уже удалён между выбором и чтением. Поэтому после получения пути стоит выполнить минимальную проверку.
Для проверки существования используется объект Файл:
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если Не ФайлНаДиске.Существует() Тогда
Сообщить("Файл не найден: " + ПутьКФайлу);
Возврат;
КонецЕсли;
В веб-клиенте прямой доступ к файловой системе ограничен: для чтения файла потребуется расширение работы с файлами и асинхронные методы помещения файла во временное хранилище (НачатьПомещениеФайла). Пытаться читать файл напрямую через ТекстовыйДокумент на клиенте в веб-клиенте не получится — обработку придётся переносить на сервер через временное хранилище.
Как проверить результат
Массив с хотя бы одним элементом
Неопределено — пользователь отменил выбор
Новый Файл(Путь).Существует() возвращает Истина
Ложь — файл удалён или путь некорректен
Расширение соответствует ожидаемому формату
Пользователь выбрал файл другого типа через фильтр «Все файлы»
Типичные ошибки и ограничения
Первая группа ошибок связана с игнорированием отмены выбора. Если не проверить результат и сразу обратиться к ВыбранныеФайлы[0] или Диалог.ИмяФайла, при отмене пользователь получит либо пустой путь, либо ошибку обращения к Неопределено. Проверка результата — обязательная часть любого сценария.
Вторая группа — смешение синхронной и асинхронной моделей. Вызов Выбрать() в конфигурации с запрещённой модальностью падает с ошибкой, а попытка «обернуть» его в попытку-исключение не решает проблему в веб-клиенте. Нужно заранее определить, в каких клиентах будет работать код, и выбрать один подход.
Третья группа — неверные ожидания от фильтра. Фильтр не запрещает выбрать файл другого типа: пользователь всегда может переключиться на «Все файлы». Если формат критичен, проверяйте расширение или сигнатуру файла после выбора, а не полагайтесь на фильтр диалога.
Альтернативы стандартному диалогу
Не всегда нужен именно системный диалог. Если файл выбирается из фиксированного набора (например, из каталога обмена на сервере), удобнее показать пользователю список значений или таблицу файлов, полученную методом НайтиФайлы() на сервере. Это снимает проблемы с правами доступа и веб-клиентом.
Для загрузки в веб-клиенте часто используют НачатьПомещениеФайла с интерактивным режимом: платформа сама откроет окно выбора и сразу поместит файл во временное хранилище, минуя отдельную работу с путями. Это короче и безопаснее, чем связка «диалог + чтение».
В мобильном клиенте стандартный диалог выбора файла имеет ограничения, и для части сценариев применяются специальные средства платформы для работы с медиафайлами и документами устройства. Перед разработкой под мобильный клиент проверяйте поддержку конкретных методов в документации к используемой версии платформы.
Как выбрать подход
Часто задаваемые вопросы
Как открыть диалог выбора нескольких файлов сразу?
Установите режим Открытие и свойство МножественныйВыбор = Истина. В синхронном варианте результат читайте из массива Диалог.ВыбранныеФайлы, в асинхронном — переберите массив, пришедший в обработчик оповещения.
Почему метод Выбрать() выдаёт ошибку?
Чаще всего причина в том, что в свойствах конфигурации режим использования модальности установлен в «Не использовать». В этом случае все модальные вызовы запрещены, и нужно переходить на асинхронный метод Показать() с описанием оповещения.
Как задать несколько масок в одном пункте фильтра?
Перечислите маски через точку с запятой внутри одной пары «описание|маски», например: "Документы (.doc;.docx;.pdf)|.doc;.docx;.pdf". Отдельные пункты фильтра между собой разделяются вертикальной чертой.
Работает ли ДиалогВыбораФайла на сервере?
Нет. Диалог — интерактивный объект и доступен только в клиентском контексте. На сервере файловые операции выполняются по заранее известным путям через Файл, НайтиФайлы, ТекстовыйДокумент и аналогичные объекты.
Как получить только каталог без имени файла?
Используйте режим ВыборКаталога — результатом будет путь к папке. Если каталог нужно извлечь из пути к файлу, создайте объект Новый Файл(Путь) и прочитайте его свойство Путь.
Можно ли запретить пользователю выбирать файл другого типа?
Жёстко запретить нельзя: пункт «Все файлы» позволяет обойти фильтр. После выбора проверяйте расширение программно и при несовпадении сообщайте пользователю о неверном формате, прерывая обработку.
Что важно запомнить
Диалог выбора файла создаётся объектом ДиалогВыбораФайла с одним из трёх режимов. В современных конфигурациях используйте асинхронный Показать() с оповещением и всегда проверяйте результат на Неопределено. Фильтр лишь помогает пользователю, но не заменяет программную проверку выбранного файла.