Быстрая функция чтения данных с листа Excel

Публикация № 20090

Разработка - Практика программирования

Excel ComSaveArray

350
Прочитал статью "Универсальное решение работы с Ексель". И опять чтение происходит путем перебора ячеек листа Ексель. Для больших файлов это очень медленно. Решил просмотреть ВСЕ обработки из рубрики 1С + Excel...

Прочитал статью "Универсальное решение работы с Ексель". И опять чтение происходит путем перебора ячеек листа Ексель. Для больших файлов это очень медленно. Решил просмотреть ВСЕ обработки из рубрики 1С + Excel с целью определить - стоит ли писать о способе чтения Excel файла которым сам пользуюсь.

Итог - почти во всех обработках происходит чтение файла путем перебора каждой ячейки выбранного диапазона листа Ексель. Только в //catalog.mista.ru/projects/3962/ - использует  вариантный массив, а также чтение с использованием ADO. И то вариантный массив читается поячеечно.

Много обработок с закрытым кодом - о них ничего сказать не могу. 

Но, большинство обработок - законченные решения выполняющие различные функции, а не только ПРОСТОЕ чтение файла. (искренний респект и уважение авторам) Я же предлагаю всего лишь функцию быстрого чтения файла Excel. Готовых обработок в этой области не выкладываю - дублировать существующие нет смысла, или они явно не дотягивают по функционалу до уже выложенных :)

Итак. При чтении файла Excel я использую вариантный массив. Он позволяет быстро получить ВСЮ таблицу листа в память, а также получать данные массива целыми колонками. Тем самым время на чтение области файла Excel в таблицу значений сокращается в десятки раз.

Вот текст функции.

Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт

Если ЛистЭксель = Неопределено Тогда
   
ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
КонецЕсли;
Если
ВсегоСтрок = 0 Тогда
   
ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
КонецЕсли;
Если
ВсегоКолонок = 0 Тогда
   
ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
КонецЕсли;
Если
ТЗ = Неопределено Тогда
   
ТЗ =  Новый ТаблицаЗначений;
    Для
Счетчик = 1 По ВсегоКолонок Цикл
       
ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
    КонецЦикла;
КонецЕсли;
Для
Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
   
НоваяСтрока = ТЗ.Добавить();
КонецЦикла;

Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
Данные = Область.Value.Выгрузить();

Для
Счетчик = 0 По ВсегоКолонок-1 Цикл
   
ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
КонецЦикла;
ЛистЭксель = Неопределено;
Возврат
ТЗ;
КонецФункции

 

Комментировать функцию, думаю, нет необходимости. Вот собственно и все, что я хотел сказать. 

 

 

 

350

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. alexk-is 6427 21.05.09 13:33 Сейчас в теме
Может быть текст функции раскрасить?
2. wildhog 460 21.05.09 13:44 Сейчас в теме
(1) Хорошая идея, твоя обработка замечательно справиться :)
15. kadr 47 25.05.09 13:14 Сейчас в теме
Это был тест чтения
Обработано строк: 8 колонок: 10000 итого ячеек; 80000

Тест записи
Выполнение скрипта заняло: 484 мсек.

КОД
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

ИмяВК="AddIn.ExcelEditor";
Попытка
ПодключитьВнешнююКомпоненту(ИмяВК);
Исключение
Предупреждение("Не удалось подключить компоненту " + ИмяВК);
КонецПопытки;

Попытка
Экзель = Новый(ИмяВК);
Исключение
Предупреждение("Ошибка создания объекта внешней компоненты: " + ИмяВК);
КонецПопытки;

Если Экзель.ОткрытьФайл("c:\delado.xls") тогда
Если Экзель.ОткрытьЛист(2) тогда

Строк = 100;
Колонок = 100;

Для Сч = 1 по Строк Цикл
Для Сч1 = 1 по Колонок Цикл
Экзель.РедактироватьЗначениеЯчейки(0, 1, Сч*Сч1);
КонецЦикла;
КонецЦикла;


ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
ОчиститьСообщения();
Сообщить("Выполнение скрипта заняло: " + Строка(ВремяОкончания - ВремяНачала) + " мсек. ");
Экзель.Выполнено();
КонецЕсли;
КонецЕсли;

Кстати параметры функции РедактироватьЗначениеЯчейки в документации не указаны :)
16. Душелов 3902 25.05.09 13:16 Сейчас в теме
(15) Попытка/Исключение хорошо кушают милисекунды, кстати.
63. PeRom 51 25.05.09 18:33 Сейчас в теме
Пользую метод давно, хотел поделится, но никак не могу справиться с проблеммой, можт кто сталкивался?
Код: Файл = Новый COMОбъект("Excel.Application");
Файл.DisplayAlerts = 0; //не задавать вопросы
Файл.Application.AutomationSecurity = 3; //уровень безопасности
Книга = Файл.Workbooks.Open(ФайлХЛ);
Лист = Книга.Worksheets(2);
Пока (НЕ ПустаяСтрока(Строка(Лист.Cells(строкаXL,1).Value))) или
(НЕ ПустаяСтрока(Строка(Лист.Cells(строкаXL,2).Value))) Цикл
строкаXL = строкаXL+1;
КонецЦикла;
COMSafeArrayМассив = Лист.range(Лист.Cells(1,1),Лист.Cells(строкаXL,249)).Value;
Книга.Close();
Массив = COMSafeArrayМассив.Выгрузить();............
Файл около 50 Мбайт с макросами и паролями(но с этим вроде разобрался), из одного листа файла загружаю 250 колонок * 6-10 000 строк, на строке Книга = Файл.Workbooks.Open(ФайлХЛ); висит 5-6 минут, остальное пролетает за секунды. Как можно это победить?
64. wildhog 460 26.05.09 08:57 Сейчас в теме
(63) А сколько времени открывается файл в WIndows?
попробуй отключать еще автопересчет формул, кажется свойство Calculation.
М.б еще какие макросы запускаются при открытии?
Если не поможет, м.б попробовать ADO? В этой ветке ado подробно осветили :)
7. kadr 47 25.05.09 09:27 Сейчас в теме
На днях протестил wildhog vs ADO на листе с 8 колонками и 10000 строками.
Результаты
wildhog:
Выполнение скрипта заняло: 391 мсек.
Обработано строк: 8 колонок: 10000 итого ячеек; 80000

