Почему при загрузке таблицы Excel в 1С возникают ошибки?

10.07.19

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

При загрузке из EXCEL в 1С методом MS ADODB.Connection столкнулся с некоторыми проблемами, которые попытался устранить в ниже приведенной статье. Надеюсь, что статья поможет вам сократить время разработки.  Особая благодарность Андрею М. за публикацию //infostart.ru/public/163640/

В данной статье приведен функционал, с помощью которого в обработке
"Импорт из EXCEL (xls) в 1С"
производится считывание данных из файлов табличного типа *xls.

Есть множество статей на эту тему:

Метод "MS ADO" (Чтение файлов xls, xlsx средствами Microsoft ADO): //infostart.ru/public/163640/
- Метод "MS EXCEL" (Чтение файлов xls, xlsx с картинками средствами Microsoft Office): //infostart.ru/public/163641/
- Метод "LO CALC" (Чтение файлов xls, xlsx, ods, sxc с картинками средствами LibreOffice): //infostart.ru/public/163642/
- Метод "NativeXLSX" (Чтение файлов xlsx с картинками средствами 1С. ПостроительDOM): //infostart.ru/public/300092/
- Метод "NativeXLSX". Предыдущий вариант (Чтение файлов xlsx средствами 1С. ЧтениеXML)://infostart.ru/public/225624/
- Метод "Excel1C" (Загрузка на платформе 8.3.6 с картинками. Чтение файлов xls, xlsx, ods): //infostart.ru/public/341855/
- Список листов файла: //infostart.ru/public/163724/

Но всегда возникают какие-то проблемы:

При загрузке из EXCEL в 1С методом MS ADODB.Connection столкнулся со следующим:

  • пользователь выделил цветом всю таблицу Excel, что привело к считыванию всего листа книги.  

  • EOF() оказался гораздо дальше чем реально пользователь видел при визуальном осмотре таблицы Excel, т. е. загружались пустые строки

  • необходимо было очищать таблицу от строк  с наименованиями колонок

Это моя первая публикация. Буду рад вашим исправлениям и комментариям. P.S. Код написан только для расширения .xls. 

 

&НаКлиенте
Процедура ЗагрузитьExcel(Команда)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите файл";
	Диалог.Фильтр = "|*.xls";
	Диалог.МножественныйВыбор = Ложь;
	
	Если Диалог.Выбрать() Тогда
		
		Адрес = "";
		ПоместитьФайл(Адрес,Диалог.ПолноеИмяФайла,,Ложь);
		ЗагрузитьНаСервере(Адрес);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗагрузитьНаСервере(Адрес)

	ТЗ = ЗагрузитьТаблицуExcelНаСервере(Адрес);
    //далее код работы с ТЗ ....
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗагрузитьТаблицуExcelНаСервере(Адрес)
	
	ФайлИзХранилища =  ПолучитьИзВременногоХранилища(Адрес);
	ВременныйФайл = ПолучитьИмяВременногоФайла("xls");
	//Сохранение во временнный файл на диске
	ФайлИзХранилища.Записать(ВременныйФайл);
	//Если опущен, тогда 1-й лист
	еБаза=Новый COMОбъект("ADODB.Connection");
	СтрокаПодключения = "
	|Provider=Microsoft.Jet.OLEDB.4.0;
	|Data Source="+ВременныйФайл+";
	|Extended Properties=""Excel 8.0;IMEX=1;HDR=NO;"";";
	
	Попытка 
		еБаза.Open(СтрокаПодключения);	
	Исключение
		
		СтрокаПодключения = "
		|Provider=Microsoft.ACE.OLEDB.12.0;
		|Data Source="+ПутьКФайлу+";
		|Extended Properties=""Excel 12.0;IMEX=1;HDR="+?(HDR,"Yes","No")+";"";";
		
		Попытка                        		
			еБаза.Open(СтрокаПодключения);		
		Исключение                     		
			Сообщить(ОписаниеОшибки());
		КонецПопытки;
		
	КонецПопытки;
	
	Catalog = Новый COMОбъект("ADOX.Catalog");
	Catalog.ActiveConnection = еБаза;
	лСпис=Новый СписокЗначений;
	лИмяЛиста="";
		
	Для iCount = 0 По Catalog.Tables.Count-1 Цикл
		Если Catalog.Tables.Item(iCount).Type <> "VIEW" Тогда
			лСпис.Добавить(Catalog.Tables.Item(iCount).Name);	
		КонецЕсли;
	КонецЦикла;
	
	Если лСпис.Количество()>0 И лИмяЛиста="" тогда
		лИмяЛиста = лСпис[0];
	Конецесли;
	
		
	Catalog=Неопределено;
	лСтрВнЗапроса="select * from ["+лИмяЛиста+"]";
	
	RS = Новый  COMОбъект("ADODB.Recordset");
	
	rs.Open(лСтрВнЗапроса,еБаза,0);
	
	лТз=Новый ТаблицаЗначений;
	
	ЕстьОшибкиВИмениКолонки=Ложь;
	
	Для iCount = 0 По rs.Fields.Count-1 Цикл
		
		Если СокрЛП(rs.Fields.Item(iCount).Value) = "" Тогда //прервём на пустой ячейке имени колонки
			Прервать;
		КонецЕсли; 
		
		Попытка
			лТз.Колонки.Добавить(rs.Fields.Item(iCount).Value,, rs.Fields.Item(iCount).Name); // Считаем что в первой строке заголовки колонок
		Исключение
		    Сообщить(ОписаниеОшибки()+" «"+(rs.Fields(iCount).Value)+"»");
			ЕстьОшибкиВИмениКолонки = Истина;
		КонецПопытки;	
		
	КонецЦикла;
	
	Если ЕстьОшибкиВИмениКолонки Тогда //прерываем, чтобы исправили
		Возврат лТз;
	КонецЕсли;
	
	// Перебор данных
	Строк=0;
	rs.MoveFirst();                 
	
	//пользователь выделил цветом весь лист Excel, в том числе и пустые ячейки
	//добавим переменную для счета количества пустых ячеек, 
	//как только будет 10 пустых ячеек, считаем, что уже закончились строки в таблице
	
	СчПустых = 0;
	ПустыеСтроки = 0;
	
	Пока rs.EOF() = 0 Цикл
		
		СчПустых = 0;
		Строк=Строк+1;
		//как только будет 10 пустых ячеек, считаем, что уже закончились строки в таблице
		Если ПустыеСтроки = 10 Тогда
			Прервать;
		КонецЕсли;
		
		лТз.Добавить();
		
		Для iCount = 0 По rs.Fields.Count-1 Цикл
			
			Если СчПустых = 3 Тогда //подряд три пустых ячейки, прервём
				СчПустых = 0;//уменьшим
				ПустыеСтроки = ПустыеСтроки+1;
				//Если три первые ячейки строки пустые, то удаляем строку
				Если лТз[лтз.Количество()-1][0]=Неопределено И лТз[лтз.Количество()-1][0] = лТз[лтз.Количество()-1][1] И лТз[лтз.Количество()-1][1] = лТз[лтз.Количество()-1][2] Тогда
					лТз.Удалить(лТз[лтз.Количество()-1]);
				КонецЕсли;	
				Прервать;
			КонецЕсли;
		
			Если Строка(rs.Fields(iCount).Value) = "" Тогда
				СчПустых = СчПустых+1;
				Продолжить;
			КонецЕсли; 
			
			Попытка
				лТз[лтз.Количество()-1][iCount]=Строка(rs.Fields(iCount).Value);
				ПустыеСтроки = 0;
			Исключение
				Прервать;
			КонецПопытки;					
		КонецЦикла;
		rs.MoveNext();  
	КонецЦикла;
	rs=Неопределено;
	еБаза.Close();
	еБаза=Неопределено;
	УдалитьИзВременногоХранилища(Адрес);
	//Удалим первую строку с наименованием колонок
	Если лТз[0][0] = лТз.Колонки[0].Имя Тогда
		лТз.Удалить(лТз[0]);
	КонецЕсли; 
	
	Возврат лТз;
	
