Приемы эффективной загрузки данных из Excel в 1С

13.12.17

Интеграция - Загрузка и выгрузка в Excel

Показаны приемы эффективной работы с Excel для загрузки данных в 1С.

Скачать файлы

Наименование Файл Версия Размер
Приемы эффективной загрузки данных из Excel в 1С:
.epf 7,15Kb
212
.epf 1.0 7,15Kb 212 Скачать

В публикации показаны приемы по загрузке данных из файла Excel в таблицу значений..

Протестировано на версии платформы 1С:Предприятие 8.3 (8.3.9.1818).

В версии 8.3 для загрузки из Excel существует альтернатива COM объекту. У табличного документа есть метод Прочитать.

Особенно актуально для файлов больших объемов, т.к. табличный документ обрабатывается гораздо быстрее.

А табличный документ легко трансформируется в таблицу значений через построитель запроса.

Во вложении обработка - пример загрузки и вывода в табличный документ и таблицу значений.

Рабочий код занимает несколько строк:

//Вывод в табличный документ

   ТабличныйДокумент = Новый ТабличныйДокумент;

   ТабличныйДокумент.Прочитать(Файл, СпособЧтенияЗначенийТабличногоДокумента.Значение);

//вывод в таблицу значений

   ПЗ = Новый ПостроительЗапроса;

   ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

   ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

   ПЗ.ЗаполнитьНастройки();

   ПЗ.Выполнить();

   ТаблицаЗначений = ПЗ.Результат.Выгрузить();

P.S. При выводе в таблицу значений через построитель запроса, названия колонок в источнике данных должны быть первой строкой, иначе построитель не сможет получить и преобразовать их в колонки таблицы значений и выдаст ошибку.

Во внешней обработке демонстрация загрузки.

Обмен загрузка 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    209832    620    524    

438

Загрузка номенклатуры 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    150387    365    375    

499

Распознавание и загрузка сканов в 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С и нажимаете кнопку "Распознать и загрузить".

5400 руб.

04.06.2019    101140    296    173    

312

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

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

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

3600 руб.

07.06.2022    14956    78    0    

59

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

09.11.2016    214616    921    886    

938

Универсальная загрузка остатков и цен поставщиков в 1С (УТ 11, КА 2, ERP 2.0) из файлов Excel, CSV, XML (YML и CML)

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

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

12000 руб.

23.01.2017    58796    59    48    

67
Отзывы
44. ImHunter 312 17.04.18 09:25 Сейчас в теме
(0) (38) Разбивка по листам, похоже, не раскрыта?
Недавно тоже вот перешел на этот способ с ADO.
Разбивать по листам, в принципе, несложно. В загруженном ТабДоке присутствует несколько областей с названиями листов.

В итоге, получилось вот так:

///////////////////////////////////
// Работа с Excel через ТабДок

