Рассмотрим как асинхронно (а в управляемых формах необходимо только так) программно обработать выбор пользователем пути к файлу.
Постановка задачи
Предположим, что на форме создан реквизит ПутьКФайлу. Этот реквизит имеет тип Строка и выведен на форму. Пользователь должен указывать в этом поле путь к файлу Excel.
Решение
Для удобства свойство КнопкаВыбора элемента формы установим в значение Да и будем обрабатывать событие НачалоВыбора этого элемента.
В процедуре начала выбора элемента ПутьКФайлу необходимо написать код:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)// Отказываемся от стандартной обработки процедуры
СтандартнаяОбработка = Ложь;// Создаем диалог выбора файла и указываем для чего он будет использоваться
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
// Задаем фильтр доступных расширений файлов для выбора
Диалог.Фильтр = НСтр(«ru=’Книга Excel 97 (*.xls)|*.xls|Книга Excel 2007 (*.xlsx)|*.xlsx’»);
// Задаем текст заголовка окна выбора
Диалог.Заголовок = НСтр(«ru=’Выберите файл Excel’»);
// Создаем объект ОписаниеОповещения, который будет передан в метод Показать
ОповещениеЗавершения = Новый ОписаниеОповещения(«ВыборФайлаЗавершение», ЭтотОбъект);
// Открываем окно выбора файла
Диалог.Показать(ОповещениеЗавершения);КонецПроцедуры
Метод
Диалог.Показать(ОповещениеЗавершения);
содержит описание процедуры, которая будет вызвана после закрытия диалога выбора. В этой процедуре должно быть два параметра:
- ВыбранныеФайлы — массив выбранных имен файлов. Если пользователь отказался от выбора файла, то в параметре будет содержаться Неопределено;
- ДополнительныеПараметры — произвольное значение, которое указано при создании объекта ОписаниеОповещения в третьем параметре (в нашем примере не задано).
Пример процедуры, которая будет вызвана после закрытия окна выбора файла:
&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) ЭкспортЕсли ВыбранныеФайлы <> Неопределено Тогда
ПутьКФайлу = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
Внимание!
Процедура, указанная в объекте ОписаниеОповещения должна иметь ключевое слово Экспорт.
Приведенный пример можно немного усовершенствовать: передать в третий параметр конструктора ОписаниеОповещения переменную Диалог.
ОповещениеЗавершения = Новый ОписаниеОповещения(«ВыборФайлаЗавершение», ЭтотОбъект, Диалог);
Тогда в процедуре ВыборФайлаЗавершение будет доступно немного больше информации: из параметра ДополнительныеПараметры можно будет узнать каталог, в котором хранится выбранный файл, и фильтр, которому соответствует файл.
В конструкторе объекта ДиалогВыбораФайла в параметре указывается для чего будет открыт диалог. Возможные значения системного перечисления РежимДиалогаВыбораФайла:
- Открытие;
- ВыборКаталога;
- Сохранение.
Приведу еще несколько свойств объекта ДиалогВыбораФайла:
- Каталог — текущий каталог;
- ПолноеИмяФайла — начальное полное имя файла. После выбора файла содержит полное имя выбранного файла (кроме множественного выбора и выбора каталога);
- МножественныйВыбор — флаг возможности выбора нескольких файлов;
- ПредварительныйПросмотр — флаг необходимости показа окна предварительного просмотра файлов;
- ПроверятьСуществованиеФайла — флаг необходимости проверки существования выбираемого файла.
Решение средствами БСП
В конфигурациях со втроенной Библиотекой стандартных подсистем можно использовать процедуру
ОбработчикВыбораФайла(Объект, Знач ИмяСвойства, СтандартнаяОбработка = Ложь, Знач ПараметрыДиалога = Неопределено, ОповещениеЗавершения = Неопределено) Экспорт
общего модуля ОбменДаннымиКлиент. При помощи этого метода приведенную выше задачу можно решить так:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)НастройкиДиалога = Новый Структура;
НастройкиДиалога.Вставить(«Заголовок», НСтр(«ru=’Выберите файл Excel’»));
НастройкиДиалога.Вставить(«Фильтр», НСтр(«ru=’Книга Excel (*.xlsb)|*.xlsb|Книга Excel 2007 (*.xlsx)|*.xlsx|Книга Excel 97 (*.xls)|*.xls’»));ОбменДаннымиКлиент.ОбработчикВыбораФайла(ЭтотОбъект, «ПутьКФайлу», СтандартнаяОбработка, НастройкиДиалога);
КонецПроцедуры