Скорость закачки с EXCEL при работе с большими файлами

09.06.15

База данных - HighLoad оптимизация

Поставлена задача уменьшить время загрузки данных с EXCEL. Пока ждал ответа от разработчиков ядра, сам начал копать всё, что угодно.
ЗАДАЧА решена, с чем спешу поделиться.

1. Файл должен быть закачан в МАССИВ весь сразу!!!!!! У меня 27000 строк за 0,1-0,5 сек. СОМ-объект можно сразу отключить(закрыть). Замечание: метод VALUE отрабатывает в 5 раз быстрее, чем TEXT, ввиду того, что не преобразует значение в текст;

 

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

2. Если его необходимо загрузить в ТабличныйДокумент, то загрузку можно сделать или по строкам, или по колонкам. По времени загрузки строки или колонки грузятся почти одинаково, но строк больше же. Так вот надо грузить по тому, что меньше. У меня колонок 20, а строк 27000. В итоге, приблизительно в 100 раз быстрее загрузился в ТабличныйДокумент при использовании метода "по колонкам" (строка первая). А можно и не грузить в ТД, не тратить время, а начать обрабатывать сразу МАССИВ.

Выше написанное значит, что распространенный в инете пример работы с EXCEL с перебором каждой ячейки работает намного медленнее, чем вышеописанный. Постараюсь выложить на Инфостарт решение

Для Column = КолонкаС По КолонкаПО Цикл   
   Для Row = СтрокаС По СтрокаПО Цикл    
        ТД.Область("R" + Формат(Row, "ЧГ=")+"C" + Формат(Column, "ЧГ=")).Текст = Данные[Column-1][Row-1];   
   КонецЦикла;  
КонецЦикла;
 
 