// Функция - Прочитать excel
//
// Параметры:
//  ФайлExcel - Файл, Строка	 - Объект Файл или полное имя файла.
//  ФункцияОбработкиСтрок	 - Строка, Неопределено	 - Шаблон выражения для обработки строковых значений ячеек. 
//	В шаблоне производится подстановка - вместо символа ? будет подставляться обрабатываемое значение строки.
//	Если передать Неопределено или пустую строку, то обработка производиться не будет.
//  МаксШирина				 - Число - Максимальное кол-во колонок, просматриваемых при усечении таблицы по ширине.
//  ОграничиватьСверху		 - Булево - Убирать пустые строки сверху
//  ОграничиватьСлева		 - Булево - Убирать пустые строки слева
//  ОграничиватьСнизу		 - Булево - Убирать пустые строки снизу
//  ОграничиватьСправа		 - Булево - Убирать пустые строки справа
// 
// Возвращаемое значение:
//  СписокЗначений - Список значений содержимого. Элементы списка в поле Значение содержат ячейки листа (объект ОбластьЯчеекТабличногоДокумента), в поле Представление - имя листа
//
Функция ПрочитатьExcel(ФайлExcel, ФункцияОбработкиСтрок = "СокрЛП(?)",
		ОграничиватьСверху = Истина, ОграничиватьСлева = Истина, ОграничиватьСнизу = Истина, ОграничиватьСправа = Истина) Экспорт 
	
	Ф = НовыйФайл(ФайлExcel);
	ВесьТабДок = Новый ТабличныйДокумент();
	ВесьТабДок.Прочитать(Ф.ПолноеИмя, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	
	Результат = Новый СписокЗначений;
	Области = ВесьТабДок.Области;
	Если Области.Количество()=0 Тогда 
		ВызватьИсключение("В файле нет областей");
	КонецЕсли;
	
	Для Каждого Обл Из Области Цикл
		ТекТабДок = Новый ТабличныйДокумент;
		ОгрОбласть = ПолучитьОграниченнуюОбласть(ВесьТабДок, Обл);
		// вставим область в табдок
		ОгрОбласть.Имя = Обл.Имя;
		ТекТабДок.ВставитьОбласть(ОгрОбласть, 
			ТекТабДок.Область(1, ОгрОбласть.Лево, ОгрОбласть.Низ - ОгрОбласть.Верх + 1, ОгрОбласть.Право)
		);
		СократитьСтроки(ТекТабДок, ФункцияОбработкиСтрок);
		Результат.Добавить(ТекТабДок, Обл.Имя);
	КонецЦикла;
	// зачищаем исходный таб док. хз, может лишнее
	ВесьТабДок.Очистить();
	ВесьТабДок = Неопределено;
	
	Возврат Результат;
	
КонецФункции

Процедура СократитьСтроки(ТабДок, ФункцияОбработкиСтрок = "СокрЛП(?)")
	
	Если ПустаяСтрока(ФункцияОбработкиСтрок) Тогда 
		Возврат;
	КонецЕсли;
	
	Если Ложь Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли; // фейк
	
	Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл 
		Для Кол = 1 По ТабДок.ШиринаСтраницы Цикл 
			ТекОбласть = ТабДок.Область(Стр, Кол);
			ТекстОбласти = ТекОбласть.Текст;
			Если Не ТекОбласть.СодержитЗначение И Не ПустаяСтрока(ТекОбласть.Текст)	Тогда 
				Выражение = СтрЗаменить(ФункцияОбработкиСтрок, "?", "ТекстОбласти");
				ТекОбласть.Текст = Вычислить(Выражение);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

Функция ПолучитьОграниченнуюОбласть(ТабДок, ОбластьЯчеек,
	ОграничиватьСверху = Истина, ОграничиватьСлева = Истина, ОграничиватьСнизу = Истина, ОграничиватьСправа = Истина)
	
	Если Не ОграничиватьСверху И Не ОграничиватьСлева И Не ОграничиватьСправа И Не ОграничиватьСнизу Тогда 
		Возврат ОбластьЯчеек;
	КонецЕсли;
	
	Если Ложь Тогда // фейк
		ТабДок = Новый ТабличныйДокумент;
		ОбластьЯчеек = ТабДок.Области[0];
	КонецЕсли;
	
	Лево = Неопределено; Право = Неопределено; Верх = Неопределено; Низ = Неопределено;
	МаксШирина = ТабДок.ШиринаТаблицы;
	Для Стр = ОбластьЯчеек.Верх По ОбластьЯчеек.Низ Цикл
		Для Кол = 1 По МаксШирина Цикл 
			ТекОбласть = ТабДок.Область(Стр, Кол);
			Если ЭтоЗначащаяОбласть(ТекОбласть) Тогда 
				Лево = ?(Лево=Неопределено, Кол, Мин(Лево, Кол));
				Право = ?(Право=Неопределено, Кол, Макс(Право, Кол));
				Верх = ?(Верх=Неопределено, Стр, Верх);
				Низ = ?(Низ=Неопределено, Стр, Макс(Низ, Стр));
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Результат = ТабДок.Область(
		?(ОграничиватьСверху, ?(Верх=Неопределено, ОбластьЯчеек.Верх, Верх), ОбластьЯчеек.Верх),
		?(ОграничиватьСлева, ?(Лево=Неопределено, ОбластьЯчеек.Лево, Лево), ОбластьЯчеек.Лево),
		?(ОграничиватьСнизу, ?(Низ=Неопределено, ОбластьЯчеек.Низ, Низ), ОбластьЯчеек.Низ),
		?(ОграничиватьСправа, ?(Право=Неопределено, ОбластьЯчеек.Право, Право), ОбластьЯчеек.Право)
	);
	
	Возврат Результат;
	
КонецФункции

Функция ЭтоЗначащаяОбласть(ОбластьЯчеек)
	Возврат Не ПустаяСтрока(ОбластьЯчеек.Текст) 
		Или ОбластьЯчеек.Гиперссылка
		Или ОбластьЯчеек.СодержитЗначение
		//Или ОбластьЯчеек.ГраницаСверху.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
		//Или ОбластьЯчеек.ГраницаСнизу.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
		Или ОбластьЯчеек.ГраницаСлева.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
		Или ОбластьЯчеек.ГраницаСправа.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
	;
КонецФункции

// Функция - Текст области листа
// Предполагаем, что имеем дело с ТабДоком, обрезанным по нужным размерам.
// Параметры:
//  Лист - ЭлементСпискаЗначений, ТабличныйДокумент	 - Где искать текст.
//  Верх	 - Число, Неопределено	 - Верхняя граница области
//  Лево	 - Число, Неопределено	 - Левая граница области
//  Низ		 - Число, Неопределено	 - Нижняя граница области
//  Право	 - Число, Неопределено	 - Правая граница области
// 
// Возвращаемое значение:
//  Строка - Объединенный текст указанной области. Ячейки по горизонтали разделяются символом ТАБ, строки переносятся ВК
//
Функция ТекстОбластиЛиста(Лист, Знач Верх = Неопределено, Знач Лево = Неопределено, Знач Низ = Неопределено, Знач Право = Неопределено) Экспорт
	
	ТипЗнчЛист = ТипЗнч(Лист);
	Если ТипЗнчЛист=КэшФункции.ТипТабличныйДокумент() Тогда 
		ТабДок = Лист;
	ИначеЕсли ТипЗнчЛист=КэшФункции.ТипЭлементСпискаЗначений() Тогда 
		ТабДок = Лист.Значение;
	Иначе 
		ТабДок = Новый ТабличныйДокумент; // фейк
		ВызватьИсключение("Неподдерживаемый тип параметра Лист " + ТипЗнчЛист);
	КонецЕсли;
	
	Область = ТабДок.Область(Верх, Лево, Низ, Право);
	Результат = "";
	ГорРазд = Символы.Таб;
	ВертРазд = Символы.ВК;
	
	ОблЛево = ?(Область.Лево=0, 1, Область.Лево);
	ОблПраво = ?(Область.Право=0, ТабДок.ШиринаТаблицы, Мин(Область.Право, ТабДок.ШиринаТаблицы));
	ОблВерх = ?(Область.Верх=0, 1, Область.Верх);
	ОблНиз = ?(Область.Низ=0, ТабДок.ВысотаТаблицы, Мин(Область.Низ, ТабДок.ВысотаТаблицы));
	
	Для Стр=ОблВерх По ОблНиз Цикл 
		
		Для Кол=ОблЛево По ОблПраво Цикл
			
			ТекстЯчейки = ТабДок.Область(Стр, Кол).Текст;
			ЭтоПустаяЯчейка = ПустаяСтрока(ТекстЯчейки);
			
			Если ЭтоПустаяЯчейка Тогда 
				ТекстЯчейки = ГорРазд;
			КонецЕсли;
			Если Кол=ОблПраво И Стр=ОблНиз Тогда 
				Разделитель = "";
			ИначеЕсли Кол=ОблПраво Тогда
				Разделитель = ВертРазд;
			Иначе 
				Разделитель = ?(ЭтоПустаяЯчейка, "", ГорРазд);
			КонецЕсли;
			
			Результат = Результат + ТекстЯчейки + Разделитель;
				
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Показать
ruddanil; user785234; Serg243; yurazyuraz; dimongik; kulcha; JohnyDeath; lsnr; LeXXeR; snark76; Aspire1C; 5H1; user787825; Dizel; Nelli_A86; daho; varovinm; stupidgamer; user1466751; Mahinya; pavelpribytkin96; unknown181538; user767423; kwazi; cfifgoth; user811769; olololeg; _MPV_; freeraider; bajiepka; sansys; Somebody1; necropunk; DeD MustDie; LexSeIch; frkbvfnjh; alexey.kutya; +37 1 Ответить
22. Lapitskiy 1057 14.12.17 13:21 Сейчас в теме
(15) полностью перешел на этот метод, скорость сравнима с ADO
А совместимость выше.
dimongik; user787825; yghmd; daho; pavelpribytkin96; va582; BufBaf; Дмитрий31178; alexey.kutya; +9 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. BigB 191 13.12.17 14:21 Сейчас в теме
Как воспримет построитель вот такие найменования колонок например:
Наименование товара
Кол-во
Дата документа
2. alexey.kutya 301 13.12.17 14:57 Сейчас в теме
(1) воспримет нормально, но переименует по-своему ))
вот так
НаименованиеТовара
Кол_во
ДатаДокумента
Прикрепленные файлы:
frkbvfnjh; BigB; +2 Ответить
51. пользователь 18.04.18 15:38
Сообщение было скрыто модератором.
...
52. пользователь 19.04.18 03:34
Сообщение было скрыто модератором.
...
61. пользователь 21.04.18 01:12
Сообщение было скрыто модератором.
...
64. пользователь 23.04.18 04:29
Сообщение было скрыто модератором.
...
3. MaxS 2823 13.12.17 16:21 Сейчас в теме
Допустим требуется заполнить реквизит Артикул справочника номенклатура. Исходный файл содержит соответствующую колонку с текстом "000123", "000124" и т.п. все символы цифровые. Какое значение попадёт в строковый реквизит номенклатуры?
Если "123", "124" и т.п., то приемы эффективной загрузки данных из Excel в 1С разбиваются о реальность ))
5. alexey.kutya 301 13.12.17 16:49 Сейчас в теме
(3) Попадет значение "000123".
Прикрепленные файлы:
4. alexey.kutya 301 13.12.17 16:47 Сейчас в теме
Попадет значение "000123".
Прикрепленные файлы:
Plotks2017; MaxS; +2 Ответить
7. MaxS 2823 13.12.17 16:57 Сейчас в теме
(4) Спасибо за эксперимент, пересмотрю своё мнение об этом методе. Мои опыты приводили к потере лидирующих нулей.
8. alexey.kutya 301 13.12.17 17:42 Сейчас в теме
(7) возможно что-то уже изменили в платформе