КОД
[code/]
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";

ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Эксель = ПолучитьCOMОбъект("c:\delado.xls");
ЛистЭксель = Эксель.WorkSheets(1);
ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;

Сообщить("Колонок: "+ Строка(ВсегоКолонок) + " Строк: "+ Строка(ВсегоСтрок));

ТЗ = Новый ТаблицаЗначений;
Для Счетчик = 1 По ВсегоКолонок Цикл
ТЗ.Колонки.Добавить("Колонка"+Счетчик);
КонецЦикла;

Для Счетчик = 1 По ВсегоСтрок Цикл
НоваяСтрока = ТЗ.Добавить();
КонецЦикла;

Область = ЛистЭксель.Range(ЛистЭксель.Cells(1,1), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
Данные = Область.Value.Выгрузить();

Для Счетчик = 0 По ВсегоКолонок-1 Цикл
ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
КонецЦикла;
ЛистЭксель = Неопределено;
Эксель = Неопределено;

ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
ОчиститьСообщения();
Сообщить("Выполнение скрипта заняло: " + Строка(ВремяОкончания - ВремяНачала) + " мсек. " + Символы.ПС +
"Обработано строк: " + Строка(ВсегоКолонок) + " колонок: " + Строка(ВсегоСтрок) + " итого ячеек; " + Строка(ВсегоКолонок * ВсегоСтрок));
[/code]

ADO:
Выполнение скрипта заняло: 438 мсек.
Обработано строк: 8 колонок: 10000 итого ячеек; 80000
Использовалась ВК GameWithFire

КОД
[code/]
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Соединение = Новый COMОбъект("ADODB.Connection");
НаборДанных = Новый COMОбъект("ADODB.RecordSet");

Соединение.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\delado.xls;Extended Properties=Excel 8.0");
НаборДанных.Open("sel ect * from [Лист1$]", Соединение);

Колонок = 0; Строк = 0;
ИспользовалИСО = Ложь;

Попытка
ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");
ADOUtils = Новый("AddIn.ADOUtils");
ТЗ = ADOUtils.ADORecordsetToValueTable(НаборДанных);
ИспользовалИСО = Истина;
Исключение
ЧислоКолонокНабора =НаборДанных.Fields.Count;
ТЗ = Новый ТаблицаЗначений;
Для Сч = 1 по ЧислоКолонокНабора Цикл
ТЗ.Колонки.Добавить("Колонка"+Строка(Сч));
Колонок = Колонок + 1;
КонецЦикла;

НаборДанных.MoveFirst();
Пока НЕ НаборДанных.EOF Цикл
СтрокаТЗ = ТЗ.Добавить();
Для Сч = 1 по ЧислоКолонокНабора Цикл
СтрокаТЗ["Колонка"+Строка(Сч)] = НаборДанных.Fields.Item(Сч-1).Value;
КонецЦикла;

Строк = Строк + 1;
НаборДанных.MoveNext();
КонецЦикла;
КонецПопытки;

Если Колонок = 0 Или Строк = 0 тогда
Колонок = ТЗ.Колонки.Количество();
Строк = ТЗ.Количество();
КонецЕсли;

Соединение = Неопределено;
НаборДанных = Неопределено;

ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
ОчиститьСообщения();
Сообщить("Выполнение скрипта заняло: " + Строка(ВремяОкончания - ВремяНачала) + " мсек. " + Символы.ПС +
"Обработано строк: " + Строка(Колонок) + " колонок: " + Строка(Строк) + " итого ячеек; " + Строка(Строк * Колонок)+
?(ИспользовалИСО,Символы.ПС+"Использовалась ВК GameWithFire",""));

ТЗ.ВыбратьСтроку();
Скрипт = Неопределено;
[/code]

Вот так вот
Кстати, писать в Excel тоже лучше массивом
[code/]
Эксель = Новый COMОбъект("Excel.Application");
Книга = Эксель.Workbooks.Add("c:\delado.xls");
Лист = Книга.Sheets(2);

Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Строк = 100;
Колонок = 100;

Для Сч = 1 по Строк Цикл
Для Сч1 = 1 по Колонок Цикл
Лист.cells(Сч,Сч1).Value = сч1;
КонецЦикла;
КонецЦикла;

ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Сообщить("Выполнение скрипта заняло: " + Строка(ВремяОкончания - ВремяНачала) + " мсек. ");

Эксель.Visible = 1;
[/code]
Результат Выполнение скрипта заняло: 94 мсек.

Результат вывода через Лист.Cells(i,j).Value
Выполнение скрипта заняло: 25937 мсек.
ZeroSumGame; y.dyachenko; kiruha; Istur; Rustig; +5 Ответить
9. Душелов 3902 25.05.09 11:53 Сейчас в теме
(7) Попробуй еще протестить на скорость http://infostart.ru/projects/3214/
10. kadr 47 25.05.09 12:10 Сейчас в теме
(9) Дык а чего там тестить?
Только оптимальную реализацию алгоритмов работы с Compound объектами?
11. kadr 47 25.05.09 12:11 Сейчас в теме
(9) На правах рекламы :)))
Ваша реализация, ИМХО, самая быстрая, хотя не тестил :)
12. kadr 47 25.05.09 12:57 Сейчас в теме
(9) Болт. не самая быстрая
Код
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

ИмяВК="AddIn.ExcelEditor";
Попытка
ПодключитьВнешнююКомпоненту(ИмяВК);
Исключение
Предупреждение("Не удалось подключить компоненту " + ИмяВК);
КонецПопытки;

Попытка
Экзель = Новый(ИмяВК);
Исключение
Предупреждение("Ошибка создания объекта внешней компоненты: " + ИмяВК);
КонецПопытки;

Если Экзель.ОткрытьФайл("c:\delado.xls") тогда
Если Экзель.ОткрытьЛист(1) тогда
КоличествоКолонок = Экзель.ПолучитьКоличествоКолонок();
КоличествоСтрок = Экзель.ПолучитьКоличествоСтрок();

Таблица = Новый ТаблицаЗначений;
Для Сч = 1 по КоличествоКолонок Цикл
Таблица.Колонки.Добавить("Колонка"+Строка(Сч));
КонецЦикла;

Для Сч = 1 по КоличествоСтрок Цикл
СтрокаТЗ = Таблица.Добавить();
Для Сч1 = 1 по КоличествоКолонок Цикл
СтрокаТЗ[Сч1-1] = Экзель.ПолучитьЗначениеЯчейки(Сч, Сч1);
КонецЦикла;
КонецЦикла;

