HelpF.pro

Импорт документа Excel через web-клиент

Во время реализации задачи по регистрации продаж дистрибьюторов на основании Excel документов столкнулся с интересной задачей. Необходимо реализовать загрузку файла и на стороне сервера обработать его, заполнив табличную часть документа.

Решение состоит из двух функций: клиентской и серверной.

Клиентская часть инициирует выбор файла, передачу выбранного файла на сервер и передача управления серверной процедуре.
Код 1C v 8.2 УП
 #НаКлиенте
Процедура ИмпортИзВнешнегоФайла(Команда)
     //Выбор и загрузка файла.
     Если НЕ  ПодключитьРасширениеРаботыСФайлами() Тогда
          УстановитьРасширениеРаботыСФайлами();
     КонецЕсли;
 
     Если  ПодключитьРасширениеРаботыСФайлами() Тогда
          Режим =  РежимДиалогаВыбораФайла.Открытие;
          ДиалогОткрытияФайла = Новый  ДиалогВыбораФайла(Режим);
          ДиалогОткрытияФайла.ПолноеИмяФайла = "";
          ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
          Фильтр = "Текст(*.xls)|*.xls";
          ДиалогОткрытияФайла.Фильтр = Фильтр;
          ДиалогОткрытияФайла.Заголовок = "Выберите файл для импорта";
          Если  ДиалогОткрытияФайла.Выбрать() Тогда
               Объект.МедицинскиеРаботники.Очистить();
               ДанныеНачинаютсяС = 1;
              Если  Не ВвестиЧисло(ДанныеНачинаютсяС, "Данные начинаются со строки", 2,  0) Тогда
                    Возврат;
              КонецЕсли;
              МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
              ПомещаемыеФайлы = Новый Массив;
              Для  Каждого Файл Из МассивФайлов Цикл
                   ТекФайл = Новый Файл(Файл);
                   Описание = Новый ОписаниеПередаваемогоФайла(Файл, "");
                   ПомещаемыеФайлы.Добавить(Описание);
              КонецЦикла;
 
              ПомещенныеФайлы = Новый Массив;
 
              Если  ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, УникальныйИдентификатор) Тогда
                   //Запуск импорта
                   ИмпортироватьФайлИзВременногоХранилищаВТЗ(ПомещенныеФайлы, ДанныеНачинаютсяС);
              КонецЕсли;
         Иначе
              Предупреждение("Файл(ы) не  выбран!");
         КонецЕсли;
     Иначе
          Предупреждение(НСтр("ru ='Данная возможность недоступна, так как не подключено расширение работы с файлами.'", "ru"));
     КонецЕсли;
КонецПроцедуры //ИмпортИзВнешнегоФайла()   

Серверная процедура перебирает полученные на сервер файлы. Получает COM-объекты и импортирует данные.
Код 1C v 8.2 УП
 #НаСервере
Процедура ИмпортироватьФайлИзВременногоХранилищаВТЗ(МассивФайлов,  ДанныеНачинаютсяС)
    ДокументОбъект =  РеквизитФормыВЗначение("Объект");
 
    //Обход файлов, записанных  во временное хранилище
    Для Каждого  ЭлементМассива Из МассивФайлов Цикл
        ФайлИзХранилища =  ПолучитьИзВременногоХранилища(ЭлементМассива.Хранение);
        ВременныйФайл = ПолучитьИмяВременногоФайла("xls");
       //Сохранение во временнный файл на диске
       ФайлИзХранилища.Записать(ВременныйФайл);
 
       //Импорт
       Док =  ПолучитьCOMОбъект(ВременныйФайл);
       ФИОУчастника = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 2).Value;
       Пока СокрЛП(ФИОУчастника) ="" Цикл
           //  Добавление строки с файла в документ
          НоваяСтрока = ДокументОбъект.МедицинскиеРаботники.Добавить();
          НоваяСтрока.Фио = ФИОУчастника;
          НоваяСтрока.Учреждение = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 7).Value;
          НоваяСтрока.Адрес = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 3).Value;
          НоваяСтрока.Телефон = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 4).Value;
          НоваяСтрока.ЭлПочта = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 5).Value;
          НоваяСтрока.Образование = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 6).Value;
          ДанныеНачинаютсяС = ДанныеНачинаютсяС + 1;
          ФИОУчастника = Док.Sheets(1).Cells(ДанныеНачинаютсяС, 2).Value;
      КонецЦикла;
      Сообщить("Импорт завершён");
      Док.Application.Quit();
    КонецЦикла;
    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры  //ИмпортироватьФайлИзВременногоХранилищаВТЗ()   

Источник
Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1096.html