Если такой метод не совсем корректный - напишите, плиз. Может, есть и еще более быстрый, к примеру, не понятный пока для меня метод, используемый в ядре 1С без использования СОМ-объектов вообще: ФАЙЛ/ОТКРЫТЬ/*.XLS*

EXCEL

См. также

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    211183    630    526    

446

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 09.04.2024, версия 9.9 - 9.10)

14400 руб.

20.11.2015    151396    366    376    

502

Маркетплейсный загрузчик для 12-ти маркетплейсов в 1С:БП 3, УТ 11, КА 2, ERP, УНФ

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы сделаете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, "Детский мир", Казань-Экспресс, "Леруа Мерлен", ЭНФАНТА (Акушерство), ЛаМода, Летуаль, "Твой дом" в документы "Отчет комиссионера (агента) о продажах" и другие, может работать в "Бухгалтерия 3", "Бухгалтерия 3 КОРП", УТ 11, УНФ, КА 2, ERP. Возможность подключить любые маркетплейсы. Анализ продаж ОЗОН. 30 дней БЕСПЛАТНОГО пользования!

1800 руб.

12.08.2021    32302    242    64    

122

SALE! 30%

Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания ЛЮБЫХ СКАНОВ ИЛИ ФОТО ТОВАРНЫХ ДОКУМЕНТОВ в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

6000 5520 руб.

04.06.2019    101836    300    173    

314

SALE! 20%

Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы

Загрузка и выгрузка в Excel Оптовая торговля Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

5000 4000 руб.

09.11.2016    215867    932    886    

942

Загрузка данных отчета о реализации товаров из Excel файла СберМегаМаркет

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса СберМегаМаркет для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11 и Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

4800 руб.

07.06.2022    15378    82    0    

63
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. flyDrag 291 09.06.15 14:17 Сейчас в теме
Было бы хорошо увидеть этот пример в готовой обработке
+
32. Dmitry888 41 28.08.20 17:32 Сейчас в теме
(1)получилось получить обработку?
+
2. Samarin 96 09.06.15 14:38 Сейчас в теме
1. Есть новая фишка в платформе 8.3.6. Попробуйте ее посмотреть.

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\My Documents\Таблица1.mxl");

Описание:
Считывает табличный документ из файла.
Позволяет считывать табличный документ из файла табличного документа Microsoft Excel 97 - 2010 ( *.xls и *.xlsx) или электронной таблицы OpenOffice Calc ( *.ods).

2. Посмотреть и попробовать применить многопоточную обработку:
http://infostart.ru/public/306865/

Если изыскания будут успешны - с меня плюс, лайк или что тут раздают))
+
5. ybatiaev 58 09.06.15 16:02 Сейчас в теме
(2) Samarin, Этот метод (ТД.Прочитать()) и ранее был и в старых версиях, Но он работает только в толстом клиенте. А у всех сейчас уже тонкие
+
9. Samarin 96 09.06.15 16:38 Сейчас в теме
(5) Во-первых, в изменениях к 8.3.6 по данному поводу написано ясно, что в предыдущих версиях подобной возможности не было. Во-вторых, правильная работа в клиент-серверном режиме и через веб-клиент подразумевает правильный подход к работе с файлами: получение файлов осуществляется на клиентской части, далее данные передаются на сервер, обработка данных производится на серверной стороне.
ybatiaev; +1
8. ybatiaev 58 09.06.15 16:20 Сейчас в теме
(2) Samarin, Про потоки ИНТЕРЕСНО. Мне это еще со старых времен работы с С++ известно было... почитаю!!! Спасибо!
+
20. cool.vlad4 2 12.06.15 16:04 Сейчас в теме
(2) Samarin, да, только этой штукой пользоваться пока нельзя. выбора листа нет, при чтении больших файлов (свыше 50000 строк) все падает и ничего не читает
+
3. alonehobo 09.06.15 14:42 Сейчас в теме
ТД.Область("R" + Формат(Row, "ЧГ=")+"C" + Формат(Column, "ЧГ=")).Текст = Данные[Column-1][Row-1];

Можно просто использовать числа для указания адреса ячейки, без лишнего форматирования:
ТД.Область(Row, Column).Текст = Данные[Column-1][Row-1];
+
6. ybatiaev 58 09.06.15 16:09 Сейчас в теме
(3) alonehobo, это был тестовый пример... спешил поделиться
А функция ФОРМАТ() у меня использовалась для считывания значения ячеек, а некоторые ячейки имели число с разделителями триад пробелом.
Раньше использовал метод не VALUE (это работает так, как надо) , а TEXT, а он преобразовывал число 1 333 в строку "1 333". Ну далее Вы понимаете...

ну вот на старых обработках и экспериментировал... забыл убрать это убожество :-)))
+
4. webester 26 09.06.15 16:00 Сейчас в теме
Неудобно прерывать вашу радость от найденного решения, но... <Зануда MODE> поиском пользоваться не пробовали?</Зануда MODE>
http://infostart.ru/public/20090/ с достаточно бурными обсуждением, замерами и сравнениями в комментариях.
artfa; fvadim; ram3; qwinter; +4
7. ybatiaev 58 09.06.15 16:16 Сейчас в теме
(4) webester,
спасибо за замечание, по ссылкам я "ходил" ... но вот не нашел того, что записывать в ТД быстрее оказалось по колонкам (первый цикл), а потом по строкам (цикл внутри). Если поменять это, т.е. сначала взять строку и разобрать её по колонкам, потом другую... работает на файлах с большим количеством записей намного дольше. ЭТОГО НЕ НАШЕЛ. С чем и поделился. Ну может всего прочитать невозможно или промелькнуло мимо за ненадобностью тогда.
+
11. qwinter 671 09.06.15 16:53 Сейчас в теме
(7)
но вот не нашел того, что записывать в ТД быстрее оказалось по колонкам (первый цикл), а потом по строкам (цикл внутри).
а построителем или СКД еще быстрее))
ybatiaev; +1
16. wbazil 138 10.06.15 08:26 Сейчас в теме
довольно давно пользуюсь функцией

// Функция читает лист их xls файла и загружает содержимое в таблицу значений
Функция ПолучитьТаблЗначИзЛистаXLS(ТаблЗнач = Неопределено, прИмяКолонки = "Колонка", ИмяФайла, прНомерЛистаExcel = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт

	Если ТаблЗнач = Неопределено Тогда
		ТаблЗнач =  Новый ТаблицаЗначений;
	КонецЕсли;

	
	Если ЛистЭксель = Неопределено Тогда
		Попытка
			Excel = Новый COMОбъект("Excel.Application");
		Исключение
			Сообщить("Не удалось подключиться к MS Excel");
			Возврат ТаблЗнач;
		КонецПопытки;
		Попытка
			Состояние("Обработка файла Microsoft Excel...");
			Excel.DisplayAlerts = 0;
			Excel.WorkBooks.Open(ИмяФайла);
		Исключение
			Сообщить("Не удалось прочитать файл (" + ОписаниеОшибки() + ")");
			Возврат ТаблЗнач;
		КонецПопытки;
		лпСписокЛистов = Новый СписокЗначений;
		Попытка
			Если прНомерЛистаExcel = Неопределено Тогда
				лпКоличествоЛистов = Excel.Sheets.Count;
				Если лпКоличествоЛистов = 0 Тогда
					Сообщить("Пусто");
					Возврат ТаблЗнач;
				КонецЕсли;
				Если лпКоличествоЛистов > 1 Тогда
					лпСписокВыбор = Новый СписокЗначений;
					лпСписокВыбор.Добавить("all", "Все листы");
					Для лпНомерЛиста = 1 По лпКоличествоЛистов Цикл
						лпЛист = Excel.Sheets(лпНомерЛиста);	
						лпСписокВыбор.Добавить(лпНомерЛиста, СокрЛП(лпЛист.Name));
					КонецЦикла;
					лпВыбор = лпСписокВыбор.ВыбратьЭлемент("Выбор листа");
					Если лпВыбор = Неопределено Тогда
						Сообщить("Не выбран лист!");
						Возврат ТаблЗнач;
					КонецЕсли;
					лпВыбран = лпВыбор.Значение;
					Если лпВыбран = "all" Тогда
						лпСписокЛистов = лпСписокВыбор.Скопировать();
					Иначе	
						лпСписокЛистов.Добавить(лпВыбран);
					КонецЕсли;
					//НомерЛистаExcel = ;	
				Иначе	
					//НомерЛистаExcel = лпКоличествоЛистов;
					лпСписокЛистов.Добавить(лпКоличествоЛистов);
				КонецЕсли;
			Иначе
				//НомерЛистаExcel = прНомерЛистаExcel;
				лпСписокЛистов.Добавить(прНомерЛистаExcel);
			КонецЕсли;
			
		Исключение
			Сообщить("Не удалось прочитать листы (" + ОписаниеОшибки() + ")");
			Возврат ТаблЗнач;
		КонецПопытки;
	КонецЕсли;
	
	лпСписокВозв = Новый СписокЗначений;
	
	Для каждого лпЭлемент Из лпСписокЛистов Цикл
		НомерЛистаExcel = лпЭлемент.Значение;
		Если НомерЛистаExcel = "all" Тогда
        	Продолжить;
		КонецЕсли;
		ТаблЗнач =  Новый ТаблицаЗначений;
		Попытка
			Состояние("Установка текущего листа...");
			ЛистЭксель = Excel.Sheets(НомерЛистаExcel);
		Исключение
			Сообщить("Не удалось установить текущий лист (" + ОписаниеОшибки() + ")");
			Возврат ТаблЗнач;
		КонецПопытки;
		
		//Range	= ЛистЭксель.UsedRange;
		Если ВсегоСтрок = 0 Тогда
			ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
			//ВсегоСтрок = Range.Rows.Count;
		КонецЕсли;
		
		Если ВсегоКолонок = 0 Тогда
			ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
			//ВсегоКолонок = Range.Columns.Count;  ЛистЭксель.UsedRange.Columns.Count
		КонецЕсли;
		
		Для Счетчик = 1 По ВсегоКолонок Цикл
			ТаблЗнач.Колонки.Добавить(прИмяКолонки+Счетчик, Новый ОписаниеТипов("Строка"));
		КонецЦикла;
		
		Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
			НоваяСтрока = ТаблЗнач.Добавить();
			Состояние("Запись пустых строк:" + Счетчик);
		КонецЦикла;
		
		Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
		Данные = Область.Value.Выгрузить();
		
		Для Счетчик = 0 По ВсегоКолонок - 1 Цикл
			ТаблЗнач.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
			Состояние("Загружена колонка :" + Счетчик);
		КонецЦикла;	
		
		ЛистЭксель = Неопределено;
	
		лпСписокВозв.Добавить(ТаблЗнач, НомерЛистаExcel);	
		//Сообщить("Лист: " + СокрЛП(лпЭлемент.Представление) + " строк: " + СокрЛП(ТаблЗнач.Количество()));
		ВсегоСтрок = 0;
		ВсегоКолонок = 0;
	КонецЦикла;
	
    Excel.WorkBooks.Close();
    Excel = 0;

	Возврат лпСписокВозв;

КонецФункции
Показать
+
24. ybatiaev 58 24.08.15 15:44 Сейчас в теме
(11) qwinter, Добрый день!
сделал чтение файла 1-8 сек
первичную обработку более имения приемлемую - 53000 строк за 8 минут, в ней поиск/создание контрагентов. договоров, номенклатуры и т.п.

Не подскажите ли чукче-писателю как убыстрить создание документов. По замерам производительности именно тут ТОРМОЗА. Фоновые задания не подходят, т.к. конфигурацию вскрывать нельзя. Асинхронные вызовы копаю сейчас.
Хоть в каком направлении копать? Количество документов в структуре файла до 24000, количество обрабатываемых строк файла до 60000. Основные тормоза в месте НовыйДокумент.Записать()

Буду очень признателен
+
10. qwinter 671 09.06.15 16:48 Сейчас в теме
(4) webester, ну так чукча не читатель, чукча писатель © )))))
ybatiaev; +1
12. Yashazz 4723 09.06.15 17:17 Сейчас в теме
Батенька, ну вы уж поиском-то и правда, воспользуйтесь... А ещё про обмен через COMSafeArray и ADO почитайте)
+
13. Идальго 228 09.06.15 17:49 Сейчас в теме
27000 строк это вроде совсем немного (скорее это очень мало). Странно, что у вас оно слишком долго читает.
+
23. ybatiaev 58 21.08.15 15:12 Сейчас в теме
(13) Идальго, Добрый день!
Если не тяжело - напишите ГДЕ почитать про скорость закачки большого числа строк для документов.
Вот, к примеру? в файле присутствует 5500 документов (в ~53000 строках в EXCEL)
Сделал следующее:
1. Чтение из файла в массив ДАННЫХ с определением границ и промежуточных данных, потом отключаю СОМ с EXCEL;
---------- 8 секунд ------------------------------------- ОК!
2. Работаю уже с массивом ДАННЫХ;
3. Проверяю/создаю номенклатуру, причем записываю в массивы данные по ней (мНоменклТХТ - текстовое представление номенклатуры, мНоменклСсылка - ссылку на номенклатуру). При обработке новой строки ищу в массиве подобную номенклатуру (нашел индекс элемента) и с другого массива вытаскиваю по индексу значение(ссылка) и её уже подставляю в дополнительную ячейку в массив ДАННЫЕ (т.е. не дергаю саму базу, если ссылка на номенклатуру была "запомнена" ранее, подобие "КЭШа");
4. Параллельно создаю записи в ТЧ обработки со списком документов(несколько строк файла - это один документ, другие - другой и т.д.). Тут же проверяю/создаю КОНТРАГЕНТА и ДОГОВОР. Механизм как в 3 пункте ("КЭШ");
5. Также определяю СтавкуНДС;
6. В итоге получаю массив ДАННЫХ со списком документов с УЖЕ созданными и приготовленными КОНТРАГЕНТАМИ, ДОГОВОРАМИ, НОМЕНКЛАТУРОЙ, СТАВКОЙ НДС (ссылки для подстановки в документ);
---------- 1590 сек (27 минут) ----------------- нуууу... приемлемо... ОК!
7. Теперь я просто пытаюсь создать сами документы - вот тут то и большая проблема, точнее большие тормоза. Т.е. есть всё, что надо, все найдено или создано. И я могу все проверить и подправить, если что. Но документы создавались 17(!) часов. Не могу пока понять ПОЧЕМУ.
---------- 17 часов ---------- КОНКРЕТНО НЕ ОК :-( -------------------------
ну да, по сравнению с предыдущей обработкой, которая создает ЭТО за 2,5 суток(60 часов) - это решение, но все же. В среднем на создание одного документа в связке с одной Сч-ф потрачено 12(!) секунд. И это не на рабочей базе, там будет в 2 раза дольше.

Если есть что подсказать - киньте ссылку на то, где и что почитать. Поругайте меня, если что не знаю, но помогите!
+
25. Идальго 228 24.08.15 20:40 Сейчас в теме
(23) я не знаю где вам почитать, но, думаю, что на инфостарте много информации. Как я понял, собственно чтение достаточно быстро идёт, по крайней мере вас устраивает... Замечу лишь, что при создании и записи новых объектов, я бы использовал транзакции, а также ссылку нового. Ну и проверок всяких поменьше делал (т.е. работать должны только нужные), если они есть (при записи и/или проведении).

По поводу документов - наверное нужно выяснить, что конкретно занимает больше всего времени и оптимизировать процедуры. Т.е. смотреть и замерять в отладчике (в первую очередь), а так же использовать технологический журнал (тоже смотреть счетчики всякие) и SQL Profiler.

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


Как идею, можете рассмотреть вариант загрузки в несколько потоков. Т.е., можно файл разбить на части и в нескольких сеансах его обрабатывать, если конечно это возможно.
+
26. ybatiaev 58 25.08.15 13:14 Сейчас в теме
(25) Идальго, добрый день!
именно потоками и начал вчера заниматься. Вообще обнаружил, что именно НовыйДокумент.Записать() и тратит время самое большее, в 20-100 раз большее, чем всё остальное. Про подписки - поразбираюсь, но не думаю. Подписки на создание документов по моему не работают.
Про многопоточность - в МАНах написано, что текст обработки должен быть в общем модуле, а конфигурация закрытая. Сейчас сделал убыстрение ОБЩЕЕ в 5 раз. Доделаю и покопаюсь с многопоточностью. Я бы разбил на 2 потока минимум - создание Документа(Реализация, Поступление, ПКО или вписка) в одном, а счет-фактуры в другом (после создания самого документа)... но не получилось пока, а так еще бы время уменьшилась бы в 2 раза максимум.
Сегодня гляну в планы обмена.... может там что-то по новым объектам пишется дополнительно

а по поводу проверок:
так я и разбил на 2 этапа: 1 - это закачка, все проверки и поиск/создание всех объектов. В итоге у меня получается таблица со всеми УЖЕ НУЖНЫМИ ссылками, перечислениями и данными.
и 2 этап - это создание НовыхДокументов на основании этой таблицы (пока в этом траблзы)
1-й этап - общее время на ~25000 записей от 3,5 до 27 минут, что принципе нормально
2-й этап - более 17 часов (со старой обработкой было около 60 часов)

еще заметил, что в замерах производительности когда в накопленных вызовах менее 24000, то обрабатываются быстро(5-7 вызовов в секунду), а дальше 2 в секунду... Что-то накапливается и переполняется в КЭШе что-ли.... копаюсь еще
+
14. LavinVladik 214 10.06.15 03:51 Сейчас в теме
вот готовое решение на v7, прикуруть к 8-ке не стоставит большого труда
http://infostart.ru/public/329372/
+
15. qwinter 671 10.06.15 08:23 Сейчас в теме
(14) LavinVadik, на восьмерке давно есть в разы более универсальные.
+
17. ybatiaev 58 10.06.15 12:40 Сейчас в теме
(15) qwinter, Дайте ссылку плиз. Читает да, теперь быстро. 27000 строк по 30 колонок - 0,1 сек
тут рассовывается по документам и справочникам долго... сейчас с этим разберусь тоже
+
18. qwinter 671 10.06.15 12:55 Сейчас в теме
19. rus128 2 10.06.15 14:37 Сейчас в теме
Все понимаю.
Не понимаю только, почему "закачка", а не "загрузка" или (еще лучше) "импорт".
kote; +1
21. cool.vlad4 2 12.06.15 16:10 Сейчас в теме
Могу еще и изменение существующего файла быстрое подсказать как делать, то что можно через ADO это и так понятно, но зачастую была проблема считать значения из файла с формулами и потом туда что-нибудь записать и т.п. можно сформировать ТЗ (или любой другой набор данных), выгрузить в другой excel файл средствами платформы, потом считать этот второй файл через ADO в Recordset и выгрузить в нужную область в нужный файл Excel через CopyFromRecordset. Самое смешное , что все эти записи в файлы, считывание на порядок быстрее чем запись значений через Excel.Application
+
22. Serg O. 225 16.06.15 09:26 Сейчас в теме
здорово, что нашел такую функцию....

но ускорение только на 1/2 так делается
скорость "разбора" строк - тоже иногда очень долго идет...

самый быстрый способ чтения из Excel это программный COPY-PAST
c использованием WScript.Shell
"посылкой" команды Ctrl+C (на выделенный диапазон ячеек Excel)
и Ctrl+V в таблицу 1С (лучше в ТабличныйДокумент)
WSHShell.SendKeys("^c") WSHShell.SendKeys("^v")
см. http://forum.infostart.ru/forum26/topic75936/

дополнительные команды управления книгой Excel из 1C см. http://www.1c-h.ru/?p=238
+
27. user970630 29.10.18 15:00 Сейчас в теме
Спасибо. Ёмко и по делу.
+
28. ybatiaev 58 02.11.18 19:32 Сейчас в теме
(27) Если это не сарказм, то ещё хочу поделиться опытом. В один документ не более 10000 записей нужно записывать в табличную часть. Иначе будут жуткие тормоза. У меня, при ёмких закачках быстрее было создать 6 документов по ~10000 записей, чем один с 60000.
+
29. user970630 06.11.18 08:12 Сейчас в теме
(28)
Интересно. Спасибо. Получается с большим массивом работать дольше чем с одинаковым количеством строк разбитых на несколько файлов... Интересно а многопоточность есть? Как будет быстрее?

Еще интересно какой результат будет если файл меньше, например 1000 строк. Уместно его делить и, если да, то на сколько частей.
+
30. ybatiaev 58 06.11.18 12:22 Сейчас в теме
(29) Пробовал. Если документ должен содержать ~10000 строк и меньше, то быстрее закачать одним разом.
С многопоточностью выгодно работать, если в файле 100 000 строк, но это записывается в 20 документов, то:
1. будет время на общий разбор и подготовку массива итоговых документов;
2. начать запись сразу всех 20 документов. Кто-то писал на инфостарте, что не более 10 потоков, не проверял;
3. Многопоточность работает в клиент-серверном варианте. В файловом только один. Хотя может сразу не разобрался корректно или сейчас что-то изменилось что-то.

Если Вы пишите в лог всё, что делается, то Вам необходимо предусмотреть УПРАВЛЯЕМЫЕ блокировки файла логов. Иначе будет просто вылет с места, в котором Вы пытаетесь записать что-то, если файл занят другим потоком.
+
31. user970630 06.11.18 12:29 Сейчас в теме
(30)
Это уже как-то сложнее ) Много условий надо обработать.

Я грузил несколько раз файлы, но не очень большие. Хотя все относительно... Самый большой был в 1500 строк и и где-то 20+ столбцов. Причем клиент хотел чтобы все было у него на старом компе (в смысле работа проходил). Просидел у него почти целый день, пока сделали как он хотел...

Поэтому и интересуюсь увеличением скорости загрузки. Еще раз спасибо. В следующий раз буду пробовать Ваш метод.
+
33. ybatiaev 58 22.09.20 12:58 Сейчас в теме
На собеседовании попросили сделать смешную простую задачку. Каюсь, "тупанул не по детски" )))). Часть функций не вспомнил.
Делюсь простым решением, может кому пригодиться.
Условия(самое главное):
1. Клиент без EXCEL(это уже как правило сейчас);
2. Никто не запрещает трафик на сервер (раньше был ЗАПРЕЩЁН(!) трафик на сервер без необходимости в любых тестах).

&НаСервереБезКонтекста
Функция ПолучитьВерсиюБСП()
	Возврат СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
КонецФункции
	
&НаКлиенте
Процедура Загрузить(Команда)
	Попытка
		Версия = ПолучитьВерсиюБСП();
		
		// БСП можно оценить версию
		ПараметрыДиалога = Новый Структура;
		ПараметрыДиалога.Вставить("Заголовок", НСтр("ru = 'Выберите файл XLSX'"));
		ПараметрыДиалога.Вставить("Фильтр", НСтр("ru='Файл XML (*.XLSX)|*.XLSX'"));

		Оповещение = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершениеБСП", ЭтотОбъект);
		ОбменДаннымиКлиент.ВыбратьИПередатьФайлНаСервер(Оповещение, ПараметрыДиалога, УникальныйИдентификатор);
	Исключение
		// без БСП
		// Описание процедуры, которая будет вызвана после закрытия окна выбора файла
		ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект);
		// Описание диалога выбора файла
		Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
		Диалог.Заголовок ="Выбитите файл";
		Диалог.МножественныйВыбор=Ложь;
		Диалог.Фильтр = "Файл XLS (*.xlsx)|*.xlsx";//НСтр("ru=’Файл XLS (*.xlsx)|*.xlsx'");
		// Начало помещение файла из файловой системы во временное хранилище
		НачатьПомещениеФайла(ОписаниеОповещения, , Диалог, Истина, УникальныйИдентификатор);
	КонецПОпытки;
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьФайлЗавершениеБСП(Знач РезультатПомещенияФайлов, Знач ДополнительныеПараметры) Экспорт
	Адрес = РезультатПомещенияФайлов.Хранение;
	ТекстОшибки = РезультатПомещенияФайлов.ОписаниеОшибки;
	ИмяВыбранногоФайла = РезультатПомещенияФайлов.Имя;

	Если ПустаяСтрока(ТекстОшибки) И ПустаяСтрока(Адрес) Тогда
		ТекстОшибки = НСтр("ru = 'Ошибка передачи файла на сервер'");
	КонецЕсли;

	Если НЕ ПустаяСтрока(ТекстОшибки) Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
		Возврат;
	КонецЕсли;
	ВыполнитьЗагрузкуНаСервере(Адрес);
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Результат Тогда
		// Файл выбран
		ВыполнитьЗагрузкуНаСервере(Адрес);
	Иначе
		// Пользователь отказался от выбора файла
		Сообщить("Файл не был выбран");
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(Адрес)
	// Получение данных из временного хранилища
	Данные = ПолучитьИзВременногоХранилища(Адрес);
	// Получение имени временного файла
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	// Сохранение данных во временный файл
	Данные.Записать(ИмяВременногоФайла);
	// Тело - Табличный документ на форме
	Тело.Прочитать(ИмяВременногоФайла);
	// Обработка файла…
	// Хорошим тоном будет удалить временный файл
	Попытка
		УдалитьФайлы(ИмяВременногоФайла);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры
Показать
Прикрепленные файлы:
ОбработкаЗагрузкиXLSбезEXCEL.epf
+
Оставьте свое сообщение