Экзель.Выполнено();

ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
ОчиститьСообщения();
Сообщить("Выполнение скрипта заняло: " + Строка(ВремяОкончания - ВремяНачала) + " мсек. ");
КонецЕсли;
КонецЕсли;

Результат
Выполнение скрипта заняло: 2125 мсек.
13. Душелов 3902 25.05.09 13:06 Сейчас в теме
(12) А где

"Строк = 100;
Колонок = 100;"

?
14. Душелов 3902 25.05.09 13:12 Сейчас в теме
(12) И как бы создание объектов стоит убрать из тестов, а оставить только чтение данных.
110. Serg O. 181 11.02.15 10:58 Сейчас в теме
Еще есть способ - быстрой "вставки" таблицы из Excel в 1С - через копирование -вставку... (копипаст)
программным способом еще года 2 назад сам делал... через Wscript.Shell

"доработка" стандартной обработки загрузки из табличного документа
функция мПрочитатьТабличныйДокументИзExcel()




// Функция считывает в табличный документ данные из файла в формате Excel
//
// Параметры:
// ТабличныйДокумент - ТабличныйДокумент, в который необходимо прочитать данные
// ИмяФайла - имя файла в формате Excel, из которого необходимо прочитать данные
// НомерЛистаExcel - номер листа книги Excel, из которого необходимо прочитать данные
//
// Возвращаемое значение:
// Истина, если файл прочитан, Ложь - иначе
//
Функция мПрочитатьТабличныйДокументИзExcel(ТабличныйДокумент, ИмяФайла, НомерЛистаExcel = 1) Экспорт

xlLastCell = 11;

ВыбФайл = Новый Файл(ИмяФайла);
Если НЕ ВыбФайл.Существует() Тогда
Сообщить("Файл не существует!");
Возврат Ложь;
КонецЕсли;

Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ИмяФайла);
Состояние("Обработка файла Microsoft Excel...");
ExcelЛист = Excel.Sheets(НомерЛистаExcel);
Исключение
Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
Возврат ложь;

КонецПопытки;

ТабличныйДокумент.Очистить();


ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
RowCount = ActiveCell.Row;
ColumnCount = ActiveCell.Column;

//+++ через буфер обмена
попытка

Excel.ActiveCell.SpecialCells(xlLastCell).Select();
Excel.Range( Excel.Selection, Excel.Cells(1)).Select();

Wsh = новый COMобъект("Wscript.Shell");
Excel.Selection.Copy();
Wsh.sendkeys("^c");

Предупреждение("Нажмите кнопку [Да] в следующем окна.
|Требуется сохранить данные в ""Буфер обмена""
|для быстрой вставки сразу всех данных в 1С...",30);
Excel.WorkBooks.Close();
Excel = 0;

//// Возврат Объект.ParentWindow.ClipboardData.Getdata("Text");
//// Снимим защиту и разрешим вывод
ТабличныйДокумент.Защита = Ложь;
ТабличныйДокумент.Вывод = ИспользованиеВывода.Разрешить;
ТабличныйДокумент.ТекущаяОбласть = ТабличныйДокумент.Область(1, 1, RowCount, ColumnCount);
рез = истина;
исключение
Предупреждение(ОписаниеОшибки());
рез = ложь;
КонецПопытки;
Предупреждение("Нажмите [Ок] для ""мгновенной"" вставки "+строка(RowCount)+" строк из файла...");
Wsh.sendkeys("^v");
возврат рез;
//+++)
КонецФункции
117. TVA_11 16.12.15 11:40 Сейчас в теме
(1) wildhog, благодарю!

Очень помогло.
118. Alien_job 165 01.04.16 11:04 Сейчас в теме
вот эти 3 строчки искал в другом месте. Было бы здорово их включить в статью

		Эксель = Новый COMОбъект("Excel.Application"); 
		Эксель.WorkBooks.Open(ИмяФайла);
		ЛистЭксель = Эксель.WorkSheets(1); 
119. wildhog 460 04.04.16 17:00 Сейчас в теме
(118) В статье основной посыл это метод работы с данными через comsafearray. А каким образом получен объект WorkSheets - вторично. В моем примере вообще читается текущий лист последней активной книги Excel.
Поэтому, спасибо за предложение, но в данному случае, имхо, это лишнее. К тому же в (7) этот код уже есть ;)
124. adapter 514 29.10.19 14:12 Сейчас в теме
можно еще короче - открыть файл, удалить пустые строки\столбы вначале, использовать код

	
Excel = ПолучитьCOMОбъект(Объект.ПутьКФайлу);
Данные = Excel.ActiveSheet.UsedRange().Value.Выгрузить();


Особенности:
Читает сразу из открытого файла
Автоматический поиск заполненых ячеек. Если в начале есть пустые строки\столбы, то Excel может не правильно определить используемый диапазон (много лишнего). Проверить можно на листе нажав ctrl+shift+space

Обойти можно выделив вначале первую ячейку данных
	
Excel = ПолучитьCOMОбъект(Объект.ПутьКФайлу,"Excel.Application");
Excel.Worksheets(1).Range("B1").Select();
Данные = Excel.ActiveSheet.UsedRange().Value.Выгрузить();	


ну и в последних релизах ПолучитьCOMОбъект перестал работать из не открытого файла. Если нужно из закрытого то
Excel = Новый COMОбъект("Excel.Application");
3. СергейКа 676 22.05.09 12:50 Сейчас в теме
Век живи - век учись... Даже не подозревал о возможности Область.Value.Выгрузить();
y.dyachenko; +1 Ответить
4. wildhog 460 22.05.09 15:34 Сейчас в теме
Область.Value - это ComSafeArray. О нем в конфигураторе довольно подробно написано + методы тоже имеются.
5. artem666 28 23.05.09 10:58 Сейчас в теме
6. A'Huli 23 25.05.09 06:57 Сейчас в теме
8. acsent 1141 25.05.09 11:39 Сейчас в теме
ADO не всегда можно. Например нельзя когда разного типа данные в одном столбце. Привоодятся к строке
m_aster; Rustig; +2 Ответить
17. kadr 47 25.05.09 13:17 Сейчас в теме
Создание объектов включил специально, чтобы увидеть скорость выполнения не именно операция ввода-вывода, а скорость импорта-экспорта

Коды тестов есть - дорабатывать и оптимизировать можно всегда :)
18. kadr 47 25.05.09 13:18 Сейчас в теме
19. Душелов 3902 25.05.09 13:19 Сейчас в теме
(18) Пожертвовать скоростью с попыткой/исключение при открытии обработки можно... Важна скорость обработки многомегобайтных файлов.
26. kadr 47 25.05.09 13:38 Сейчас в теме
(19) согласен
я думал твоя вк будет самой быстрой, но видишь как получилось..
Думаю косяк в многократном вызове метода ВК РедактироватьЗначениеЯчейки, а там по цепочке callAsproc, callasfunc затем у тебя создание объекта типа cell и тд

(22)
Сегодня уже не смогу протестить с разными параметрами

(24) какой файлик? Excel? или тесты? или то и другое? мыло?
28. Душелов 3902 25.05.09 13:40 Сейчас в теме
(26) Эти тесты пока не объективны ;)
20. kadr 47 25.05.09 13:19 Сейчас в теме
Ок без Попытка-исключение
Чтение
Выполнение скрипта заняло: 2093 мсек.

Запись
Выполнение скрипта заняло: 469 мсек.
21. Душелов 3902 25.05.09 13:20 Сейчас в теме
И попробуй сделать 80000 строк.
22. Душелов 3902 25.05.09 13:23 Сейчас в теме
И попробуй сделать 3 колонки - число, строка и дата ;)
Просто самому интересны результаты.
32. wildhog 460 25.05.09 14:20 Сейчас в теме
(22) Если нужно прочитать данные сохранив именно те типы которые определены в Экселе, то в сабже нужно сформировать колонки таблицы значений заранее, указав соответствующие типы. В этом случае значения в результирующей ТЗ будут приводиться к типу колонки ТЗ.
23. kadr 47 25.05.09 13:31 Сейчас в теме
Без создания объектов чисто операции I/O

ЧТЕНИЕ
wildhog

КОД
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Область = ЛистЭксель.Range(ЛистЭксель.Cells(1,1), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
Данные = Область.Value.Выгрузить();
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

результат
Выполнение скрипта заняло: 109 мсек.
Обработано строк: 8 колонок: 10000 итого ячеек; 80000

ADO
КОД
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
ТЗ = ADOUtils.ADORecordsetToValueTable(НаборДанных);
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Результат
Выполнение скрипта заняло: 359 мсек.
Обработано строк: 8 колонок: 10000 итого ячеек; 80000
Использовалась ВК GameWithFire

Душелов
КОД
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Для Сч = 1 по КоличествоСтрок Цикл
СтрокаТЗ = Таблица.Добавить();
Для Сч1 = 1 по КоличествоКолонок Цикл
СтрокаТЗ[Сч1-1] = Экзель.ПолучитьЗначениеЯчейки(Сч, Сч1);
КонецЦикла;
КонецЦикла;
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Результат
Выполнение скрипта заняло: 1843 мсек.

ЗАПИСЬ

COMSAfeArray
КОД
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Лист.Range(Лист.Cells(1,1),Лист.cells(Строк,Колонок)).Value = Массив2;
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Результат
Выполнение скрипта заняло: 47 мсек.

Построчно
КОД
Строк = 100;
Колонок = 100;
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Для Сч = 1 по Строк Цикл
Для Сч1 = 1 по Колонок Цикл
Лист.cells(Сч,Сч1).Value = сч1;
КонецЦикла;
КонецЦикла;
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Результат
Выполнение скрипта заняло: 22500 мсек.

Душелов
КОД

Строк = 100;
Колонок = 100;
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Для Сч = 1 по Строк Цикл
Для Сч1 = 1 по Колонок Цикл
Экзель.РедактироватьЗначениеЯчейки(0, 1, Сч*Сч1);
КонецЦикла;
КонецЦикла;
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Результат
Выполнение скрипта заняло: 219 мсек.
25. Душелов 3902 25.05.09 13:36 Сейчас в теме
(23) На счет чтение... Там везде ТЗ 1С-овское получается?

А то у автора:

"Данные = Область.Value.Выгрузить();

Для Счетчик = 0 По ВсегоКолонок-1 Цикл
ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
КонецЦикла;"

Как бы не объективно получается ;)
31. wildhog 460 25.05.09 14:00 Сейчас в теме
(25)
Здесь

Данные = Область.Value.Выгрузить();

"Данные" - тип ComSafeArray.
"ТЗ" - Тип таблица значений (самая что нинаеть 1совская :) )
Чуть выше ж есть "ТЗ = Новый ТаблицаЗначений;"

А вот Данные[Счетчик] - уже типа МАССИВ. Он то легко и загружается методом
таблицы значений "ЗагрузитьКолонку".
24. Душелов 3902 25.05.09 13:34 Сейчас в теме
Кинь файлик мне ;) Посмотрю, что да как... Что-то долго слишком.
27. Душелов 3902 25.05.09 13:39 Сейчас в теме
И на счет записи тоже самое. Приведи запись из 1С-овского ТЗ в 1 варианте.
29. kadr 47 25.05.09 13:47 Сейчас в теме
(27)
Эксель = Новый COMОбъект("Excel.Application");
Книга = Эксель.Workbooks.Add("c:\delado.xls");
Лист = Книга.Sheets(2);

Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
//ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Строк = 100;
Колонок = 100;
Массив = Новый Массив(Строк,Колонок);
Для Сч = 0 по Строк - 1 Цикл
Для Сч1 = 0 по Колонок - 1 Цикл
Массив[сч][сч1] = сч1;
КонецЦикла;
КонецЦикла;

Массив2 = Новый COMSafeArray(Массив, "VT_I4",Строк,Колонок);

ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Лист.Range(Лист.Cells(1,1),Лист.cells(Строк,Колонок)).Value = Массив2;
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Сообщить("Выполнение скрипта заняло: " + Строка(ВремяОкончания - ВремяНачала) + " мсек. ");

Эксель.Visible = 1;

Вот из ComSafeArray/ надо из Тз - засунь ТЗ в массив и выведи

Согласен, что не все 1С-совское, но согласись, мы замеряем не скорость работы какого-то определенного интерфейса, а скорость операции импорта-экспорта