и еще есть один нюанс. У метода Прочитать есть второй параметр СпособЧтенияЗначений.

<СпособЧтенияЗначений> (необязательный)

Тип: СпособЧтенияЗначенийТабличногоДокумента.
Определяет, каким образом нужно интерпретировать значения, считываемые из исходного документа XLS, XLSX или ODS.
При загрузке табличного документа из формата Excel 97 - 2010 и OpenOffice Calc, в случае если в ячейке исходного документа содержалось значение типа Дата или Число, то в ячейку результирующего табличного документа это значение попадает в зависимости от значения этого параметра.
Значение по умолчанию: Текст.
77. user700035_6550355 29 11.04.19 08:17 Сейчас в теме
(4) При загрузке Артикула = "80665" загружается как "80 665" вне зависимости от СпособЧтенияЗначенийТабличногоДокумента (Текст или Значение)
106. user671385_serpal66 08.07.21 17:29 Сейчас в теме
(77) нужно указать в формате для считываемой строки ЧГ=0, (лучше через конструктор форматной строки, число, группировка = 0) Иначе для чисел больше 1000 действует формат 1 000 и тд
6. maxopik2 69 13.12.17 16:54 Сейчас в теме
У меня проблема в методе "Прочитать()" , ядро 8.3.10.2580 : при загрузке больших файлов (2-3 Mb) расход памяти сервера может достигать 12 Gb
пришлось отказаться от этого метода и пользоваться ADODB
Aspire1C; +1 Ответить
9. alexey.kutya 301 13.12.17 17:43 Сейчас в теме
(6) обидно )) но что поделаешь
11. maxopik2 69 14.12.17 07:20 Сейчас в теме
(9) Не обидно, а вопрос: Это ошибка платформы (т.к. не может из файла 2 Mb появиться файл mxl объемом 11Gb) или я что-то не так делаю?
12. alexey.kutya 301 14.12.17 08:45 Сейчас в теме
(11) да интересно ) если хотите, отправьте мне этот файл. Я попробую его загрузить. Если конечно там нет конфиденциальной информации.
19. maxopik2 69 14.12.17 12:20 Сейчас в теме
25. alexey.kutya 301 14.12.17 14:01 Сейчас в теме
(19) вот результат. Обработал за 2 сек )) размер mxl файла 3 Мб.

Время начала чтения табличного документа: 14.12.2017 13:52:46
Время окончания чтения табличного документа: 14.12.2017 13:52:48
Количество секунд чтения: 2

Время начала выгрузки табличного документа в ТЗ: 14.12.2017 13:52:48
Время окончания выгрузки табличного документа в ТЗ: 14.12.2017 13:52:49
Количество строк таблицы значений: 11 874
Количество секунд выгрузки: 1
13. MaxS 2823 14.12.17 08:49 Сейчас в теме
(11) А если на этом же сервере запустить тонкий клиент и через "Файл - Открыть" открыть этот файл? Расход памяти такой же будет?
20. maxopik2 69 14.12.17 12:21 Сейчас в теме
(13) Попробовал через тонкий клиент. Расход памяти такой же.
88. user703966_martynyuknatalia 17.07.19 04:20 Сейчас в теме
Функция ПрочитатьЛист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 Цикл
ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
КонецЦикла;
ЛистЭксель = Неопределено;
Возврат ТЗ;
КонецФункции
96. chukawata 10 04.02.20 06:40 Сейчас в теме
(88)
SpecialCells
Надо иметь в виду, что SpecialCells(11) даёт последнюю ячейку на листе, который был активным при закрытии книги, а не листа, с которого происходит считывание. Например, если на активном при закрытии листе было три строки, то именно столько строк считается с листа данных. Аналогично, видимо, со столбцами.
10. Alligator84 74 14.12.17 05:23 Сейчас в теме
Спасибо, познавательно!
Plotks2017; alexey.kutya; +2 Ответить
14. Lapitskiy 1057 14.12.17 09:31 Сейчас в теме
а зачем построитель?
Можно по циклу обойти Табличный документ.
16. alexey.kutya 301 14.12.17 10:02 Сейчас в теме
(14) можно и циклом. Это альтернативный способ. Мне больше нравится через построитель.
vovan_victory; +1 Ответить
23. Lapitskiy 1057 14.12.17 13:22 Сейчас в теме
(16) я думаю, из-за построителя и расход памяти поболее будет.
alexey.kutya; +1 Ответить
24. alexey.kutya 301 14.12.17 13:46 Сейчас в теме
(23) сам не замерял, но вполне возможно )
15. VmvLer 14.12.17 09:50 Сейчас в теме
табличные документы 1С много "весят" - это особенно ощутимо для больших данных.

