Приветствую Вас ГостьПятница, 26.04.2024, 05:25

Каталог статей


Открыть файл на клиенте и обработать на сервере в немодальном режиме

Задача делится на 2 подзадачи:

1) сначала открываем диалог выбора файла немодально и присваиваем реквизиту формы ФайлДанных значение выбранного файла. Для строкового реквизита ФайлДанных устанавливаем свойство "Кнопка выбора" = Да, и пишем обработчик события "Начало выбора".

2) передаем файл на сервер после чего обрабатываем его. (можно почитать здесь: https://its.1c.ru/db/v8std#content:542:hdoc)

Для передачи используем процедуру НачатьПомещениеФайла(ОписаниеОповещения,   ,  ФайлДанных,  Ложь, УникальныйИдентификатор);. 

Здесь УникальныйИдентификатор - это УИД формы (можно было написать ЭтаФорма.УникальныйИдентификатор)

На входе процедуры в описании оповещения вторым параметром идет Адрес. Его можно задать принудительно при вызове процедуры НачатьПомещениеФайла. Если он не задан, то создается новый файл и в адрес будет занесен путь файла во временном хранилище. У этой процедуры есть параметр "Интерактивно" (в примере ниже он равен Ложь). Если он равен Истина, то можно не писать обработку выбора файла. Система сама вызовет такой диалог и передаст файл во временное хранилище.

С платформы 8.3.15 рекомендуется использовать метод НачатьПомещениеФайлаНаСервер(). Пример использования данного метода можно посмотреть здесь.

1С сильно рекомендует использовать ПолучитьИмяВременногоФайла() для создания временных файлов. При этом имя формируется в временный каталог пользователя. сли имя временного файла и каталог задать жестко, то есть вероятность того, то при запуске обработки другим пользователем выйдет ошибка совместного доступа к файлу.

Пример кода:


#Область ВыборФайла    

&НаКлиенте
Процедура ФайлДанныхНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Фильтр = "*.csv|**.csv";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файл";
    
    Оповещение = Новый ОписаниеОповещения("ОбработкаОткрытияФайла", ЭтотОбъект, Новый Структура("Диалог", ДиалогОткрытияФайла));
    ДиалогОткрытияФайла.Показать(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОткрытияФайла(МассивФайлов, ДопПараметр) экспорт
    Если МассивФайлов.Количество() > 0 Тогда        
        ЗаписатьИмяФайла(МассивФайлов[0]);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаписатьИмяФайла(ИмяФайла)
    ФайлДанных = ИмяФайла;
Конецпроцедуры

#КонецОбласти

///////////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ЗагрузкаФайла
    
&НаКлиенте
Процедура ЗагрузитьДанныеФайла(Команда)
    Если ПустаяСтрока(ФайлДанных) Тогда
        Сообщить("Не заполнено имя файла данных");
        Возврат;
    КонецЕсли;
    
    Файл = Новый Файл(ФайлДанных);
    Если Не Файл.Существует() Тогда
        Сообщить("Файл не найден! Выберите файл заново.");
        Возврат;
    КонецЕсли;
    Файл =Неопределено;
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьФайлЗавершение", ЭтотОбъект);
    
    НачатьПомещениеФайла(ОписаниеОповещения,
    ,
    ФайлДанных,  
    Ложь,
    УникальныйИдентификатор);  
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт 
    Результат = ПроизвестиОбработкуНаСервере(Адрес);
    Если Не ПустаяСтрока(Результат) Тогда
        Сообщить("Ошибка выполнения обработки файла: " +Результат);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПроизвестиОбработкуНаСервере(Адрес) 
    Результат = "";
    ПОпытка
        Данные = ПолучитьИзВременногоХранилища(Адрес);
        ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("csv");
        Данные.Записать(ИмяПромежуточногоФайла);
        ДанныеФайла = Новый ЧтениеТекста(ИмяПромежуточногоФайла);
        СТрокаФайла = ДанныеФайла.ПрочитатьСтроку();
        Пока СтрокаФайла <> Неопределено Цикл
            //обработка строк
            СтрокаФайла = ДанныеФайла.ПрочитатьСтроку();
        КонецЦикла;
    Исключение
        Результат = ОписаниеОшибки();
    КонецПопытки;
    
    Возврат Результат;
    
КонецФункции

#КонецОбласти

 

Категория: Формы | Добавил: leshic (26.06.2019)
Просмотров: 1192 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [40]
Администрирование [34]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [28]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0