(24)
А ты реализцй у с(27)
Эксель = Новый COMОбъект("Excel.Application");
Книга = Эксель.Workbooks.Add("c:\delado.xls");
Лист = Книга.Sheets(2);

Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
//ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Строк = 100;
Колонок = 100;
Массив = Новый Массив(Строк,Колонок);
Для Сч = 0 по Строк - 1 Цикл
Для Сч1 = 0 по Колонок - 1 Цикл
Массив[сч][сч1] = сч1;
КонецЦикла;
КонецЦикла;

Массив2 = Новый COMSafeArray(Массив, "VT_I4",Строк,Колонок);

ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Лист.Range(Лист.Cells(1,1),Лист.cells(Строк,Колонок)).Value = Массив2;
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Сообщить("Выполнение скрипта заняло: " + Строка(ВремяОкончания - ВремяНачала) + " мсек. ");

Эксель.Visible = 1;

Вот из ComSafeArray/ надо из Тз - засунь ТЗ в массив и выведи

Согласен, что не все 1С-совское, но согласись, мы замеряем не скорость работы какого-то определенного интерфейса, а скорость операции импорта-экспорта

Ты реализуй в своей вк метод типа ТЗВЭкзель :)
34. Душелов 3902 25.05.09 14:29 Сейчас в теме
(29) >Согласен, что не все 1С-совское, но согласись, мы замеряем не скорость работы какого-то определенного интерфейса, а скорость операции импорта-экспорта

>Вот из ComSafeArray/ надо из Тз - засунь ТЗ в массив и выведи

Это надо учитывать в подсчете времени теста!

Условия задачи надо определить жестче:
1) Из экзеля загрузить в ТЗ данные.
2) Из ТЗ записать данные в экзелевский файл.

(31) Да я знаю, я говорю автору теста kadr, о том, что тесты не объективны, т.к. у него в тестах отсутствует заполнение ТЗ, которое так же занимает время.
35. kadr 47 25.05.09 14:34 Сейчас в теме
(34) как же отсутствует?
посмотри начальные тесты (7) там все есть...
затем я просто выложил голое время без создания, инициализации и заполнения объектов
37. Душелов 3902 25.05.09 14:38 Сейчас в теме
(35) я про (23), в моем примере ты заполняешь строку ТЗ.
39. kadr 47 25.05.09 14:54 Сейчас в теме
(37) согласен
исправим первый пример с учетом загрузки ТЗ оптом
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Область = ЛистЭксель.Range(ЛистЭксель.Cells(1,1), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
Данные = Область.Value.Выгрузить();

Для Счетчик = 0 По ВсегоКолонок-1 Цикл
ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
КонецЦикла;
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Выполнение скрипта заняло: 141 мсек.
Обработано строк: 8 колонок: 10000 итого ячеек; 80000

И построчно
ВремяНачала = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");
Область = ЛистЭксель.Range(ЛистЭксель.Cells(1,1), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
Данные = Область.Value.Выгрузить();

Для Сч = 1 По ВсегоКолонок Цикл
Для Сч1 = 1 По ВсегоСтрок Цикл
ТЗ[Сч1-1][Сч-1] = Данные[Сч-1][Сч1-1];
КонецЦикла;
КонецЦикла;
ВремяОкончания = Формат(Скрипт.eval("new Date().getTime()"),"ЧГ=0");

Выполнение скрипта заняло: 828 мсек.
Обработано строк: 8 колонок: 10000 итого ячеек; 80000
42. Душелов 3902 25.05.09 15:02 Сейчас в теме
(39) :) Сейчас я поколдую с массивами, ибо компонента должна была работать и в 7-ке, а она (до не давнего времени) с комсэйф-массивами не работала, и можно будет протестировать.
46. Душелов 3902 25.05.09 15:18 Сейчас в теме
(39) Ради эксперимента, попробуй в рег.бат компоненты моей после строки
regasm.exe ExcelEditor.dll /codebase

добавить строку

ngen.exe ExcelEditor.dll

и перерегить.
58. kadr 47 25.05.09 17:08 Сейчас в теме
(46) чтение чуть быстрее стало
Выполнение скрипта заняло: 1735 мсек.
36. wildhog 460 25.05.09 14:34 Сейчас в теме
(34) а как сделать 70000 строк? у мну получилось только 65536?
38. Душелов 3902 25.05.09 14:39 Сейчас в теме
(36) Сделай в 8-ке и сохрани в экзель ;)
40. wildhog 460 25.05.09 14:56 Сейчас в теме
(38) попробовал... алгоритм взял из (29).
Что-то мне подсказывало что ничего не получиться :) . Так и вышло...
41. Душелов 3902 25.05.09 14:59 Сейчас в теме
(40) Это один из главных минусол ОЛЕ екзеля, ниже 2007 версии ;)
44. wildhog 460 25.05.09 15:14 Сейчас в теме
(41) млин туплю. Работал с файлами xls а не xlsx... Офис у мну 2007.
Все нормально создалось ну и загрузилось соответственно.
45. Душелов 3902 25.05.09 15:15 Сейчас в теме
(44) Результаты тестов какие?
47. Душелов 3902 25.05.09 15:19 Сейчас в теме
(44) xlsx уже не объективно ;) формат другой. С ним можно протестить ради эксперимента http://infostart.ru/projects/3495/
49. wildhog 460 25.05.09 15:29 Сейчас в теме
(47) Если честно. так и не вкурил как создать файл XLS с количеством строк более 65536. Выложи куда нить готовый файл протестирую.
53. wildhog 460 25.05.09 16:35 Сейчас в теме
Замер производительности по (47) - http://slil.ru/27691324

Количество строк: 123 301
Количество колонок: 6
54. Душелов 3902 25.05.09 16:40 Сейчас в теме
(53) А времени сколько вышло?

А файл для какого приложения? У меня ничего не стоит с этим расширением ассоциированного...
55. wildhog 460 25.05.09 16:45 Сейчас в теме
(54) Время в замере. Отдельно замерял. Но счет шел на минуты.
Файл xlsx.
Тестировал обработку чтения файла екселя средствами 1С которая из (47)
http://infostart.ru/projects/3495/
Функция взял из readme.
56. Душелов 3902 25.05.09 16:49 Сейчас в теме
(55) Ну если на минуты, то тогда не надо :)
59. wildhog 460 25.05.09 17:09 Сейчас в теме
(56) Итак. Тест твоей компоненты.
Выполнение скрипта заняло: 6 621 мсек.
Обработано колонок : 7
Обработано строк : 64 299

