При интерактивной работе с файловой системой в управляемых и обычных формах 1С разработчики нередко сталкиваются с ошибками: вместо строкового пути реквизит заполняется словом «Массив», диалоговое окно не открывается по кнопке поля ввода или система зависает на десятки секунд при подтверждении выбора. Разберем по шагам причины такого поведения платформы и рассмотрим надежные варианты реализации выбора файлов.
Проанализируем классическую ошибку: когда после закрытия диалога в реквизит формы записывается значение ВыбранныеФайлы, поле отображает системный тип Массив. Это происходит потому, что свойство ВыбранныеФайлы возвращает массив строк (даже если выбран только один элемент), а реквизит объекта обычно имеет строковый тип.
Если в настройках диалога не используется множественный выбор (МножественныйВыбор = Ложь), необходимо обращаться напрямую к свойству ПолноеИмяФайла, которое возвращает строковое значение пути к выбранному файлу.
Посмотрим на пример правильной обработки для управляемой формы:
&НаКлиенте
Процедура ПутьКФайлуОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогОткрытияФайла.Фильтр = "Файлы XML (*.xml)|*.xml|Все файлы (*.*)|*.*";
ДиалогОткрытияФайла.Заголовок = "Выберите файл для загрузки";
ДиалогОткрытияФайла.ПредварительныйПросмотр = Ложь;
Если ДиалогОткрытияФайла.Выбрать() Тогда
Объект.ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
Рассмотрим распространенные проблемы привязки обработчиков в интерфейсе:
КнопкаОткрытия = Истина), обработчик диалога следует назначать на событие Открытие. Если же используется кнопка выбора (три точки), обработчик привязывается к событию НачалоВыбора. В обоих случаях обязательно устанавливаем СтандартнаяОбработка = Ложь;, чтобы отключить платформенное поведение по умолчанию.ДиалогВыбораФайла является исключительно клиентским объектом. Процедура, в которой он создается, обязательно должна иметь директиву &НаКлиенте. Попытка вызова диалога на стороне сервера приведет к ошибке компиляции или выполнения.Выясним, почему вызов диалога выбора файла может вызывать паузы длительностью в 20–30 секунд:
ДиалогВыбора.ПредварительныйПросмотр = Истина при выборе изображений или тяжелых документов заставляет проводник операционной системы считывать метаданные и генерировать эскизы всех файлов в папке. Для ускорения работы следует явно отключать предпросмотр: ПредварительныйПросмотр = Ложь;.Каталог или ПолноеИмяФайла, диалог обращается к последнему сохраненному каталогу Windows. Если этот путь ведет на отключенный сетевой диск или медленный сетевой ресурс, система зависает до истечения системного тайм-аута. Рекомендуется явно указывать начальный локальный каталог (например, через КаталогДокументов() или КаталогВременныхФайлов()).ПроверятьСуществованиеФайла = Истина инициирует дополнительные обращения к диску или сети. При работе в медленных локальных сетях отключение этого свойства повышает отзывчивость интерфейса.В конфигурациях с установленным запретом модальности (свойство конфигурации РежимИспользованияМодальности = НеИспользовать) синхронный метод Выбрать() применять нельзя. Разберем два асинхронных подхода.
Вариант через ОписаниеОповещения (для платформ от 8.3.3):
Обратите внимание: процедура обратного вызова обязана быть объявлена с ключевым словом Экспорт и директивой &НаКлиенте, иначе платформа выдаст ошибку «Не найден экспортируемый метод».
&НаКлиенте
Процедура ВыбратьФайлНаКлиенте(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Файлы данных (*.dbf)|*.dbf";
Диалог.МножественныйВыбор = Ложь;
Диалог.ПредварительныйПросмотр = Ложь;
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
Объект.ПутьКФайлу = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
Вариант через асинхронные процедуры и оператор Ждать (начиная с 8.3.18):
Современный синтаксис позволяет писать компактный линейный код без создания отдельных процедур оповещения:
&НаКлиенте
Асинх Процедура ВыбратьФайлАсинхронно(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Изображения (*.jpg)|*.jpg";
Диалог.ПредварительныйПросмотр = Ложь;
ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх();
Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
Объект.ПутьКФайлу = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
Использование явной установки директив &НаКлиенте, отключение предварительного просмотра и переход на асинхронные методы полностью исключают зависания интерфейса и гарантируют стабильную работу с файлами на любых рабочих станциях.