покрутите предлагаемый метод для эксель-файлов с сотнями тысяч строк, интересно за какое время вы прочтете
17. alexey.kutya 301 14.12.17 10:27 Сейчас в теме
(15) вот результат замера. 1 млн. строк, файл excel 25 мб.

Время начала чтения табличного документа: 14.12.2017 10:24:40
Время окончания чтения табличного документа: 14.12.2017 10:26:31
Количество секунд чтения: 111

Время начала выгрузки табличного документа в ТЗ: 14.12.2017 10:26:37
Время окончания выгрузки табличного документа в ТЗ: 14.12.2017 10:26:49
Количество строк таблицы значений: 1 000 000
Количество секунд выгрузки: 12
22. Lapitskiy 1057 14.12.17 13:21 Сейчас в теме
(15) полностью перешел на этот метод, скорость сравнима с ADO
А совместимость выше.
dimongik; user787825; yghmd; daho; pavelpribytkin96; va582; BufBaf; Дмитрий31178; alexey.kutya; +9 Ответить
37. wolfsoft 2421 20.12.17 08:58 Сейчас в теме
(22) Ага, ещё бы при чтении некоторых эксель-файлов не вылетало с ошибкой и страницы бы читала.
49. пользователь 18.04.18 03:17
Сообщение было скрыто модератором.
...
58. пользователь 20.04.18 10:43
Сообщение было скрыто модератором.
...
18. vladismi 168 14.12.17 10:59 Сейчас в теме
Забавно. Попробуем.
alexey.kutya; +1 Ответить
21. qwinter 671 14.12.17 13:04 Сейчас в теме
Кто то узнал о существовании построителя. Круто.
26. PavelKolobkov 14.12.17 15:34 Сейчас в теме
Здесь обсуждалось подобное сабжу
27. alexey.kutya 301 14.12.17 16:07 Сейчас в теме
(26) там немного про другое, но в комментариях да, упоминается про метод Прочитать.
28. logarifm 1116 15.12.17 01:06 Сейчас в теме
А где приемы? Я насчитал только один! Отчитали и накрыли построителем, а остальные ?
DmitrySinichnikov; +1 1 Ответить
29. alexey.kutya 301 15.12.17 08:29 Сейчас в теме
(28) ну вот и получается загрузка в 2 приема ))
Рассмотреть все возможные варианты работы с Excel не являлось целью публикации. Я просто хотел показать как можно с наменьшими затратами, используя код в несколько строк выполнить задачу.
30. Infector 199 15.12.17 09:32 Сейчас в теме
Был небольшой опыт:
Когда попытался обработать через "прочитать" сохраненную контрагентом печатную форму с графическими объектами, все это дело просто повесилось. Пока что ADO и COM-объекты в таких случаях надежнее.
alexey.kutya; +1 Ответить
32. alexey.kutya 301 15.12.17 13:11 Сейчас в теме
(30) да, в таком случае лучше ADO.
31. AzagTot 40 15.12.17 12:16 Сейчас в теме
Спасибо! Очень интересный способ.
Насколько я понял, он не требует наличия на компьютере Microsoft Excel или OpenOffice Calc для чтения соответствующих таблиц?
Метод Табличного Документа "Записать" точно не требует, проверено)
alexey.kutya; +1 Ответить
36. alexey.kutya 301 15.12.17 19:28 Сейчас в теме
(31) Я не проверял, но думаю должен работать.
43. YuriIn 16.04.18 22:53 Сейчас в теме
(31) на сколько мне известно в 1С есть встроенный механизм работы с табличными документами, и в данном случае работает как раз встроенный механизм и получается приложение необязательное.
33. alexey.kutya 301 15.12.17 13:12 Сейчас в теме
Я не проверял, но думаю должен работать.
34. пользователь 15.12.17 17:54
Сообщение было скрыто модератором.
...
35. пользователь 15.12.17 17:55
Сообщение было скрыто модератором.
...
38. kredko 20 20.12.17 09:16 Сейчас в теме
Хороший метод, только вот не работает с файлами эксель с расширением xlm, который с макросами. И Данные с нескольких страниц помещает в один табличный документ.
alexey.kutya; +1 Ответить
39. Stradivari 157 13.04.18 08:46 Сейчас в теме
Спасибо. Статья помогла!
40. echo77 1868 16.04.18 13:09 Сейчас в теме
Просто и полезно. Укажите в публикации, пожалуйста, что это работает начиная с платформы версии 8.3.6, а с версии 8.3.10 можно грузить данные с определенного листа. Можно так же подкрепить ссылка на ИТС
frkbvfnjh; alexey.kutya; +2 Ответить
75. user755058 05.02.19 16:06 Сейчас в теме
(40) везде только и говорят про
а с версии 8.3.10 можно грузить данные с определенного листа
но нигде не нашёл ни ссылку на документацию ни пример реализации . Может кто знает - поделитесь пожалуйста.
Hogyoku; Aspire1C; +2 Ответить
41. d4rkmesa 16.04.18 22:10 Сейчас в теме
Гениально. Не знал про такие фокусы с построителем и табличным документом.
alexey.kutya; +1 Ответить
42. triviumfan 91 16.04.18 22:39 Сейчас в теме
(41) Тоже не знал) До сих пор ADO/EXCEL юзаю =)
alexey.kutya; +1 Ответить
44. ImHunter 312 17.04.18 09:25 Сейчас в теме
(0) (38) Разбивка по листам, похоже, не раскрыта?
Недавно тоже вот перешел на этот способ с ADO.
Разбивать по листам, в принципе, несложно. В загруженном ТабДоке присутствует несколько областей с названиями листов.

В итоге, получилось вот так:

///////////////////////////////////
// Работа с Excel через ТабДок

// Функция - Прочитать excel
//
// Параметры:
//  ФайлExcel - Файл, Строка	 - Объект Файл или полное имя файла.
//  ФункцияОбработкиСтрок	 - Строка, Неопределено	 - Шаблон выражения для обработки строковых значений ячеек. 
//	В шаблоне производится подстановка - вместо символа ? будет подставляться обрабатываемое значение строки.
//	Если передать Неопределено или пустую строку, то обработка производиться не будет.
//  МаксШирина				 - Число - Максимальное кол-во колонок, просматриваемых при усечении таблицы по ширине.
//  ОграничиватьСверху		 - Булево - Убирать пустые строки сверху
//  ОграничиватьСлева		 - Булево - Убирать пустые строки слева
//  ОграничиватьСнизу		 - Булево - Убирать пустые строки снизу
//  ОграничиватьСправа		 - Булево - Убирать пустые строки справа
// 
// Возвращаемое значение:
//  СписокЗначений - Список значений содержимого. Элементы списка в поле Значение содержат ячейки листа (объект ОбластьЯчеекТабличногоДокумента), в поле Представление - имя листа
//
Функция ПрочитатьExcel(ФайлExcel, ФункцияОбработкиСтрок = "СокрЛП(?)",
		ОграничиватьСверху = Истина, ОграничиватьСлева = Истина, ОграничиватьСнизу = Истина, ОграничиватьСправа = Истина) Экспорт 
	
	Ф = НовыйФайл(ФайлExcel);
	ВесьТабДок = Новый ТабличныйДокумент();
	ВесьТабДок.Прочитать(Ф.ПолноеИмя, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	
	Результат = Новый СписокЗначений;
	Области = ВесьТабДок.Области;
	Если Области.Количество()=0 Тогда 
		ВызватьИсключение("В файле нет областей");
	КонецЕсли;
	
	Для Каждого Обл Из Области Цикл
		ТекТабДок = Новый ТабличныйДокумент;
		ОгрОбласть = ПолучитьОграниченнуюОбласть(ВесьТабДок, Обл);
		// вставим область в табдок
		ОгрОбласть.Имя = Обл.Имя;
		ТекТабДок.ВставитьОбласть(ОгрОбласть, 
			ТекТабДок.Область(1, ОгрОбласть.Лево, ОгрОбласть.Низ - ОгрОбласть.Верх + 1, ОгрОбласть.Право)
		);
		СократитьСтроки(ТекТабДок, ФункцияОбработкиСтрок);
		Результат.Добавить(ТекТабДок, Обл.Имя);
	КонецЦикла;
	// зачищаем исходный таб док. хз, может лишнее
	ВесьТабДок.Очистить();
	ВесьТабДок = Неопределено;
	
	Возврат Результат;
	
КонецФункции

Процедура СократитьСтроки(ТабДок, ФункцияОбработкиСтрок = "СокрЛП(?)")
	
	Если ПустаяСтрока(ФункцияОбработкиСтрок) Тогда 
		Возврат;
	КонецЕсли;
	
	Если Ложь Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли; // фейк
	
	Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл 
		Для Кол = 1 По ТабДок.ШиринаСтраницы Цикл 
			ТекОбласть = ТабДок.Область(Стр, Кол);
			ТекстОбласти = ТекОбласть.Текст;
			Если Не ТекОбласть.СодержитЗначение И Не ПустаяСтрока(ТекОбласть.Текст)	Тогда 
				Выражение = СтрЗаменить(ФункцияОбработкиСтрок, "?", "ТекстОбласти");
				ТекОбласть.Текст = Вычислить(Выражение);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

Функция ПолучитьОграниченнуюОбласть(ТабДок, ОбластьЯчеек,
	ОграничиватьСверху = Истина, ОграничиватьСлева = Истина, ОграничиватьСнизу = Истина, ОграничиватьСправа = Истина)
	
	Если Не ОграничиватьСверху И Не ОграничиватьСлева И Не ОграничиватьСправа И Не ОграничиватьСнизу Тогда 
		Возврат ОбластьЯчеек;
	КонецЕсли;
	
	Если Ложь Тогда // фейк
		ТабДок = Новый ТабличныйДокумент;
		ОбластьЯчеек = ТабДок.Области[0];
	КонецЕсли;
	
	Лево = Неопределено; Право = Неопределено; Верх = Неопределено; Низ = Неопределено;
	МаксШирина = ТабДок.ШиринаТаблицы;
	Для Стр = ОбластьЯчеек.Верх По ОбластьЯчеек.Низ Цикл
		Для Кол = 1 По МаксШирина Цикл 
			ТекОбласть = ТабДок.Область(Стр, Кол);
			Если ЭтоЗначащаяОбласть(ТекОбласть) Тогда 
				Лево = ?(Лево=Неопределено, Кол, Мин(Лево, Кол));
				Право = ?(Право=Неопределено, Кол, Макс(Право, Кол));
				Верх = ?(Верх=Неопределено, Стр, Верх);
				Низ = ?(Низ=Неопределено, Стр, Макс(Низ, Стр));
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Результат = ТабДок.Область(
		?(ОграничиватьСверху, ?(Верх=Неопределено, ОбластьЯчеек.Верх, Верх), ОбластьЯчеек.Верх),
		?(ОграничиватьСлева, ?(Лево=Неопределено, ОбластьЯчеек.Лево, Лево), ОбластьЯчеек.Лево),
		?(ОграничиватьСнизу, ?(Низ=Неопределено, ОбластьЯчеек.Низ, Низ), ОбластьЯчеек.Низ),
		?(ОграничиватьСправа, ?(Право=Неопределено, ОбластьЯчеек.Право, Право), ОбластьЯчеек.Право)
	);
	
	Возврат Результат;
	
КонецФункции

Функция ЭтоЗначащаяОбласть(ОбластьЯчеек)
	Возврат Не ПустаяСтрока(ОбластьЯчеек.Текст) 
		Или ОбластьЯчеек.Гиперссылка
		Или ОбластьЯчеек.СодержитЗначение
		//Или ОбластьЯчеек.ГраницаСверху.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
		//Или ОбластьЯчеек.ГраницаСнизу.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
		Или ОбластьЯчеек.ГраницаСлева.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
		Или ОбластьЯчеек.ГраницаСправа.ТипЛинии<>ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
	;
КонецФункции

// Функция - Текст области листа
// Предполагаем, что имеем дело с ТабДоком, обрезанным по нужным размерам.
// Параметры:
//  Лист - ЭлементСпискаЗначений, ТабличныйДокумент	 - Где искать текст.
//  Верх	 - Число, Неопределено	 - Верхняя граница области
//  Лево	 - Число, Неопределено	 - Левая граница области
//  Низ		 - Число, Неопределено	 - Нижняя граница области
//  Право	 - Число, Неопределено	 - Правая граница области
// 
// Возвращаемое значение:
//  Строка - Объединенный текст указанной области. Ячейки по горизонтали разделяются символом ТАБ, строки переносятся ВК
//
Функция ТекстОбластиЛиста(Лист, Знач Верх = Неопределено, Знач Лево = Неопределено, Знач Низ = Неопределено, Знач Право = Неопределено) Экспорт
	
	ТипЗнчЛист = ТипЗнч(Лист);
	Если ТипЗнчЛист=КэшФункции.ТипТабличныйДокумент() Тогда 
		ТабДок = Лист;
	ИначеЕсли ТипЗнчЛист=КэшФункции.ТипЭлементСпискаЗначений() Тогда 
		ТабДок = Лист.Значение;
	Иначе 
		ТабДок = Новый ТабличныйДокумент; // фейк
		ВызватьИсключение("Неподдерживаемый тип параметра Лист " + ТипЗнчЛист);
	КонецЕсли;
	
	Область = ТабДок.Область(Верх, Лево, Низ, Право);
	Результат = "";
	ГорРазд = Символы.Таб;
	ВертРазд = Символы.ВК;
	
	ОблЛево = ?(Область.Лево=0, 1, Область.Лево);
	ОблПраво = ?(Область.Право=0, ТабДок.ШиринаТаблицы, Мин(Область.Право, ТабДок.ШиринаТаблицы));
	ОблВерх = ?(Область.Верх=0, 1, Область.Верх);
	ОблНиз = ?(Область.Низ=0, ТабДок.ВысотаТаблицы, Мин(Область.Низ, ТабДок.ВысотаТаблицы));
	
	Для Стр=ОблВерх По ОблНиз Цикл 
		
		Для Кол=ОблЛево По ОблПраво Цикл
			
			ТекстЯчейки = ТабДок.Область(Стр, Кол).Текст;
			ЭтоПустаяЯчейка = ПустаяСтрока(ТекстЯчейки);
			
			Если ЭтоПустаяЯчейка Тогда 
				ТекстЯчейки = ГорРазд;
			КонецЕсли;
			Если Кол=ОблПраво И Стр=ОблНиз Тогда 
				Разделитель = "";
			ИначеЕсли Кол=ОблПраво Тогда
				Разделитель = ВертРазд;
			Иначе 
				Разделитель = ?(ЭтоПустаяЯчейка, "", ГорРазд);
			КонецЕсли;
			
			Результат = Результат + ТекстЯчейки + Разделитель;
				
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Показать
ruddanil; user785234; Serg243; yurazyuraz; dimongik; kulcha; JohnyDeath; lsnr; LeXXeR; snark76; Aspire1C; 5H1; user787825; Dizel; Nelli_A86; daho; varovinm; stupidgamer; user1466751; Mahinya; pavelpribytkin96; unknown181538; user767423; kwazi; cfifgoth; user811769; olololeg; _MPV_; freeraider; bajiepka; sansys; Somebody1; necropunk; DeD MustDie; LexSeIch; frkbvfnjh; alexey.kutya; +37 1 Ответить
45. alexey.kutya 301 17.04.18 10:08 Сейчас в теме
(44) Спасибо за дополнение :) У вас отлично реализовано. Думаю будет очень полезно.
50. vpaoli 26 18.04.18 09:42 Сейчас в теме
(45) Я недавно сравнивал скорость загрузки через ADO и с помощью метода
Область = ЛистЭксель.Range(...);
Данные = Область.Value.Выгрузить();
Получилось, что второй метод быстрее ADO где то на 25%
Вы не сравнивали метод Range с вашим методом загрузки ? Что быстрее и насколько. Может сравните для полноты ощущений ...?
46. ediks 335 17.04.18 10:33 Сейчас в теме
(44) А что за объект КэшФункции в функции ТекстОбластиЛиста?
И в строке Ф = НовыйФайл(ФайлExcel); пробел не пропущен НовыйФайл?
sacred_a; +1 Ответить
47. ImHunter 312 17.04.18 10:55 Сейчас в теме
(46) Да, точно