Тот же файл, только по сабжу:
Выполнение скрипта заняло: 7 989 мсек.
Обработано строк: 7 колонок: 64 299 итого ячеек; 450 093

Опять же повторное чтение с помощью сабжа (сразу после первого):
Выполнение скрипта заняло: 3 997 мсек.
Обработано строк: 7 колонок: 64 299 итого ячеек; 450 093

Скажи. а в ВК используешь GetRows?


60. wildhog 460 25.05.09 17:11 Сейчас в теме
(59) + файл замера производительности. http://slil.ru/27691513
61. Душелов 3902 25.05.09 17:21 Сейчас в теме
(59) Ну, примерно, аналогичное GetRows, но массив я все равно "ручками" заполняю.

И это ты тестил с "ПолучитьЗначения" ?
62. wildhog 460 25.05.09 17:26 Сейчас в теме
(61) Угу. пробежался по колонкам и загрузил данные

Экзель.ОткрытьФайл(ПутьКФайлу);
Экзель.ОткрытьЛист(1);
ВсегоКолонок = Экзель.ПолучитьКоличествоКолонок();
ВсегоСтрок = Экзель.ПолучитьКоличествоСтрок();

Для Счетчик = 1 По ВсегоСтрок Цикл
ТЗ.Добавить();
КонецЦикла;

Для Счетчик = 0 По ВсегоКолонок - 1 Цикл
Массив = Экзель.ПолучитьЗначения(Счетчик).Выгрузить();
ТЗ.ЗагрузитьКолонку(Массив, Счетчик);
КонецЦикла;
43. kadr 47 25.05.09 15:12 Сейчас в теме
30. wildhog 460 25.05.09 13:53 Сейчас в теме
Решил и я потестировать оба варианта.
Методика тестирования.
Создал 3 файла, в каждом 6 колонок, строк в 1м файле - 12000, 2м ~ 24000, 3м ~ 49000.

1 тест. запуск последовательно (сначала COMSAFEARRAY, потом ADO) на чтение одного файла. После каждого чтения перезагрузка.
Результат.

Колонок: 6 Строк: 11 999
Выполнение скрипта заняло: 5 323 мсек.
Выполнение скрипта заняло: 2 880 мсек.

Колонок: 6 Строк: 24 661
Выполнение скрипта заняло: 7 061 мсек.
Выполнение скрипта заняло: 5 551 мсек.

Колонок: 6 Строк: 49 321
Выполнение скрипта заняло: 7 890 мсек.
Выполнение скрипта заняло: 10 335 мсек.

Видно, что увеличение количества строк сильно сказывается при чтении через ADO

2 тест. Чтение последовательно 3х файлов разными методами (сначала COMSAFEARRAY, потом ADO). После каждого чтения перезагрузка.
Закешировал создаваемые процедурами Com объекты.

Результат.


Выполнение скрипта заняло: 3 067 мсек.
Обработано строк: 6 колонок: 11 999 итого ячеек; 71 994
Выполнение скрипта заняло: 1 182 мсек.
Обработано строк: 6 колонок: 24 661 итого ячеек; 147 966
Выполнение скрипта заняло: 2 274 мсек.
Обработано строк: 6 колонок: 49 321 итого ячеек; 295 926


Выполнение скрипта заняло: 2 450 мсек.
Обработано строк: 6 колонок: 11 998 итого ячеек; 71 988
Выполнение скрипта заняло: 4 917 мсек.
Обработано строк: 6 колонок: 24 660 итого ячеек; 147 960
Выполнение скрипта заняло: 9 849 мсек.
Обработано строк: 6 колонок: 49 320 итого ячеек; 295 920

Для метода чтения через COMSAFEARRAY замерил время создания Com объекта Екселя. Время создания COM Excel :2 001 мсек.

3 тест. Собственно и не тест а замер производительности средствами 1С.

Результат.

При чтении через ADO больше всего времени занимает выполнение вот этой строки (70%):

СтрокаТЗ["Колонка"+Строка(Сч)] = НаборДанных.Fields.Item(Сч-1).Value;

Обработка всего цикла считывания записей из recordset занимает 80% общего времени.

При чтении через COMSAFEARRAY 27% времени уходит на открытие файла.
27% на Данные = Область.Value.Выгрузить();
10% на ТЗ.Добавить(); :)
33. Душелов 3902 25.05.09 14:25 Сейчас в теме
Попробуйте затестить еще на 70000 строках ;)
48. wildhog 460 25.05.09 15:26 Сейчас в теме
(47, 45) для xlsx

Выполнение скрипта заняло: 13 240 мсек.
Обработано строк: 6 колонок: 123 301 итого ячеек; 739 806

Тут файл замера производительности http://slil.ru/27691047
50. Душелов 3902 25.05.09 15:31 Сейчас в теме
(48) А по ссылке в (47) время замера можешь сделать?
(49) Сделай отчет в 1С-ке и сохранить табличный документ в экзель.
51. wildhog 460 25.05.09 16:21 Сейчас в теме
(50) Попробую.

Поделюсь еще мыслями. Вспомнил что у recorseta есть метод GetRows()
Тут нашел полное описание http://support.microsoft.com/kb/246335

