Имя: Пароль:
1C
1С v8
Вопрос про быстродействие
,
0 mataranga
 
08.04.14
09:32
Доброе.

Посоветоваться хотелось бы. Есть Excel файл с очень много строк (пусть будет 1 000 000 ). Надо перебрать каждый столбик и сравнить его с данным базы(тобишь действие на сервере). Excel есть только на клиенте. Есть три варианта дальнейших действий. ( на вскидку )

1. Каждый столбик передать в структуру и отправить на сервер.
2. Все столбики передать в массив структур и отправить на сервер.
3. Создать ТЗ на форме, наполнить данными из excel и уже через РеквизитФормыВЗначение и ЗначениеВРеквизитФОрмы продолжать. Или на прямую обращаться с сервере к представлению ТЗ.

Что будет быстрее?
1 andreymongol82
 
08.04.14
09:33
Внешние источники данных через ADODB подключить
2 Drac0
 
08.04.14
09:34
база Скульная?
3 Maxus43
 
08.04.14
09:34
>>Что будет быстрее?
перекинуть эксель на сервер во временное хранилище и там подключаться и бегать
4 wade25
 
08.04.14
09:35
Создать на сервере временную копию файла и там его обработать будет быстрее имхо.
5 mataranga
 
08.04.14
09:37
сервер файловый, но предпологается что может быть и SQL где нет excel.
(4) нет excel На сервере
(3) вроде тоже Excel надо
(1) почитаю
6 Drac0
 
08.04.14
09:37
В общем, если база скульная, то юзай прямые запросы и OpenDataSource, чтобы читать скулем из файла напрямую без самого Excel. Быстрее нет вариантов в принципе.
7 ptiz
 
08.04.14
09:39
Сохранить в DBF в сетевой шаре и работать далее с сервера.
8 mataranga
 
08.04.14
09:44
(7) тоже вариант имеет место быть
9 Maxus43
 
08.04.14
09:46
(5) не надо ексель, по ADO не надо, тока драйвер, а он стандартный
10 Maxus43
 
08.04.14
09:46
(6) для этого не надо скуль
11 Drac0
 
08.04.14
09:47
(10) Со скулем можно весь объем работы выполнить в одном запросе :)
12 Maxus43
 
08.04.14
09:49
(11) внезапно, из 1с тоже
13 Maxus43
 
08.04.14
09:49
типа что-то:
// ACE.OLEDB.12.0 - Для использования данного подключения необходимо дополнительное ПО:
        // Microsoft Access Database Engine 2010 Redistributable 32/64 bit.
        СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";
        
        // Еще один вариант.
        //СтрокаСоединения = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=" + СокрЛП(ФайлEXCEL) + ";";
14 Maxus43
 
08.04.14
09:49
15 _fvadim
 
08.04.14
09:59
1. Читать из excel весь лист в comsafearray - это быстро и сразу в массив.
2. Массив на сервер, там в ТЗ, затем в ВТ.
3. Одним запросом обработать выполнить проверку.
16 mataranga
 
08.04.14
10:04
(14) ты же говорил без ADO
17 Maxus43
 
08.04.14
10:05
(16) >>не надо ексель, по ADO не надо
читай внимательно.
Ексель установленный не надо через ADO чтоб подключится...
Сложно мысль выразил?
18 mataranga
 
08.04.14
10:06
Ексель установленный не надо, через ADO чтоб подключится...

ИЛИ

Ексель установленный, не надо через ADO чтоб подключится...
19 Maxus43
 
08.04.14
10:08
(18) В опу установленный эксель, если есть ADO
20 Maxus43
 
08.04.14
10:09
2-й вариант у тебя вобще не по русски
21 mataranga
 
08.04.14
10:34
(20) но вариант же ;)
22 mataranga
 
08.04.14
10:43
Область = Лист.Range(Лист.Cells(2,1), Лист.Cells(КоличествоСтрокExcel,КоличествоСтолбцовExcel));
МассивДанных = Область.Value.Выгрузить();

Тоже ведь как вариант
23 _fvadim
 
08.04.14
10:46
(22) писал об этом в (15)
24 mataranga
 
08.04.14
10:50
вот я из (15) к этому и пришол :) Спасибо!
25 _fvadim
 
08.04.14
11:00
(24) есть один неприятный момент.
я как-то пытался прочитать 250 тыс строк в 7 колонок - value.выгрузить() отваливалось с ошибкой. Переписал на чтение блоками по 10 тыс строк с последующим упихиванием в один массив. По скорости осталось примерно так же, работает стабильно.

&НаКлиенте
Функция ПрочитатьДанныеИзФайла(ИмяФ, Лист = "", ПерваяКолонка = 1, ПоследняяКолонка = 0, ПерваяСтр=0, ПоследняяСтр=0)
    Попытка    ExcelObj = Новый COMОбъект("Excel.Application"); Исключение    Сообщить("Ошибка при обращении к приложению excel" + ИмяФ + ". " + ОписаниеОшибки()); Возврат Новый Массив; КонецПопытки;
    
    Попытка    ExcelObj.Workbooks.Open(ИмяФ); Исключение Сообщить("Ошибка чтения файла " + ИмяФ + ". " + ОписаниеОшибки()); ExcelObj.Quit(); Возврат Новый Массив; КонецПопытки;
    
    Если Лист <> "" Тогда
        ExcelObj.Worksheets(Лист).Activate();
    КонецЕсли;
    
    ПоследняяСтрока  = Мин(ExcelObj.ActiveSheet.Cells.SpecialCells(11).Row, ПоследняяСтр);
    Если ПоследняяСтр < 2 Тогда
        ПоследняяСтрока  = ExcelObj.ActiveSheet.Cells.SpecialCells(11).Row;
    иначе
        ПоследняяСтрока  = Мин(ExcelObj.ActiveSheet.Cells.SpecialCells(11).Row, ПоследняяСтр);
    КонецЕсли;
    
    Если ПоследняяКолонка = 0 Тогда
        ПоследняяКолонка = ExcelObj.ActiveSheet.Cells.SpecialCells(11).Column;
    КонецЕсли;
    
    Данные = Новый Массив;
    ГраницаБлока = Макс(2, перваястр);
    Пока ГраницаБлока <= ПоследняяСтрока Цикл
        Блок = ExcelObj.Range(ExcelObj.Cells(ГраницаБлока, ПерваяКолонка),
                              ExcelObj.Cells(Мин(ГраницаБлока + 9999, ПоследняяСтрока), ПоследняяКолонка)
                              ).Value.Выгрузить();
        ГраницаБлока = ГраницаБлока + 10000;
        Если Данные.Количество() = 0 Тогда
            Данные = Блок;
        Иначе
            Для Индекс1 = 0 По Блок.Количество() - 1 Цикл
                Для Индекс2 = 0 По Блок[0].Количество() - 1 Цикл
                    Данные[Индекс1].Добавить(Блок[Индекс1][индекс2]);
                КонецЦикла;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    ExcelObj.ActiveWorkbook.Saved = Истина;
    ExcelObj.ActiveWorkbook.Close();
    
    ExcelObj.Quit();
    Возврат Данные;
КонецФункции

здесь отбрасывается 1-я строка - предполагается наличие шапки
26 mataranga
 
08.04.14
11:16
окей учту, спасибо большое