Скорость закачки с 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

См. также

SALE! 10%

Загрузка номенклатуры из 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 9504 руб.

29.10.2014    210180    620    524    

439

Загрузка номенклатуры 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 форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 11.12.2023, версия 9.5 - 9.9)

13200 руб.

20.11.2015    150726    367    375    

501

Маркетплейсный загрузчик для 12-ти маркетплейсов в "БП 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    31894    226    63    

117

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    214930    925    886    

939

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

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

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

4800 руб.

07.06.2022    15080    79    0    

60

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    101380    296    173    

312
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. flyDrag 290 09.06.15 14:17 Сейчас в теме
Было бы хорошо увидеть этот пример в готовой обработке
32. Dmitry888 38 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 4709 09.06.15 17:17 Сейчас в теме
Батенька, ну вы уж поиском-то и правда, воспользуйтесь... А ещё про обмен через COMSafeArray и ADO почитайте)
13. Идальго 226 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. Идальго 226 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 сек
тут рассовывается по документам и справочникам долго... сейчас с этим разберусь тоже
19. rus128 2 10.06.15 14:37 Сейчас в теме
Все понимаю.
Не понимаю только, почему "закачка", а не "загрузка" или (еще лучше) "импорт".
21. cool.vlad4 2 12.06.15 16:10 Сейчас в теме
Могу еще и изменение существующего файла быстрое подсказать как делать, то что можно через ADO это и так понятно, но зачастую была проблема считать значения из файла с формулами и потом туда что-нибудь записать и т.п. можно сформировать ТЗ (или любой другой набор данных), выгрузить в другой excel файл средствами платформы, потом считать этот второй файл через ADO в Recordset и выгрузить в нужную область в нужный файл Excel через CopyFromRecordset. Самое смешное , что все эти записи в файлы, считывание на порядок быстрее чем запись значений через Excel.Application
22. Serg O. 224 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
Оставьте свое сообщение