Тут же в модуле

// Функция - Новый файл
// Создает или переиспользует объект Файл. Для сокращения кол-ва кода. Заодно можно делать проверку существования файла.
// Параметры:
//  Файл					 - Файл, Строка	 - Если передается объект Файл, то он же и возвращается. 
//	Если передается Строка (путь), то создается Файл по переданному пути
//  ПроверятьСуществование	 - Булево - Проверять ли существование файла. Если не существует, то идет вызов исключения.
// 
// Возвращаемое значение:
//  Файл - Созданный или переиспользованный файл
//
Функция НовыйФайл(Файл, ПроверятьСуществование = Истина)
	
	ТипЗнчФайл = ТипЗнч(Файл);
	Результат = Неопределено;
	Если ТипЗнчФайл=КэшФункции.ТипФайл() Тогда 
		Результат = Файл;
	ИначеЕсли ТипЗнчФайл=КэшФункции.ТипСтрока() Тогда 
		Результат = Новый Файл(Файл);
	Иначе 
		ВызватьИсключение("Непредусмотренный тип параметра Файл " + ТипЗнчФайл);
	КонецЕсли;
	
	Если ПроверятьСуществование=Истина И Не Результат.Существует() Тогда 
		ВызватьИсключение("Файл не существует");
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
Показать


А КэшФункции - это модуль, закешированный на сеанс. Там, в том числе, закешированы типы данных:
Функция ТипСтрока() Экспорт
	Возврат Тип("Строка");
КонецФункции

Функция ТипДата() Экспорт
	Возврат Тип("Дата");
КонецФункции

Функция ТипФайл() Экспорт
	Возврат Тип("Файл");
КонецФункции

Функция ТипСтруктура() Экспорт
	Возврат Тип("Структура");
КонецФункции

Функция ТипНеопределено() Экспорт
	Возврат Тип("Неопределено");
КонецФункции

Функция ТипУникальныйИдентификатор() Экспорт
	Возврат Тип("УникальныйИдентификатор");
КонецФункции

Функция ТипЭлементСпискаЗначений() Экспорт 
	Возврат Тип("ЭлементСпискаЗначений");
КонецФункции

Функция ТипСписокЗначений() Экспорт 
	Возврат Тип("СписокЗначений");
КонецФункции

Функция ТипТабличныйДокумент() Экспорт 
	Возврат Тип("ТабличныйДокумент");
КонецФункции

Функция ТипМассив() Экспорт 
	Возврат Тип("Массив");
КонецФункции
Показать
mrAxe; sml; ediks; +3 Ответить
110. Rain_man 09.03.22 05:33 Сейчас в теме
(47)
модуль, закешированный на сеанс
- это как? Где почитать?
111. ImHunter 312 09.03.22 07:20 Сейчас в теме
(110) Это про св-во модуля Повторное использование возвращаемых значений
53. пользователь 19.04.18 11:33
Сообщение было скрыто модератором.
...
54. пользователь 19.04.18 16:01
Сообщение было скрыто модератором.
...
55. пользователь 19.04.18 20:32
Сообщение было скрыто модератором.
...
56. пользователь 20.04.18 01:27
Сообщение было скрыто модератором.
...
60. пользователь 20.04.18 19:41
Сообщение было скрыто модератором.
...
62. пользователь 22.04.18 00:44
Сообщение было скрыто модератором.
...
63. пользователь 23.04.18 04:29
Сообщение было скрыто модератором.
...
112. triviumfan 91 15.09.22 23:14 Сейчас в теме
(44) О, боже. Ты хотя бы пробовал читать своим способом файлы с хотя бы 100Х10000 ячеек? Это же просто позор.
113. ImHunter 312 17.09.22 12:19 Сейчас в теме
(112) Товарищ, у моего способа есть ограничения. Писал тоже об этом. Но ведь дело не в моей реализации, а в прожорливости ТабДока. Особенно, если есть формулы.
В общем-то, это вам позор, если вы этого не понимаете.
114. triviumfan 91 17.09.22 16:52 Сейчас в теме
(113) Первый обход табдока разделяет его на области (и не оптимально), второй обход делает СокрЛП(), а дальше уже обход разработчика, что твою функцию использовал. Бред.
Твоя функция 5 минут у меня отрабатывает, хотя у меня мощный пк и довольно простой файл (100 колонок 10000 строк) без формул и всякого условного оформления, картинок и прочей лабуды. Файлик менее 1 мегабайта - 5 минут :D
Боюсь представить, как оно будет работать на файле посложнее.
115. ImHunter 312 17.09.22 17:19 Сейчас в теме
(114) Вероятно, я бы и оптимизировал все это. Но смысла уже не было что-то делать. По уже описанным причинам.
Поделитесь уже своим вариантом, а не твердите про бред и позор.
116. triviumfan 91 19.09.22 09:18 Сейчас в теме
(115) я решил вообще отказаться от многостраничности, ибо это бред.
Обмен через Excel вообще был выбран по глупости (да и не мной).
Достаточно чтения в 2 строчки, а СокрП() уже на этапе обработки. Работает, разумеется, в тысячу раз быстрее.
117. ImHunter 312 19.09.22 09:38 Сейчас в теме
(116) Мне вот многостраничность как раз нужна была. У вас своя задача, у меня - своя. Так что, "бред" - это ваше субъективное восприятие.
Вообще, чтение Excel через ТабДок уже воспринимаю, как мазохизм. В последних версиях того механизма, для которого все задумывалось, читаем через парсинг XLSX. Если вдруг xls приходит, то сначала конвертируем в xlsx.
118. triviumfan 91 19.09.22 12:03 Сейчас в теме
(117) Excel - это табличный процессор, он вообще для загрузки плохо подходит, а если и оч требуется, тогда файл должен содержать 1 лист, ибо 1с не умеет корректно их обрабатывать. Твоя задача изначально обречена на провал - тут уже мазохизм) Зачем конвертировать xls в xlsx?
119. ImHunter 312 19.09.22 14:20 Сейчас в теме
(118) Смысел первого предложения мне так до конца и не понятен. Ну вот такова се ля ви. Поставщики шлют данные в нескольких листах - помесячно. Нужно выбрать определенный лист. Формат не поддается регламентированию, пользуемся тем, что дают.
Если говорить про загрузку ТабДоком, то ведь и получилось разбить по листам.

С конвертацией (xls в xlsx) сравнительно недавно пришлось заморочиться. Ранее xls читали ado-провайдером. Но недавно начал и он сбоить. Деталей уже не помню... В общем, пришлось и от него отказаться. Ну а конвертацию сделали, чтобы конечное чтение работало только одним механизмом, через парсинг XLSX.

Как-то даже загорелся и начал писать компоненту для прямого чтения XLS/XLSX - есть библиотека от какого-то японца. Но тоже не покатило. Библиотека достаточно старая, выяснилось, что не все формулы (функции) поддерживает. Допиливать еще и формулы уже не влазило во временные рамки.
120. triviumfan 91 19.09.22 14:51 Сейчас в теме
(119) Только что узнал, что xls не читается платформой :) Мде
48. ImHunter 312 17.04.18 16:32 Сейчас в теме
На основании публикации доработал и свой модуль. Теперь выгружаю и в ТЗ.
// Функция - Получить таблицу значений excel
//
// Параметры:
//  Лист - ЭлементСпискаЗначений, ТабличныйДокумент	 - Где искать текст.
//  ПоляТолькоПоДокументу	 - Булево - Если Истина, то создаются поля по верхней строке ТабДока. Если Ложь, то создаются авто-поля Поле[N] по всей ширине ТабДока.
// 
// Возвращаемое значение:
//  ТаблицаЗначений - ТЗ с данными ТабДока
//
Функция ПолучитьТаблицуЗначенийExcel(Лист, ПоляТолькоПоДокументу = Ложь) Экспорт
	
	Если Истина Тогда 
		ТабДок = ПолучитьТабДок(Лист);
	Иначе 
		ТабДок = Новый ТабличныйДокумент;
	КонецЕсли;
	
	Если ТабДок.ВысотаТаблицы=0 Тогда 
		Возврат Неопределено;
	КонецЕсли;
	
	// вставим заголовки
	Если ПоляТолькоПоДокументу=Ложь Тогда 
		ВерхняяСтрока = ТабДок.Область("R1");
		ТабДок.ВставитьОбласть(ВерхняяСтрока, ВерхняяСтрока, ТипСмещенияТабличногоДокумента.ПоВертикали, Ложь);
		ВерхняяСтрока = ТабДок.Область("R1");
		ВерхняяСтрока.Очистить();
		Для Кол=1 По ТабДок.ШиринаТаблицы Цикл
			ТабДок.Область(1, Кол).Текст = "Поле" + Формат(Кол, "ЧГ=");
		КонецЦикла;
	КонецЕсли;
	
	ПЗ = Новый ПостроительЗапроса;
	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
	ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
	ПЗ.ЗаполнитьНастройки();
	ПЗ.Выполнить();
	ТаблицаЗначений = ПЗ.Результат.Выгрузить();	
	
	// вставим заголовки
	Если ПоляТолькоПоДокументу=Ложь Тогда
		ВерхняяСтрока = ТабДок.Область("R1");
		ТабДок.УдалитьОбласть(ВерхняяСтрока, ТипСмещенияТабличногоДокумента.ПоВертикали);
	КонецЕсли;
   
    Возврат ТаблицаЗначений;
   