Но, оказалось, что получаемый массив нужно еще транспонировать, что скорее всего очень долго (м.б попозже попробую реализовать). Имхо этот метод (getrows)
не принесет ощутимого прироста в скорости, хотя, все возможно. :)
52. Душелов 3902 25.05.09 16:32 Сейчас в теме
(51) В моем компоненте аналогичное добавил. Обновление залил.
Но, думаю, тоже не сильно прироста скорости будет... Хотя кто знает... Протестить надо. Метод "ПолучитьЗначения".
57. wildhog 460 25.05.09 16:58 Сейчас в теме
65. rasswet 82 02.09.09 14:01 Сейчас в теме
сильно вы! респект! так на чем в итоге то останавливаемся?
66. Душелов 02.09.09 16:19 Сейчас в теме
(65) Я пользуюсь своей компонентой. И быстро, и без офиса. Т.к. у нас лицензионный софт везде, а офис не у всех стоит.
67. rasswet 82 15.09.09 22:53 Сейчас в теме
(66) млин((
написал чтение черед АДО. на работе работает. на домашнем компе тоже SP2 и
MDAC версии 2000.85.1022- не работает.
у того кому делал на висте -тоже не работает. у кого-то читает на висте через ADO
через компоненту твою я не умею..хотелось штатными (относительно) средствами.
68. Душелов 15.09.09 23:27 Сейчас в теме
(67) В чем проблема с компонентой?

АДО не работает как? Что пишет? Может поставщика данных нет в системе?
69. rasswet 82 16.09.09 07:16 Сейчас в теме
(68) компоненту не хочу, это слать клиенту длл, объяснять по телефону чё с ней делать..не. не хочу.
адо пишет ""BOF или EOF имеют значение True или текущая запись была удалена""

70. rasswet 82 16.09.09 08:34 Сейчас в теме
(68) проблема локализовалась. в тестовых файлах было по 1му листу, и грузилось нормально, а в реале оказалось три листа в фале. пофиксил.
71. CheBurator 3403 04.11.09 02:24 Сейчас в теме
юзайте йоксель...
а адо как-то попробовал -и бросил ибо на первом же подсунутом файле читала половину файла и тупо финишировала как будто вконец данных - так победить и не смог...
72. Slim33rus 27.03.10 10:19 Сейчас в теме
Спасибо wilghog! :D Очень помогла статья. Эксель из 12600 строк загружается за 10 сек. Раньше загружаллось за 8 мин. Большое спасибо. :D
73. sashs1980 71 24.06.11 12:51 Сейчас в теме
Этот способ несомненно быстрее, но не совсем корректен и следовательно не универсален. Дело в том, что при выполнение Данные = Область.Value.Выгрузить() текст преобразуется, например у меня был артикул 0000056789 и он преобразуется в 56 789. А при стандартном (универсальном)по ячеестым обходом нет, когда вытаскиваешь из ячейки .text
74. wildhog 460 20.07.11 16:29 Сейчас в теме
sashs1980 пишет:

Этот способ несомненно быстрее, но не совсем корректен и следовательно не универсален. Дело в том, что при выполнение Данные = Область.Value.Выгрузить() текст преобразуется, например у меня был артикул 0000056789 и он преобразуется в 56 789. А при стандартном (универсальном)по ячеестым обходом нет, когда вытаскиваешь из ячейки .text


Попробуй перед загрузкой создать колонки таблицы значений с указанием нужного типа. В этом случае при загрузке будет корректно выполнено приведение типов.
91. ram3 141 24.02.14 10:18 Сейчас в теме
(74)
приведение типов происходит еще при выгрузке в массив Данные = Область.Value.Выгрузить(), к моменту заполнения таблицы значений артикул 0000056789 уже принимает следующий вид 56 789.
Какие еще есть идеи? Способ очень хорош, но вышеописанный момент все портит...
92. wildhog 460 24.02.14 11:22 Сейчас в теме
(91) добрый день. Пришлите файл, посмотрю. + попробуйте перед чтением типизировать колонки тз.
93. ram3 141 24.02.14 12:49 Сейчас в теме
(92)
в том-то и дело, что до ТЗ не доходит, смотрю отладчиком массив Данные сразу после выгрузки в него области - там уже значения изменены...
Файл для примера: http://yadi.sk/d/21WzBuG5JSKpR
95. wildhog 460 25.02.14 09:10 Сейчас в теме
(93) По идее Область.Value берет именно ЗНАЧЕНИЯ ячеек, а не форматированные значения. В (94) все верно kiruha написал - проблемы в данных файла.
Поэтому, приводите в "нормальный" формат файл, а потом читайте.

В вашем случае, м.б рациональнее будет читать поячеечно - тогда сможете брать не значения ячеек, а их отформатированное значение. Проиграете в скорости, но выиграете в удобстве (не придется обрабатывать файл).
97. ram3 141 25.02.14 11:42 Сейчас в теме
(95)
так и сделал, читаю по старинке перебором ячеек. Жаль, но в данной реализации ваш метод далеко не универсален (предварительная обработка файла убивает все плюсы), хотя по скорости видимо лучший! Пойду на форум любителей экселя, может там что-то подскажут... В любом случае спасибо, идея отличная!
98. wildhog 460 25.02.14 12:05 Сейчас в теме
(97) Ну уж вы хотите и скорость и чтобы всякое повидло из файлов вытягивало. Удачи)

99. ram3 141 25.02.14 12:09 Сейчас в теме
(98)
к сожалению боевые условия не всегда приближены к идеальным: как правило файлики для загрузки мы не сами себе стряпаем.
94. kiruha 380 24.02.14 16:00 Сейчас в теме
(92)
Смотрю в вашем файле формат ячеек - то числовой (дополнительный), то числовой (все форматы), то общий (текстовой и числовой форматы, еще форматы)
Это ж ....
В принципе можно было бы отформатировать Область.NumberFormat="Text";
Но у Вас в ячейке визуально 00000141 - фактически в ячейке число 141, числовой формат дополнительный, греческий язык , тип "табельный номер" - который отображает 141 как 00000141 и далее аналогично
96. ram3 141 25.02.14 11:36 Сейчас в теме
(94) kiruha,
Но при всем при этом, ЛистЭксель.Cells(СчетчикСтрок,СчетчикКолонок).Text возвращает именно 00000141 а не 141, как вы предполагаете!
75. Stepan_1c 09.12.11 07:34 Сейчас в теме
Спасибо, коротко и ясно=)
76. capshow 07.09.12 09:32 Сейчас в теме
Спасибо за наВодку с методами Excel ) Всегда уважительно относился к емким и эффективным алгоритмам! Респект!
77. mikhailovaew 126 17.01.13 11:07 Сейчас в теме
Эх, вот такую бы штуку для 7.7! Пробовала переписать - спотыкается о строку
Данные = Область.Value.Выгрузить();
говорит - "Ожидается скалярное выражение (Данные)".
Кто-нибудь знает, как научить семерку жрать массивы?
78. redgoll 28.01.13 15:34 Сейчас в теме
Сама загрузка в Таблицу значений действительно проходит махом, за это большое спасибо. Только рано я обрадовался. При дальнейшей обработки данных, для получения ссылочных данных все равно тормозит и обрабатывает долго. Строк около 5 тыс. НЕ подскажите, как убыстрить процесс? Ничего особенного не делаю, в цикле по таблице ищу номенклатуру и единицы измерения к ней.
79. wildhog 460 28.01.13 16:38 Сейчас в теме
redgoll
Проблема в том, что используешь либо запрос либо НайтиПо... в цикле. Что очень медленно...
Помещай ТЗ во временную таблицу и ищи элементы запросом через левое/внутреннее соединение с ней.
Не забудь, что для временнной таблицы важно чтобы колонки ТЗ были типизированы.
80. redgoll 06.02.13 12:32 Сейчас в теме
Спасибо, за совет. Попробую воспользоваться вашим методом. Потом отпишусь о результатах и поблагодарю отдельно. Когда-то читал на данном ресурсе про метод загрузки данных не из Excel, а из табличного документа (mxl). Автор помнится очень хвалил его за быстродействие. Не пробовали на такие грабли наступать?
81. wildhog 460 06.02.13 13:27 Сейчас в теме
(80)
Не пробовал. Но, думаю, что если и будет прирост в скорости, то не очень большой. + преобразование в mxl занимает время. Так что, смысла не вижу... Попробуйте, вдруг сабжевый способ не самый быстрый )
84. wildhog 460 12.04.13 15:55 Сейчас в теме
(82) Если дадите свою компоненту - погоняю, проверим.
А что на выходе 1Совская ТЗ или что-то еще?
У любого способа есть плюсы и минусы. У моего - универсальность, независимость от ВК (права пользователей, регистрация и т.д). У вашего скорость.
86. wildhog 460 12.04.13 17:18 Сейчас в теме
(85) Eugeneer, не стал писать про деньги )) Для многих это существенный минус...
Надеюсь продажи Вашей обработки говорят об обратном ))
90. kiruha 380 24.02.14 10:00 Сейчас в теме
(82)
Здорово конечно, но приведенный автором статьи алгоритм + дополнение по записи от kadr полностью покрывает все проблемы - 0.4 сек на 80 000 ячеек.
В дальнейшем Вам стоит указывать и на это альтернативное решение
87. uri1978 126 24.05.13 12:36 Сейчас в теме
Отличный метод. Автору большой плюс!
Оставьте свое сообщение

