Доброго времени суток. Платформа7.7
Задача: Есть 2 эксель файла по 5000 позиций в каждом (приблизительно). нужно зделать выборку по условии в третий файл. Вопрос: Эфективность(скорость) роботы обработки будет выше если сначала переместить эти файлы в ТЗ, а уж потом обрабатывать или напрямую робота с ексель файлами, или нет никакой разницы в скорости в обоих случаях?
Если кто эксперементировал, подскажите. Мне лень писать 2 обработки и сравнивать их потом. ))) Проще написать одну. :-)
Спасибо за понимание.
Я думаю, на 5000 строк вы особой разницы не почувствуете . Та и писать то тут, в принципе, фигня. Процентов 70 кода будет одинакового в обоих обработках
Процедура Выполнить2()
Имя=КаталогИБ()+"\xls\open.xls";
Лист=СоздатьОбъект("Excel.Application");
Лист.Workbooks.Open(Имя); //Добавляем новый документ
ТЗ1 = СоздатьОбъект("ТаблицаЗначений");
ТЗ1.НоваяКолонка("Код");
ТЗ1.НоваяКолонка("Имя");
ТЗ1.НоваяКолонка("Цена");
Лист.ScreenUpdating = 0;
Лист.EnableEvents = 0;
Лист.Visible = 0;
сч=0;
строкаЕхель=1;
пока сч<10 Цикл
Ячейка=СокрЛП(Лист.Cells(строкаЕхель,2).Value);
Если Ячейка="" Тогда
сч=сч+1;
Иначе
сч=0;
ТЗ1.НоваяСтрока();
ТЗ1.Код=СокрЛП(Лист.Cells(строкаЕхель,1).Value);
ТЗ1.Имя=СокрЛП(Лист.Cells(строкаЕхель,2).Value);
ТЗ1.Цена=0;
//Сообщить(ТЗ1.Код);
//Сообщить(ТЗ1.Имя);
КонецЕсли;
строкаЕхель=строкаЕхель+1;
КонецЦикла;
Имя2=КаталогИБ()+"\xls\test.xls";
Лист2=СоздатьОбъект("Excel.Application");
Лист2.Workbooks.Open(Имя2); //Добавляем новый документ
ТЗ2 = СоздатьОбъект("ТаблицаЗначений");
ТЗ2.НоваяКолонка("Имя");
ТЗ2.НоваяКолонка("Цена");
сч=0;
строкаЕхель=1;
пока сч<10 Цикл
Ячейка=СокрЛП(Лист2.Cells(строкаЕхель,1).Value);
Если Ячейка="" Тогда
сч=сч+1;
Иначе
сч=0;
ТЗ2.НоваяСтрока();
ТЗ2.Имя=СокрЛП(Лист.Cells(строкаЕхель,1).Value);
ТЗ2.Цена=СокрЛП(Лист.Cells(строкаЕхель,6).Value);
//Сообщить(ТЗ2.Имя);
//Сообщить(ТЗ2.Цена);
КонецЕсли;
строкаЕхель=строкаЕхель+1;
КонецЦикла;
Имя3=КаталогИБ()+"\xls\Результат.xls";
Лист3=СоздатьОбъект("Excel.Application");
Лист3.Workbooks.Open(Имя3); //Добавляем новый документ
строкаЕхель=1;
ТЗ1.ВыбратьСтроки();
Пока ТЗ1.ПолучитьСтроку()=1 Цикл
ТЗ2.ВыбратьСтроки();
Пока ТЗ2.ПолучитьСтроку()=1 Цикл
Если ТЗ1.Имя=ТЗ2.Имя Тогда
Лист3.Cells(строкаЕхель,1).Value=ТЗ1.Код;
Лист3.Cells(строкаЕхель,2).Value=ТЗ1.Имя;
Лист3.Cells(строкаЕхель,3).Value=ТЗ1.Цена;
//Сообщить();
//Сообщить(ТЗ1.Код);
//Сообщить(ТЗ1.Имя);
//Сообщить(ТЗ2.Цена);
строкаЕхель=строкаЕхель+1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
//******************************************************
Лист.ScreenUpdating = 1; //Ускореем
Лист.EnableEvents = 1; //Вывыд
Лист.Visible = 1; //в EXEL
//******************************************************
Сообщить(ТекущееВремя());
форма.закрыть();
КонецПроцедуры
Медленный вариант для сравнения тоже было бы интересно посмотреть
Медленный вариант будет работать быстрее (не 52 секунды, но и не 5 минут) если читать файл порциями.
Функция ПолучитьПорциюСтрокИзExcelФайла(НачСтрока, КонСтрока, ПутьФайла)
xlLastCell = 11;
НомерЛистаExcel = 1;
ИмяФайла = СокрЛП(ПутьФайла);
ВыбФайл = Новый Файл(ИмяФайла);
Если НЕ ВыбФайл.Существует() Тогда
Сообщить("Файл не существует!");
Возврат Ложь;
КонецЕсли;
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ИмяФайла);
ExcelЛист = Excel.Sheets(НомерЛистаExcel);
Исключение
Сообщить(ОписаниеОшибки());
Возврат ложь;
КонецПопытки;
ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
RowCount = ActiveCell.Row;
ColumnCount = ActiveCell.Column;
Для Row = НачСтрока По КонСтрока Цикл
// здесь читаем строки и пишем их в таблицу
Значение = ExcelЛист.Cells(Row,НомерКолонки).Value;
КонецЦикла;
Excel.WorkBooks.Close();
Excel = 0;
Возврат ТаблицаЗагрузки;
КонецФункции
Платформы немного отличаются. Но общий фон я понял. Я так и сделал в варианте Б. ексель лист передал в ТЗ и обрабатывал я уже Таблицу значений. Я думал существует алгоритм который ускорит роботу при прямой роботе с диском: типа честями брать файлы и эти части как-то обрабатывать в процессе.
Если ваша программа работает медленно, значит, вы опередили время.
А это уже из области теории алгоритмов Порционность в сопоставлении данных возможна, если данные предварительно отсортировать по признаку сравнения
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua