Задача делится на 2 подзадачи:
1) сначала открываем диалог выбора файла немодально и присваиваем реквизиту формы ФайлДанных значение выбранного файла. Для строкового реквизита ФайлДанных устанавливаем свойство "Кнопка выбора" = Да, и пишем обработчик события "Начало выбора".
2) передаем файл на сервер после чего обрабатываем его. (можно почитать здесь: https://its.1c.ru/db/v8std#content:542:hdoc)
Для передачи используем процедуру НачатьПомещениеФайла(ОписаниеОповещения, , ФайлДанных, Ложь, УникальныйИдентификатор);.
Здесь УникальныйИдентификатор - это УИД формы (можно было написать ЭтаФорма.УникальныйИдентификатор)
На входе процедуры в описании оповещения вторым параметром идет Адрес. Его можно задать принудительно при вызове процедуры НачатьПомещениеФайла. Если он не задан, то создается новый файл и в адрес будет занесен путь файла во временном хранилище. У этой процедуры есть параметр "Интерактивно" (в примере ниже он равен Ложь). Если он равен Истина, то можно не писать обработку выбора файла. Система сама вызовет такой диалог и передаст файл во временное хранилище.
С платформы 8.3.15 рекомендуется использовать метод НачатьПомещениеФайлаНаСервер(). Пример использования данного метода можно посмотреть здесь.
1С сильно рекомендует использовать ПолучитьИмяВременногоФайла() для создания временных файлов. При этом имя формируется в временный каталог пользователя. сли имя временного файла и каталог задать жестко, то есть вероятность того, то при запуске обработки другим пользователем выйдет ошибка совместного доступа к файлу.
Пример кода:
#Область ВыборФайла
&НаКлиенте
Процедура ФайлДанныхНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "*.csv|**.csv";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл";
Оповещение = Новый ОписаниеОповещения("ОбработкаОткрытияФайла", ЭтотОбъект, Новый Структура("Диалог", ДиалогОткрытияФайла));
ДиалогОткрытияФайла.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОткрытияФайла(МассивФайлов, ДопПараметр) экспорт
Если МассивФайлов.Количество() > 0 Тогда
ЗаписатьИмяФайла(МассивФайлов[0]);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаписатьИмяФайла(ИмяФайла)
ФайлДанных = ИмяФайла;
Конецпроцедуры
#КонецОбласти
///////////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ЗагрузкаФайла
&НаКлиенте
Процедура ЗагрузитьДанныеФайла(Команда)
Если ПустаяСтрока(ФайлДанных) Тогда
Сообщить("Не заполнено имя файла данных");
Возврат;
КонецЕсли;
Файл = Новый Файл(ФайлДанных);
Если Не Файл.Существует() Тогда
Сообщить("Файл не найден! Выберите файл заново.");
Возврат;
КонецЕсли;
Файл =Неопределено;
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьФайлЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения,
,
ФайлДанных,
Ложь,
УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Результат = ПроизвестиОбработкуНаСервере(Адрес);
Если Не ПустаяСтрока(Результат) Тогда
Сообщить("Ошибка выполнения обработки файла: " +Результат);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПроизвестиОбработкуНаСервере(Адрес)
Результат = "";
ПОпытка
Данные = ПолучитьИзВременногоХранилища(Адрес);
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("csv");
Данные.Записать(ИмяПромежуточногоФайла);
ДанныеФайла = Новый ЧтениеТекста(ИмяПромежуточногоФайла);
СТрокаФайла = ДанныеФайла.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
//обработка строк
СтрокаФайла = ДанныеФайла.ПрочитатьСтроку();
КонецЦикла;
Исключение
Результат = ОписаниеОшибки();
КонецПопытки;
Возврат Результат;
КонецФункции
#КонецОбласти
|