Загрузка данных из Excel через COM Microsoft Excel, Open Office или Libre Office (управляемые формы)

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

Разработка - Обмен данными 1С - Загрузка и выгрузка в Excel

эксель ексель excel open libre OpenOffice LibreOfice загрузка обработка таблица

Болванка обработки для загрузки данных из файла электронной таблицы Excel. Работает как с установленным на машине Microsoft Excel, так и с OpenOffice или LibreOffice. Под управляемые формы. Разрабатывалось на платформе 8.3.16, но будет работать и на более старых версиях.

Обработка представляет собой просто заготовку для загрузки данных из файла Excel. Она позволяет работать как с платным (или успешно ломанным) Microsoft Excel на компьютере, так и с бесплатными Open Office или Libre Office (которые все чаще используются во многих компаниях).

 

 

Сразу сообщаю - обработка не является неким универсальным загрузчиком, в котором можно извратиться и загрузить все что угодно из Excel не заглядывая в конфигуратор.

Я не сторонник подобных решения, т.к. как правило 95% пользователей 1С не в состоянии таким механизмом воспользоваться - просто не хватит навыков в программировании и построении запросов. И получается что подобные мощные и гибкие загрузчики по большей части тешат самолюбие их авторов.

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

Плюс обработки в том, что не надо лезть в куски кода работы с COM-объектами, а сразу в нужном месте написать свой кусок и использовать. Для этого достаточно почитать комментарии к коду и вставить свои куски вот в этих двух процедурах:

&НаКлиенте
Процедура ВыполнитьЗагрузку()
	
	Перем Источник, КоличествоСтрок, КоличествоКолонок, ЗначениеЯчейки, СтруктураCOMОбъектов;
	
	//Отказ готовим на случай если надо будет не продолжать загрузку данных на сервере.
	Отказ = Ложь;
	
	//Инициализация обработчика
	ТекстОшибки = ИнициализироватьИсточникДанных(Источник, КоличествоСтрок, КоличествоКолонок, СтруктураCOMОбъектов);
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
		Возврат;
	КонецЕсли;
	
	//Готовим массив под строки.
	//Каждая строка будет представлена в виде структуры.
	МассивОбработки = Новый Массив;
	
	Для ТекНомерСтроки = Объект.НомерНачальнойСтроки ПО КоличествоСтрок Цикл
		
		//Получение значений ячеек и помещение в структуру
		СтруктураСтроки = Новый Структура("НомерСтрокиФайла", ТекНомерСтроки); //Для того чтобы можно было состыковать с какой строкой таблицы файла работаем
		
		//...
		//Текст обработчика - получение данных из таблицы файла.
		
		//Заменяем ключи структуры на нужные нам. Номера колонок указываем так же - какие нам нужны
		СтруктураСтроки.Вставить("Заголовок1", ПолучитьЗначениеЯчейки(Источник, 1, ТекНомерСтроки));
		СтруктураСтроки.Вставить("Заголовок2", ПолучитьЗначениеЯчейки(Источник, 2, ТекНомерСтроки));
		СтруктураСтроки.Вставить("Заголовок3", ПолучитьЗначениеЯчейки(Источник, 3, ТекНомерСтроки));
		СтруктураСтроки.Вставить("Заголовок4", ПолучитьЗначениеЯчейки(Источник, 4, ТекНомерСтроки));
		
		//...
		
		//Помещаем сформированную структуру в массив
		МассивОбработки.Добавить(СтруктураСтроки);
	КонецЦикла;
	
	//Закрываем обработчик
	ТекстОшибки = ЗакрытьОбработчик(Источник, СтруктураCOMОбъектов);
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
		Возврат;
	КонецЕсли;
	
	//Передаем массив на сервер для уже собственно загрузки данных
	//Если установлена галочка, то выводим загруженные данные пользователю на просмотр в виде табличного документа.
	//Пользователь может отменить дальнейшую обработку, если его что-то не устраивает в данных.
	Если Не Отказ Тогда
		Если Объект.ОтображатьЗагруженныеДанные Тогда
			МожноПродолжатьЗагрузку = ОткрытьФормуМодально("ВнешняяОбработка.БолванкаИмпортаИзExcelИOpenOffice.Форма.ФормаРезультатаЗагрузки", Новый Структура("МассивОбработки", МассивОбработки), ЭтаФорма);
			Если МожноПродолжатьЗагрузку Тогда
				ОбработатьПолученныеДанныеНаСервере(МассивОбработки);
			Иначе
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Обработка прервана!");
			КонецЕсли;
		Иначе
			ОбработатьПолученныеДанныеНаСервере(МассивОбработки);
		КонецЕсли;
	КонецЕсли;
		
КонецПроцедуры //ВыполнитьЗагрузку()

&НаСервере
Процедура ОбработатьПолученныеДанныеНаСервере(МассивОбработки)
	
	Для Каждого СтруктураСтроки Из МассивОбработки Цикл
		
		//...
		//Текст обработчика - загрузка данных из полученного массива структур строк.
		//...
		
	КонецЦикла;
	
	ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Обработка завершена!");
	
КонецПроцедуры //ОбработатьПолученныеДанныеНаСервере()

...не заглядывая в остальные места )))

В общем свой код вставляйте тут:

и тут:

 

Сами куски кода работы с COM-объектами естественно не мои - по работе с экселем уже и не вспомню откуда брал изначально, а по Опен офису помогла вот эта статья: 1С и работа с Excel, OpenOffice/LibreOffice, ADODB (за что огромное спасибо автору!)