См. также

Полезные процедуры и функции для программиста 160

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Практика программирования Универсальные функции

Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.

07.10.2019    11940    HostHost    23       

Очный семинар по регулярному менеджменту Александра Фридмана "Вы или Хаос", 12 декабря 2019 г. , Санкт-Петербург Промо

Семинар по регулярному менеджменту от Александра Фридмана для собственников, первых лиц и топов. Технология управленческого планирования, комплексного управления временем и другими ресурсами, выполнением поручений, делами, информацией, контактами (встречи-звонки-почта).

от 11000 до 29000 рублей

1С:Предприятие через Интернет. 1С:Fresh Промо

Ведение бухгалтерского и налогового учет, сдача отчетности, управление бизнесом из любой точки мира. Привычные программы «1С» через Интернет без приобретения коробочных программ.

Агрегатные функции СКД, о которых мало кто знает 356

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    15851    ids79    44       

Три костыля. Сказ про фокусы в коде 124

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    10702    YPermitin    69       

Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо

Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Предоставляем техподдержку по всем вопросам данного обмена. Можем подключиться к вам удаленно для разбора ситуаций. Оперативно обновляем при выходе новых релизов 1С. Бесплатные обновления в течение полугода.

19700 руб.

Отслеживание выполнения фонового задания 143

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    13107    ids79    16       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 262

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    18369    ids79    31       

Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.127.х! Промо

Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.

24700 руб.

Фоновое выполнение кода в 1С - это просто 124

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    12869    avalakh    21       

Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.10.х Промо

Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.

29700 руб.

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 141

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    16524    ids79    8       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 156

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    13731    ids79    27       

Перенос документов, остатков и справочников КА 1.1 => КА 2 / УТ 11. Обновлено до КА 2.4.10.х и УТ 11.4.10.х! Промо

Более 130 компаний выполнили переход на КА 2 или УТ 11 с помощью нашей разработки! Позволяет перенести не только остатки и справочники (как типовая обработка), но и документы за нужный период времени. Предоставляем техподдержку, оперативно исправляем замечания, выпускаем обновления при выходе новых релизов программ 1С. Вы можете проверить разработку до покупки: сделаем бесплатный тестовый перенос из вашей базы КА 1.1 и предоставим доступ к базе-результату через веб-клиент!

29700 руб.

Регистры сведений. За кулисами 129

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    10968    YPermitin    12       

"Меньше копипаста!", или как Вася универсальную процедуру писал 183

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    9818    SeiOkami    49       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Создание отчетов с помощью СКД - основные понятия и элементы 217

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    24005    ids79    17       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 179

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    13675    dmurk    134       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Регистры накопления. Структура хранения в базе данных 178

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    21488    YPermitin    27       

Выполнение внешней обработки в фоновом задании 149

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    13408    Eret1k    23       

Вакансия Автор новостных обзоров на тему 1С и бухучета, По совместительству Промо

Редакция Infostart.ru будет рада сотрудничеству с 1С-специалистом, умеющим и любящим излагать свои мысли в письменной форме. Если вы работали в IT-изданиях или имеете опыт ведения технологического блога/канала/группы, если сможете сделать обзор обработок из каталога infostart.ru/public/all/, то у вас большое преимущество.

Выгрузка документа по условию 5

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    7735    m-rv    2       

Преобразование EXCEL в таблицу значений без COM и других извращений 213

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Загрузка и выгрузка в Excel

Получение таблицы значений из excel в 1С v8, без COM, внешних источников данных и т.д. EXCELВТаблицуЗначений() - За 10 строчек кода! Реализация протестирована на 1С 8.3.12.1714 (x64).

18.04.2019    14683    9    Eret1k    43       

1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо

СПАРК помогает предотвратить мошенничество со стороны компаний и предпринимателей, благодаря актуальным сведениям о компаниях и системе выявления факторов риска.Сервис позволяет управлять налоговыми рисками и комплексно оценивать благонадежность контрагентов.

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    10227    m-rv    16       

С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо

Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.

О расширениях замолвите слово... 195

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    18955    ellavs    125       

Git-репозитории для 1С-кода (опыт использования при небольших проектах) 202

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    15461    ellavs    83       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Трюки с внешними источниками данных 167

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    16364    YPermitin    53       

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 173

Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    19384    ids79    9