Загрузка из Excel в 1с

1. ong1990 4 14.01.16 17:24 Сейчас в теме
Здравствуйте друзья. Понадобилось сделать обработку загрузки из Excel так как типовая с ИТС не подходит для наших целей. Вот что у меня получилось:
&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    
    ДиалогВыбораФайла = ДополнительныеПараметры.ДиалогВыбораФайла;
    
    Если (ВыбранныеФайлы <> Неопределено) Тогда
        ЭтаФорма.ИмяФайла = ДиалогВыбораФайла.ПолноеИмяФайла;
    КонецЕсли;
    
КонецПроцедуры


&НаКлиенте
Процедура Загрузить(Команда)
    
    Массив=Новый Массив;
    
    Попытка
        COMОбъект = Новый COMОбъект("Excel.Application");
        Workbook   = COMОбъект.Workbooks.Open(ИмяФайла);
        ExcelЛист  = COMОбъект.Sheets(1);
        ActiveCell = COMОбъект.ActiveCell.SpecialCells(11);
        RowCount = ActiveCell.Row;
        ColumnCount = ActiveCell.Column;    
        
            
    
            Для Строка = 1 По RowCount Цикл   
                Для Колонка = 1 По ColumnCount Цикл
                     Стурктура=Новый Структура;

                    
                    //Значение=ExcelЛист;
                    Значение  = СокрЛП(ExcelЛист.Cells(Строка,1).Value);  //НаименованиеНашегоПрайса
                    Значение2 = СокрЛП(ExcelЛист.Cells(Строка,2).Value);  //НаименованиеПоПоставщику                    
                    КонецЦикла;  
                    Стурктура.Вставить("Номенклатура",Значение);
                    Стурктура.Вставить("ДополнительныйРеквизит",Значение2);
                    Массив.Добавить(Стурктура);
                КонецЦикла;
                ЗаполнитьТабличнуюЧастьТовары(Массив);
                WorkBook.Close();        
    Исключение
        COMОбъект.Quit();
        COMОбъект = 0;
        СообщениеОбОшибке = НСтр("ru = 'Не удалось прочитать данные из файла. Подробности: '")
        + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        ВызватьИсключение СообщениеОбОшибке;  
        
    КонецПопытки;    

КонецПроцедуры

&Насервере
Процедура ЗаполнитьТабличнуюЧастьТовары(Массив)
    
    Для Каждого  Эл из Массив цикл 
         Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Эл.Номенклатура),Истина);    
        НоваяСтрока=Объект.Товары.Добавить();
                   НоваяСтрока.Номенклатура=Номенклатура;
                   НоваяСтрока.ДополнительныйРеквизит=Эл.ДополнительныйРеквизит;
    КонецЦикла;
            
КонецПроцедуры

Показать

По итогу засек время загрузки в ТЧ. Вот результат: Строк 30600, столбцов 2, Время 3 мин 15 сек.

Может быть можно как-то ускорить процесс или это нормально?
user734952; +1 Ответить
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. mymyka 14.01.16 17:34 Сейчас в теме
(1)
Значение  = СокрЛП(ExcelЛист.Cells(Строка,1).Value);  //НаименованиеНашегоПрайса
                    Значение2 = СокрЛП(ExcelЛист.Cells(Строка,2).Value);  //НаименованиеПоПоставщику 

Cells исключительно тугая штука.
http://infostart.ru/public/163640/
9. Boneman 302 14.01.16 17:47 Сейчас в теме
(1) ong1990,
вообще платформа 8.3.6 научилась эксель читать в табличный документ, без ком объектов,
Думаю использовав этот механизм, и обходя уже ячейки табдока,
должно быстрее все работать, только придется немного поработать с ячейками табдока
2. alljoke 14.01.16 17:26 Сейчас в теме
а почему бы сразу не загружать на сервере?
3. ong1990 4 14.01.16 17:29 Сейчас в теме
(2) alljoke, Это как? и что это даст?
4. alljoke 14.01.16 17:31 Сейчас в теме
Клиент обычно слабый, а сервер мощный.
+ хотя надо смотреть как в типовых реализовано.
5. antz 14.01.16 17:33 Сейчас в теме
Через ADO быстрее. А через COMSafeArray еще быстрее.
7. ong1990 4 14.01.16 17:37 Сейчас в теме
(5) antz, А у Вас есть пример использования COMSafeArray?
8. antz 14.01.16 17:44 Сейчас в теме
(7) ong1990, примерно так:

Лист_ = Книга_.Sheets.Item(НомЛиста);
СтрокНаЛисте = Лист_.Cells.SpecialCells(11).Row;
ОбластьЗначений = Лист_.Range(Лист_.Cells(1, 1), Лист_.Cells(СтрокНаЛисте, 2));//получили два столбца
МассивЗначений = ОбластьЗначений.Value.Выгрузить();//получили многомерный массив со столбцами



МассивЗначений - это массив 1С, его уже крути как хочешь.
10. ong1990 4 14.01.16 17:56 Сейчас в теме
(8) antz, Честно говоря не совсем понятно как Ваш код к COMSafeArray относится?
11. antz 14.01.16 17:57 Сейчас в теме
Вроде как ОбластьЗначений.Value - это и есть COMSafeArray.
12. ong1990 4 14.01.16 17:59 Сейчас в теме
(11) antz, а саму COMSafeArray как-то надо подключать или что с ней делать?
13. antz 14.01.16 18:02 Сейчас в теме
COMSafeArray - это объект, который знает 1С. Заметьте, что Выгрузить() написано по-русски)
14. graforlow 4 17.01.16 23:04 Сейчас в теме
быстрее работает загрузка xls документов если использовать не MS office , а Open officе.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот