При разработке интерфейсов в 1С:Предприятии одной из частых задач является предоставление пользователю возможности выбора файла. Для этого используется объект ДиалогВыбораФайла. Казалось бы, достаточно установить свойство Каталог, и система должна открыть окно именно в указанном месте. Однако на практике разработчики часто сталкиваются с ситуацией, когда диалог открывает «Мои документы», последнюю использованную папку или вовсе корень диска, игнорируя заданный путь. Рассмотрим подробнее, почему это происходит и как гарантированно направить пользователя в нужную директорию.
Сначала проанализируем стандартный подход, который часто вызывает вопросы. Программист пишет код, проверяет путь в отладчике, видит, что строка сформирована верно, но результат оказывается неверным. Рассмотрим этот фрагмент:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для импорта...";
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.МножественныйВыбор = Ложь;
// Устанавливаем путь к каталогу
Диалог.Каталог = ПутьККаталогу;
Если Диалог.Выбрать() Тогда
ВыбранныйФайл = Диалог.ПолноеИмяФайла;
КонецЕсли;
Если после выполнения этого кода открывается не тот путь, который указан в переменной ПутьККаталогу, значит, мы столкнулись с одной из особенностей платформы или операционной системы.
Проанализируем ситуацию: если путь, переданный в свойство Каталог, хотя бы на один символ отличается от реального пути в файловой системе (лишний пробел, пропущенная папка, отсутствие прав доступа), объект ДиалогВыбораФайла не выдаст ошибку. Вместо этого он обратится к механизмам Windows (или другой ОС). Система посмотрит в свой реестр «последних посещенных мест» (MRU) и откроет ту папку, в которой пользователь работал в прошлый раз в данном приложении.
Важный совет: всегда проверяйте существование каталога перед вызовом диалога. Это можно сделать с помощью объекта Файл:
ПроверкаКаталога = Новый Файл(ПутьККаталогу);
Если ПроверкаКаталога.Существует() И ПроверкаКаталога.ЭтоКаталог() Тогда
Диалог.Каталог = ПутьККаталогу;
Иначе
Сообщить("Внимание: указанный путь не найден, будет открыт каталог по умолчанию.");
КонецЕсли;
Выясним еще одну хитрость. Иногда установка свойства Каталог игнорируется платформой из-за внутренних кэшей диалога. В таких случаях опытным путем было найдено решение: передавать путь в свойство ПолноеИмяФайла. Это заставляет систему принудительно инициализировать проводник именно в этой локации.
Посмотрим на пример реализации этого метода:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
// Вместо или вместе с свойством Каталог используем ПолноеИмяФайла
Диалог.ПолноеИмяФайла = ПутьККаталогу;
Если Диалог.Выбрать() Тогда
// Обработка выбора
КонецЕсли;
Важный нюанс: при использовании этого метода в строке имени файла в самом диалоге может отобразиться путь к папке. Пользователю придется его стереть или просто выбрать нужный файл, что может быть не всегда удобно, но зато гарантирует открытие правильного места.
Рассмотрим ситуацию, когда конфигурация запускается в браузере. Здесь свойство Каталог игнорируется полностью. Это не баг 1С, а политика безопасности современных браузеров (Chrome, Safari, Firefox). Браузер «песочит» исполняемый код и не дает веб-приложению доступа к файловой системе пользователя для предустановки путей. В веб-клиенте пользователь всегда начинает выбор с того места, которое определено настройками самого браузера.
Проанализируем влияние версии платформы. В старых версиях (8.2 и ранние 8.3 в режиме совместимости) работа с диалогами была синхронной. В современных управляемых формах (начиная с 8.3.15) рекомендуется использовать асинхронный метод Показать() вместо Выбрать().
Сравним подходы. Асинхронный метод работает стабильнее в тонком клиенте:
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Каталог = "C:\Work\Data\";
Диалог.Показать(ОписаниеОповещения);
// В этой же форме должна быть процедура:
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
// Обработка массива путей
КонецЕсли;
КонецПроцедуры
Выясним причины, по которым путь может считаться некорректным:
\ в конце строки пути приводит к тому, что последняя папка воспринимается как имя файла. Рекомендуется всегда добавлять \ в конце.ЗапуститьПриложение) требуются дополнительные кавычки. Для объекта ДиалогВыбораФайла лишние кавычки (через Символ(34)) наоборот могут все испортить, так как объект ожидает чистую строку пути.\\Server\Folder могут не открыться, если у пользователя нет прав на чтение корня сетевого ресурса или не пройдена авторизация.Если ваш ДиалогВыбораФайла упорно открывает не ту папку, выполните следующие действия по шагам:
Файл.Существует() непосредственно перед вызовом диалога. Скорее всего, в строке есть опечатка (например, лишняя папка «База» или «Документы»).Диалог.ПолноеИмяФайла = ПутьККаталогу + "\".Показать().Соблюдение этих правил позволит сделать работу пользователя с файлами в 1С предсказуемой и удобной.