понедельник, 23 мая 2016 г.

Универсальная загрузка из Excel в 1С 8.3 (УФ)

Обработка-шаблон по загрузке файла Excel в табличную часть.
Выполнена на управляемых формах. Должна работать на большинстве новых типовых конфигураций.

Первая строка из файла преобразуется в шапку, остальные строки в данные табличной части

Например, есть файл excel следующего вида:

 

В режиме 1С:Предприятия открываем обработку (Файл-Открыть)
Выбираем путь к файлу. И нажимаем "Загрузить".

Получаем табличную часть:


Вот и все на этом.

Дальше можно, по усмотрению разработчика, обрабатывать полученные данные нужным образом.




Ниже код данной обработки, с комментариями:  
&НаКлиенте
Процедура Прочитать(Команда)
  
 //очищаем таблицу и удаляем колонки 
 Таблица.Очистить();
 УдалитьКолонкиНаСервере(); 
 
 //подключаемся к Excel
 Попытка
  Excel = Новый COMОбъект("Excel.Application");
  Excel.WorkBooks.Open(Объект.ИмяФайла);
  Состояние("Обработка файла Microsoft Excel...");
 Исключение
  Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
  Сообщить(ОписаниеОшибки());
  Возврат;
 КонецПопытки;
  
 Попытка 
     //Открываем необходимый лист
     Excel.Sheets(1).Select();  // лист 1, по умолчанию  
 Исключение
  //Закрываем Excel
     Excel.ActiveWorkbook.Close();  
  Excel = 0;
  Сообщить("Файл "+Строка(Объект.ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
  //ОтменитьТранзакцию();
  Возврат;
 КонецПопытки; 
 

    //Получим количество строк и колонок.
    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
    Если Версия = "8" тогда
        ФайлСтрок   = Excel.Cells.CurrentRegion.Rows.Count;
        ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
 Иначе
  ФайлСтрок   = Excel.Cells(1,1).SpecialCells(11).Row;
  ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;   
 Конецесли;
 
 
 //считываем первую строку и генерируем колонки 
 Сч = 1;
 Массив = Новый Массив;
 Пока ЗначениеЗаполнено(Excel.Cells(1, Сч).Text) Цикл
  ИмяКолонки = Excel.Cells(1, Сч).Text;
  ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); // убираем из имени колонок пробелы
  //Таблица.Добавить(ИмяБезПробелов,,ИмяКолонки);  
  
  Массив.Добавить(ИмяБезПробелов);
  
  Сч = Сч + 1;
 КонецЦикла;
 КолКолонок = ДобавитьИмяКолонкиНаСервере(Массив);
 
 Для НС = 2 по ФайлСтрок Цикл  // НС указываем с какой строки начинать обработку        
  
  Состояние("Файл "+Строка(Объект.ИмяФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %");
  
  ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break
  
  НоваяСтрока = Таблица.Добавить();  
   
  Для НомерКолонки = 1 по КолКолонок Цикл 
   //заполняем строку значениями
   ТекущееЗначение = Строка(Excel.Cells(НС, НомерКолонки).Value);
   Если Excel.Cells(1, НомерКолонки).Value = "Code" Тогда
    строкаМТР = ТекущееЗначение;
    Пока СтрДлина(строкаМТР)<10 Цикл
     строкаМТР = ""+"0"+строкаМТР; 
    КонецЦикла;
    ТекущееЗначение = строкаМТР;
   КонецЕсли;
   
   ИмяКолонки = ВернутьИмяКолонки(НомерКолонки-1);    
   НоваяСтрока[ИмяКолонки] = ТекущееЗначение;    
  КонецЦикла;
  
 КонецЦикла;   
 
 //Отключаемся от Excel 
 Попытка
  Excel.DisplayAlerts = 0;
  Excel.ActiveWorkbook.Close();
  Excel.DisplayAlerts = 1;
  Excel.Quit(); 
  Excel = Неопределено;        
 Исключение
  Сообщить("Не удалось отключиться от Excel - "+ОписаниеОшибки());
  Возврат;
 КонецПопытки;
 
КонецПроцедуры

&НаСервере
Процедура УдалитьКолонкиНаСервере()
 ЭлементФормы = Элементы.Найти("Таблица");
 
 Если ЭлементФормы <> Неопределено Тогда
  
  МассивУдаляемыхРеквизитов = Новый Массив;
  РеквизитыТЗ = ПолучитьРеквизиты("Таблица");
  
  Для Каждого Реквизит Из РеквизитыТЗ Цикл
   МассивУдаляемыхРеквизитов.Добавить("Таблица." + Реквизит.Имя);
  КонецЦикла;
  ЭтаФорма.ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);        
 КонецЕсли; 
КонецПроцедуры


&НаСервере
Функция ВернутьИмяКолонки(сч)
 ТЗ = РеквизитФормыВЗначение("Таблица");
 Возврат ТЗ.Колонки[сч].Имя;  
КонецФункции

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


&НаСервере
Функция ДобавитьИмяКолонкиНаСервере(Массив)
 
 МассивДобавляемыхРеквизитов = Новый Массив; 
 
 Для каждого стр из Массив Цикл
  МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(стр, Новый ОписаниеТипов("Строка"),"Таблица" ,стр)); 
 КонецЦикла;
 
 ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); 
 
 Для каждого стр из Массив Цикл
  ИмяЭлемента = "Таблица" + стр;
  ЭлементФормыРодитель = Элементы.Таблица;
  Если ЭлементФормыРодитель.ПодчиненныеЭлементы.Найти(ИмяЭлемента)<>Неопределено Тогда
   Продолжить;
  КонецЕсли;
  
  НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ЭлементФормыРодитель);
  НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
  Путь_ = "Таблица" + "." + стр;
  НовыйЭлемент.ПутьКДанным = Путь_;
 КонецЦикла;

 Возврат РеквизитФормыВЗначение("Таблица").Колонки.Количество();
 
КонецФункции

Комментариев нет:

Отправить комментарий