КонецФункции

 

загрузка Excel ADODB

См. также

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    210244    621    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    150760    365    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    31911    220    63    

118

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

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

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

4800 руб.

07.06.2022    15089    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    101416    296    173    

312

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    214971    923    886    

939
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 3119 03.05.17 00:52 Сейчас в теме
на загрузку через ADO я плюнул много лет назад, когда при первой же попытке применить сей инструмент на первом же файле (а я промучался часа четыре) - выяснилось что из прайса ~10тысяч строк возвращается тупо порядка ~4000, хотя при обычном открытии экселем и обычным чтением из экселя все нормально проходило. и ADO на ДРУГИХ файлах - нормально проходило. А вот на этом - фигушки. так как я не спец в этих делах, а загрузку надо было ставить в автомат в продакшен - ADO благословеннно почил в бозе.. так я его и не освоил...
2. unichkin 1559 16.05.17 23:15 Сейчас в теме
Можно было лишние поля прямо в запросе отсеять.. Собственно, возможность указывать фильтр в запросе - одна из фишек ADO. Еще его используют когда:
- надо работать с Excell на сервере (а устанавливать его на сервер нельзя)
- надо читать большие объемы, без загрузки их в память (recordset) - в этом случае быстрее работает, чем перебор строк в Excell.Application
Но не всегда ADO выгоднее - его минусы в том, что всякий раз надо муздыкаться с драйверами. Локально у себя - все отлично, только передал клиенту, начинаются вопросы "что это он про какой-то драйвер спрашивает".. Поэтому для себя определился так, что ADO применять только в двух выше описанных случаях. А если файл небольшой, и работа идет на клиенте - вполне можно использовать чтение через Excell, работая с диапазонами (http://infostart.ru/public/20090/). Если все делать через range - в случае небольших книг по скорости не уступает ADO. Кстати, через range можно и записывать.
3. dakork 32 05.06.17 15:15 Сейчас в теме
Для использования ADO нет необходимости в установке msoffice.
4. KazanKokos 10 05.06.17 15:17 Сейчас в теме
сам когда делал выбор адо-неадо столкнулся с тем что не нашел в АДО уровень группировки строк, который есть в ексель.аппликейшн, а мне надо было загруженную номенклатуру раскидывать по папкам + еще прибавлять к имени номенклатуры названия папок двух верхних уровней и пришлось от АДО отказываться
Оставьте свое сообщение