[РЕШЕНО] (НЕ РЕШЕНО) КАК УСКОРИТЬ ЗАГРУЗКУ EXCEL

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем SvetaS_Love, 15 фев 2017.

  1. TopicStarter Overlay
    SvetaS_Love
    Offline

    SvetaS_Love Опытный в 1С

    Регистрация:
    26 фев 2016
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    ЕСТЬ процедура
    Код:
    Перем КолонкаТП;
      Запрос = Новый Запрос;
       ТЗ1.Очистить();
       ТЗ1.Колонки.Добавить("Ном_строки",,,10);
    
       ТЗ1.Колонки.Добавить("Наименование",,,60);
       ТЗ1.Колонки.Добавить("Категория",,,40);
    
       ТЗ1.Колонки.Добавить("Ед",,,3);
       ТЗ1.Колонки.Добавить("Кол",,,6);
       ТЗ1.Колонки.Добавить("Цена",,,6);
       ТЗ1.Колонки.Добавить("Сумма",,,18);
      
       ТЗ_Н.Очистить();
       
      
       Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
       ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
    // вывод списка файлов из указанной папки
       ДиалогОткрытия.Каталог = "";
       ДиалогОткрытия.МножественныйВыбор = Ложь;
       ДиалогОткрытия.Заголовок = "Выберите каталог";
      Если ДиалогОткрытия.Выбрать() Тогда
        ПутьККаталогу = ДиалогОткрытия.Каталог;
      КонецЕсли;   //
    
      Массив = НайтиФайлыВИерархии(ПутьККаталогу, "*.xls");
    
      Для Каждого ЭлементМассива из Массив Цикл
          
          СтрокаПодключения="Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ ЭлементМассива.ПолноеИмя +";Extended Properties=Excel 12.0;";
          Connection=Новый ComObject("ADODB.Connection");
          Попытка
             Connection.Open(СтрокаПодключения);
          Исключение
             Сообщить("Ошибка подключения к EXCEL ADODB.Connection");
             Возврат;
          КонецПопытки;
         
         
          Попытка
             Эксель = новый COMОбъект("Excel.Application");
          Исключение
             Сообщить("Ошибка подключения к EXCEL Excel.Application");
             Возврат;
          КонецПопытки;    
             сообщить("УСПЕШНО EXCEL");   
    
        // формирование шапки документа
             Книга = Эксель.WorkBooks.Open(ЭлементМассива.ПолноеИмя);
             Лист = Книга.WorkSheets(1);
                    
             Объект= СтрЗаменить(СокрЛП(Лист.Cells(1,1).Value), "Объект: ", "");
             Организация= СтрЗаменить(СокрЛП(Лист.Cells(2,1).Value), "Организация: ", "");
             Суммадоговора= Число(СокрЛП(Лист.Cells(2,6).Value));
             ПутьЗагрузки=ЭлементМассива.ПолноеИмя;
             ФайлЗагрузки=ЭлементМассива.Имя;
            
             Сообщить(Объект);
             Сообщить(Организация);
             Сообщить(Суммадоговора);
            
             НоваяСтрокаТЗ_Н= ТЗ_Н.Добавить();
             НоваяСтрокаТЗ_Н.Объекты_ПФ=Объект;
    
             // формирование табличной части документа
              // после подключения загружаем содержимое файла
          ТекстЗапроса =
          "SELECT
          | Наименование AS Наименование,
          | Ед AS Ед,
          | Кол AS  Кол,
          | Цена AS Цена,
          | Сумма  AS Сумма
          |FROM
          |[A4:F]
          |";
         
          Выборка = Новый COMОбъект("ADODB.Recordset");
    
          Попытка
             Выборка.Open(ТекстЗапроса, Connection,,,);
          Исключение
             Сообщить ("Проблемы с выполнением запроса");
             Возврат;
          КонецПопытки;
    
         Таблица = Новый ТаблицаЗначений;
        
         Таблица.Колонки.Добавить("Ном_строки",Новый ОписаниеТипов("Число"));
         Таблица.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка"));
            Таблица.Колонки.Добавить("Категория",Новый ОписаниеТипов("Строка"));
         Таблица.Колонки.Добавить("Ед",Новый ОписаниеТипов("Строка"));
         Таблица.Колонки.Добавить("Кол",Новый ОписаниеТипов("Число"));
         Таблица.Колонки.Добавить("Цена",Новый ОписаниеТипов("Число"));
         Таблица.Колонки.Добавить("Сумма",Новый ОписаниеТипов("Число"));
    
         i=4;
         Категория="";
        
            
         Пока НЕ Выборка.EOF() Цикл  // содержание документа
        
          // формирование табличной части документа
       
            номен = Справочники.Статьи_загрузки_плана;
            Если (СокрЛП(Выборка.Fields.Item("Наименование").Value)<>"") тогда
              элементСсылка = номен.НайтиПоНаименованию(СокрЛП(Выборка.Fields.Item("Наименование").Value));
                если НЕ элементСсылка.Пустая() тогда
                       Категория=элементСсылка;
                конецЕсли;
            конецесли;
            i=i+1;    // номер строки
    
            НоваяСтрока = Таблица.Добавить();
            НоваяСтрока.Ном_строки=i ;
            НоваяСтрока.Наименование = СокрЛП(Выборка.Fields.Item("Наименование").Value);
            НоваяСтрока.Ед= СокрЛП(Выборка.Fields.Item("Ед").Value);
            НоваяСтрока.Кол= СокрЛП(Выборка.Fields.Item("Кол").Value);
            НоваяСтрока.Цена=СокрЛП(Выборка.Fields.Item("Цена").Value);
            НоваяСтрока.Сумма=СокрЛП(Выборка.Fields.Item("Сумма").Value);
           
           
            Если (СокрЛП(Выборка.Fields.Item("Наименование").Value)<>"") тогда
             НоваяСтрока.Категория=Категория;
            конецесли;   
           
            // в зависимости от категории добавляем в документ
            Сообщить (НоваяСтрока.Наименование);
            
            НоваяСтрокаТЗ= ТЗ1.Добавить();
           
            НоваяСтрокаТЗ.Наименование=НоваяСтрока.Наименование;
            НоваяСтрокаТЗ.Ном_строки=НоваяСтрока.Ном_строки;
            НоваяСтрокаТЗ.Категория=НоваяСтрока.Категория;
            НоваяСтрокаТЗ.Ед=НоваяСтрока.Ед;
            НоваяСтрокаТЗ.Кол=НоваяСтрока.Кол;
            НоваяСтрокаТЗ.Цена=НоваяСтрока.Цена;
            НоваяСтрокаТЗ.Сумма=НоваяСтрока.Сумма;
           
           
           
            Выборка.MoveNext();
         
         КонецЦикла;
         Выборка.Close();   
         Эксель.Application.Quit();
    
    
    КонецЦикла; 
     
    
      ЭлементыФормы.ТЗ1.СоздатьКолонки();
    
    всё работает, но медленно
    в процедуре использую 2-ва метода загрузки из Excel
    1-метод отрабатывает быстро
    Код:
     ТекстЗапроса =
          "SELECT
          | Наименование AS Наименование,
          | Ед AS Ед,
          | Кол AS  Кол,
          | Цена AS Цена,
          | Сумма  AS Сумма
          |FROM
          |[A4:F]
          |";
         
          Выборка = Новый COMОбъект("ADODB.Recordset");
    
          Попытка
             Выборка.Open(ТекстЗапроса, Connection,,,);
          Исключение
             Сообщить ("Проблемы с выполнением запроса");
             Возврат;
          КонецПопытки;
    
    2-метод - используется для загрузки данных всего из 3-ёх ячеек файла, так как там нет заголовков -отрабатывает невозможно долго.
    Код:
    Попытка
             Эксель = новый COMОбъект("Excel.Application");
          Исключение
             Сообщить("Ошибка подключения к EXCEL Excel.Application");
             Возврат;
          КонецПопытки;    
             сообщить("УСПЕШНО EXCEL");   
    
        // формирование шапки документа
             Книга = Эксель.WorkBooks.Open(ЭлементМассива.ПолноеИмя);
             Лист = Книга.WorkSheets(1);
                    
             Объект= СтрЗаменить(СокрЛП(Лист.Cells(1,1).Value), "Объект: ", "");
             Организация= СтрЗаменить(СокрЛП(Лист.Cells(2,1).Value), "Организация: ", "");
             Суммадоговора= Число(СокрЛП(Лист.Cells(2,6).Value));
             ПутьЗагрузки=ЭлементМассива.ПолноеИмя;
             ФайлЗагрузки=ЭлементМассива.Имя;
    
    КАК УСКОРИТЬ ЗАГРУЗКУ?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204
    Использовать

    Лист.Range(1,100,1,100).Value

    вместо

    Лист.Cells(1,1).Value

    Пример кода не дам ибо есть нюансы, с которыми очень рекомендуется разобраться самому дабы было ясное понимание.
  3. TopicStarter Overlay
    SvetaS_Love
    Offline

    SvetaS_Love Опытный в 1С

    Регистрация:
    26 фев 2016
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    НЕТ, ИСПОЛЬЗОВАНИЕ
    Код:
    Лист.Range(1,100,1,100).Value
    НИЧЕГО НЕ МЕНЯЕТ
    ТОРМОЗИТ ИМЕННО КОД
    Код:
    Попытка
             Эксель = новый COMОбъект("Excel.Application");
          Исключение
             Сообщить("Ошибка подключения к EXCEL Excel.Application");
             Возврат;
          КонецПопытки;   
             сообщить("УСПЕШНО EXCEL");  
    
        // формирование шапки документа
             Книга = Эксель.WorkBooks.Open(ЭлементМассива.ПолноеИмя);
             Лист = Книга.WorkSheets(1);
                    
    ТУТ ЕЩЕ НЕ ДОШЛО НЕ ДО Лист.
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204
    Печать капсом не дает преимуществ печатающему и никак не усиливает телепатические способности читающих.

    На чем именно тормозит?
  5. TopicStarter Overlay
    SvetaS_Love
    Offline

    SvetaS_Love Опытный в 1С

    Регистрация:
    26 фев 2016
    Сообщения:
    58
    Симпатии:
    0
    Баллы:
    26
    именно тормозит на:
    Код:
    Попытка
             Эксель = новый COMОбъект("Excel.Application");
          Исключение
             Сообщить("Ошибка подключения к EXCEL Excel.Application");
             Возврат;
          КонецПопытки;  
             сообщить("УСПЕШНО EXCEL"); 
    
        // формирование шапки документа
             Книга = Эксель.WorkBooks.Open(ЭлементМассива.ПолноеИмя);
             Лист = Книга.WorkSheets(1);
                    
    ----
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204
    Балин, тут как минимум 5 действий, какое именно?