КонецФункции

Функция ПолучитьТабДок(Лист)
	
	ТипЗнчЛист = ТипЗнч(Лист);
	Если ТипЗнчЛист=КэшФункции.ТипТабличныйДокумент() Тогда 
		ТабДок = Лист;
	ИначеЕсли ТипЗнчЛист=КэшФункции.ТипЭлементСпискаЗначений() Тогда 
		ТабДок = Лист.Значение;
	Иначе 
		ВызватьИсключение("Неподдерживаемый тип параметра Лист " + ТипЗнчЛист);
	КонецЕсли;
	
	Возврат ТабДок;
	
КонецФункции
Показать
varovinm; alexey.kutya; +2 Ответить
57. пользователь 20.04.18 01:27
Сообщение было скрыто модератором.
...
59. vpaoli 26 20.04.18 12:22 Сейчас в теме
Раз уж Вы пишете "Приемы эффективной загрузки ..." , наверно необходимо сравнение с другими существующими . Иначе это может быть и "не эффективной загрузки".
Есть метод:
Область = ЛистЭксель.Range(...); 
Данные = Область.Value.Выгрузить(); 


Вы не сравнивали метод Range с вашим методом загрузки ? Что быстрее и насколько ?
65. alexey.kutya 301 23.04.18 12:58 Сейчас в теме
(59)
Область = ЛистЭксель.Range(...);
Данные = Область.Value.Выгрузить();


Попробовал на 1 млн. строк.

Время выполнения чтения файла вашим методом 36 сек. Время выполнения методом описанным в моей публикации 193 сек. Разница в 5 раз :) Но ваш метод возвращает массивы значений, надо попробовать их разобрать.
66. ImHunter 312 23.04.18 13:24 Сейчас в теме
(65) Так ожидаемо, что ТабДоком медленнее. И значительно тяжелее, наверное, по расходу памяти.
Но профит в том, что не нужен Excel, ADO-провайдеры. Пожалуй, только из-за этого на табдоки перебрался.
alexey.kutya; +1 Ответить
67. alexey.kutya 301 23.04.18 14:11 Сейчас в теме
(66)
ADO-провайдер


Конечно, если время выполнения приемлемое, то почему бы и нет.
68. vpaoli 26 24.04.18 10:52 Сейчас в теме
(65)
Но ваш метод возвращает массивы значений, надо попробовать их разобрать.
Все уже разобрано.... Есть публикации вместе с кодом на инфостарте.
alexey.kutya; +1 Ответить
109. AlexO 135 27.12.21 11:54 Сейчас в теме
(65) Что-то у вас подозрительно все гладко - у меня OLE.Value.Выгрузить() валится начиная со 100 тыс строк исходного файла.
Так-то COMSAfeArray, создаваемый в OLE.Value, вообще размером 2,5 млн строк на 100 тыс исходных в эксель (возьмем 25 колонок в исходном файле).
А это уже - серьезные объемы для 1С, а у вас - никаких проблем, все грузится, утечек, вылетов по памяти - нет, OLE.Value.Выгрузить() - грузит миллионы строк...
Что-то слишком у вас все радужно, что даже становится сомнительно по поводу проводимых измерений, и реальных прогружаемых объемов.
69. ImHunter 312 27.04.18 13:42 Сейчас в теме
Хех, недолго радовался:( Придется отказаться от такого чтения. Тесты в боевых условиях валятся по нехватке памяти. Похоже, чтение ТабДоком сильно не любит формулы.
Aspire1C; AlexO; +2 Ответить
70. alexey.kutya 301 27.04.18 15:11 Сейчас в теме
71. ImHunter 312 28.04.18 06:47 Сейчас в теме
(70) Для справки. Тесты гонял на 8.3.10.2580, 32-бит.
Так что, народ, аккуратнее с загрузкой ТабДоком...
alexey.kutya; +1 Ответить
72. vis_tmp 32 05.05.18 15:06 Сейчас в теме
Не могу понять, вашим методом загружается ли гиперссылка из ячейки Excel-а?
Гиперссылка представляет из себя URL на картинку на сайте (прилагаю для примера кусочек такого файла).
Кому-нибудь удалось получить URL гиперссылки из подобного файла?
Прикрепленные файлы:
PRICE - сантехника MIN.xls
73. alexey.kutya 301 25.12.18 15:08 Сейчас в теме
(72) может уже не актуально, но нет, гиперссылка не загружается
76. vis_tmp 32 10.03.19 23:04 Сейчас в теме
(73)Актуально!
Как бы научиться загружать гиперссылки?
74. пользователь 26.12.18 05:42
Сообщение было скрыто модератором.
...
78. pushkarev 10.06.19 16:49 Сейчас в теме
добрый день. На 64 битную подойдет?
79. alexey.kutya 301 10.06.19 17:37 Сейчас в теме
(78) не проверял, но думаю должно работать
80. pushkarev 10.06.19 18:22 Сейчас в теме
Перехожу на 1с розница 2.2. Хочу из EXEL импортировать. Не могу тут ничего скачать. на почту не перешлете.?
83. alexey.kutya 301 11.06.19 09:40 Сейчас в теме
(80) отправлю, только доберусь до компа
81. pushkarev 10.06.19 18:46 Сейчас в теме
82. alexey.kutya 301 11.06.19 09:38 Сейчас в теме
Отправлю, только доберусь до компа
84. user811769 13 16.07.19 11:09 Сейчас в теме
Добрый день! Алексей, а эффективно ли будет работать построитель с такой шапкой:
Прикрепленные файлы:
Оставьте свое сообщение