Для понимания работы, ну и собственно проверки работоспособности обработки - добавил кнопочку, которая сохранит из бинарного макета обработки на диск тестовый файл Excel, чтобы его можно было бы выбрать и протестировать работу загрузчика.

Прошу помидорами в комментах не закидывать - еще раз, не претендую на какую-либо оригинальность, просто причесал инструмент под себя, и решил, что, может, еще кому пригодится ))

Разрабатывалось на платформе 8.3.16, но будет работать и на более старых версиях.

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

Наименование Файл Версия Размер
Обработка по загрузке данных из Excel через COM Microsoft Excel, Open Office или Libre Office (Управляемые формы)

.epf 21,95Kb
0
.epf 21,95Kb Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kembrik 3 10.06.21 09:08 Сейчас в теме
Про оригинальность не скажу, скажу за универсальность. Очень часто при парсинге Excel от иностранных партнеров хочется с одной стороны сохранить заголовки таблицы для обращения к ним через точку (или сходным по удобству способом), с другой стороны - обработка не должна падать, если ключ структуры будет начинается с числа, Unicode символов и тому подобного. Опять же иногда приходится нормализовывать к одному типу, при вашем подходе если не прописать заранее, то придется каждый раз смотреть, как незаполненную ячейку преобразовывать, как 0 или как "". В конце концов остановились на подходе - каждую колонку в отдельный массив без заголовка, только значения, эти колонки в другой массив, где по индексу мы как раз нужную колонку и получим, в первой строке массива массивов (индекс(0)) - имена колонок, а в первой строке массива по колонке - индекс смещения первой строки. И вот эту вот красоту удобно потом проверять на предмет всё ли загрузилось (ибо известные подходы определения конца таблицы бывает, сбоят), обращаться к значениям практически по координатной плоскости, короче, удобно
2. Homyak 15 10.06.21 12:59 Сейчас в теме
Спасибо за мнение, просто у меня это скорее "гаечный ключ" программисту для решения конкретной разовой задачи, а не постоянно используемый механизм. Поэтому я не заморачивался на тему контроля и надежности.
3. Cерый 16 11.06.21 12:40 Сейчас в теме
Предлагаю рассмотреть вариант помещения запрашиваемых данных/именованных диапазонов Excel в МенеджерВременныхТаблиц, тогда на уровне обработки данные Excel можно будет извлекать запросом 1С.
Оставьте свое сообщение

См. также

Универсальная выгрузка/загрузка данных для отличающихся конфигураций (JSON, Такси+ОФ) Промо

Перенос данных из 1C8 в 1C8 Универсальные обработки Распределенная БД (УРИБ, УРБД) v8 1cv8.cf Абонемент ($m)

Простой перенос через JSON данных между двумя базами 1С (документов, справочников, ПВХ, ПВР, счетов). Аналогична произвольной выгрузке в типовой "Выгрузка/загрузка XML", но может использоваться для отличающихся конфигураций. Подходит для любых пар баз с любым интерфейсом (управляемый + обычный). Без настроек. Не требует идентичности конфигураций и платформ. При переносе типы данных сопоставляются по наименованиям метаданных, объекты и ссылки по UID.

1 стартмани

22.10.2014    217979    4311    ekaruk    184    

Загрузка данных из 1С МиниДеньги в 1С:Деньги 8, редакция 2.0

Обмен через XML Перенос данных из 1C8 в 1C8 v8 Домашние учет и финансы УУ Абонемент ($m)

Обработка для первоначальной загрузки данных (справочников и операций) в настольную программу 1С:Деньги 8, редакция 2.0 из файлы резервной копии мобильной программы 1С Миниденьги.

2 стартмани

01.10.2015    16490    15    Claus32    5    

Редактор чеков ККМ Розница 2.0 - 2.3

Обработка документов Кассовые операции Розничная торговля Кассовые операции Розничная торговля v8 Розница Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд БУ НУ Абонемент ($m)

Обработка чеков ККМ списком (редактирование, удаление, ...). Переформирование ОРП, связь чеков с ОРП. Редактирование времени КС. Редактирование суммы и времени выемки.

1 стартмани

06.08.2015    57263    544    Dima_    83    

Загрузка из Excel в 1С:Розница

Обработка документов Обработка справочников Загрузка и выгрузка в Excel Учет ТМЦ Учет ТМЦ v8 Розница Россия УУ Абонемент ($m)

Универсальная загрузка Excel файлов в 1С:Розница 2.0

1 стартмани

27.05.2015    15720    110    KarinaSV    7    

Автоматическая установка себестоимости номенклатуры для конфигурации Розница 2.0 (2.1) +Бонус, исправляем ошибки при настройке расписания запуска для внешних обработок в Рознице 2.0

Ценообразование, прайсы Обработка документов Розничная торговля Ценообразование, анализ цен Розничная торговля Ценообразование, анализ цен v8 Розница Розничная и сетевая торговля (FMCG) Россия УУ Абонемент ($m)

Обработка для автоматического создания документов Установка себестоимости, в случае если себестоимость не установлена на момент продажи. Помогает упростить установку себестоимости номенклатуры, если у вас в базе ведется учет по нескольким магазинам. Тестировалась на релизе 2.0.8.12 и 2.1.7.14. Подойдет для тех систем, где себестоимость номенклатуры одинакова для всех магазинов.

1 стартмани

31.03.2014    28421    74    sanches    15    

Выемка денежных средств из КассыККМ. Розница 2.0

Кассовые операции ККМ Кассовые операции v8 Розница УУ Абонемент ($m)

Уставшим от отсутствия ВыемкиДС после закрытия кассовой смены посвящается. Подключаемая обработка. Управляемый интерфейс.

1 стартмани

12.12.2012    78957    527    StepByStep    40