Читаем данные из Excel в 1С

Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.
Пример 2-х функций которые я использую:

  • ИзExcelВТаблицу — Читает Excel в ТаблицуЗначений
  • ЭлементСправочника — Создает или находит элемент справочника.

Теперь сам код

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

	ЗакрытьФормуИндиктаора = Ложь;	
	Если ФормаИндикатора = Неопределено тогда
		ЗакрытьФормуИндиктаора = Истина;
		ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");		
		ФормаИндикатора.Открыть();	
	КонецЕсли;		
	ФормаИндикатора.КомментарийЗначения = "Загрузка данных из Excel...";
	
	ТЗ = Новый ТаблицаЗначений();	
	Страница = Док.Sheets(НомерСтраницы);
	МакСтрок = Страница.UsedRange.Rows.Count;		// макс. колич. строк
	МакСтолб = Страница.UsedRange.Columns.Count;	// макс. колич. столбцов	
	
	Для Столбец = 1 по МакСтолб цикл
		ИмяСтолбца = "Столбец_"  + Столбец;
		Если ПерСтрокаЗаголовок тогда
			ИмяСтолбца = Страница.Cells(1,Столбец).Value;
			ИмяСтолбца = СокрЛП(ИмяСтолбца);
			ИмяСтолбца = СтрЗаменить(ИмяСтолбца," ","_");
		КонецЕсли;						
		ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
	КонецЦикла;	
	
	НачальнаяСтрока = 1;	
	Если ПерСтрокаЗаголовок тогда                                       
		НачальнаяСтрока = 2;
	КонецЕсли;			
	
	Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
		СтрТЗ = ТЗ.Добавить();
		Для НомСтолбец = 1 по МакСтолб цикл
			Данные = Страница.Cells(НомСтрока,НомСтолбец).Value; 				
			СтрТЗ[НомСтолбец-1] = Данные;
		КонецЦикла;		
		
		ФормаИндикатора.ЭлементыФормы.Индикатор.Значение = НомСтрока/МакСтрок * 100;		
	КонецЦикла;		
	
	Если ЗакрытьФормуИндиктаора тогда
		ФормаИндикатора.Закрыть();
	КонецЕсли;		
	
	Возврат ТЗ;	
КонецФункции			

И пример вызова:

ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.НаименованиеОбработкиДанных = "Загрузка данных...";		
ФормаИндикатора.Открыть();	
	
ТЗ = ИзExcelВТаблицу(ФайлExcel,1,Истина,ФормаИндикатора);		
Если ТЗ = Неопределено тогда
	ФормаИндикатора.Закрыть();
	Возврат;
КонецЕсли;				
	
ФормаИндикатора.Закрыть();

Или так

ТЗ = ИзExcelВТаблицу(ФайлExcel);		
Если ТЗ = Неопределено тогда
	Возврат;
КонецЕсли;				

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

// Создаем в справочнике "ИмяСправочника" элемент
// ИмяЭлемента - Имя созданного элемента в справочнике "ИмяСправочника"
// ИмяРодителя - Имя родительского элемента (отсутствует если не древовидный).
//				 Разделитель  позволяет писать древовидный путь родителя из нескольких элементов
// Параметры - Соответствие содержащие список параметров для элемента
// СоздатьЕслиНетЭлемента - Создает элемент если нет. Иначе ищет и обновляет
Функция ЭлементСправочника(ИмяСправочника = "",ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
	Если ИмяСправочника = "" тогда
		Сообщить("Укажите имя спрачоника - ЭлементСправочника()");
		Возврат Неопределено;
	КонецЕсли;		
	
	Если ПустаяСтрока(ИмяЭлемента) тогда
		Возврат Неопределено;
	КонецЕсли;		
	
	// Создаем или ищем родителя
	Родитель = Неопределено;	
	Если ИмяРодителя <> Неопределено тогда
		
		ОбрабатИмяРодителя = ИмяРодителя;
		РодительГруппы = Справочники[ИмяСправочника].ПустаяСсылка();
		
		Пока НЕ ПустаяСтрока(ОбрабатИмяРодителя) цикл
			
			ПозРазделителя = Найти(ОбрабатИмяРодителя,"");
			Если ПозРазделителя = 0 тогда
				ИмяГруппы = ОбрабатИмяРодителя;
				ОбрабатИмяРодителя = ""                       
			Иначе
				ИмяГруппы = Сред(ОбрабатИмяРодителя,1, ПозРазделителя-1); 				
				ОбрабатИмяРодителя = Сред(ОбрабатИмяРодителя,ПозРазделителя+2); 				
			КонецЕсли;		
			
			ТексЗапроса = "ВЫБРАТЬ
			              |	Данные.Ссылка
			              |ИЗ
			              |	Справочник."+ИмяСправочника+" КАК Данные
			              |ГДЕ
			              |	Данные.Родитель = &Родитель
			              |	И Данные.Наименование = &Наименование
						  | И Данные.ЭтоГруппа";
						  
			ЗапросРодителя = Новый Запрос(ТексЗапроса);
			ЗапросРодителя.УстановитьПараметр("Родитель", РодительГруппы);
			ЗапросРодителя.УстановитьПараметр("Наименование", ИмяГруппы);
			РезультатРодителя = ЗапросРодителя.Выполнить().Выгрузить();	

			// Создаем родителя в случае необходимости			
			Если РезультатРодителя.Количество() <> 0 тогда
				РодительГруппы = РезультатРодителя[0].Ссылка
			Иначе 				
				ОбъектРодитель = Справочники[ИмяСправочника].СоздатьГруппу();
				ОбъектРодитель.Родитель = РодительГруппы;
				ОбъектРодитель.Наименование = ИмяГруппы;
				ОбъектРодитель.Записать();
				РодительГруппы = ОбъектРодитель.Ссылка;
			КонецЕсли;				
		КонецЦикла;			
		Родитель = РодительГруппы;
	КонецЕсли;		
	
	// Создаем или ищем элемент
	Элемент = Справочники[ИмяСправочника].НайтиПоНаименованию(ИмяЭлемента);
	ОбъектЭлемент = Неопределено;
	
	Если Элемент.Пустая() тогда
		Если СоздатьЕслиНетЭлемента тогда
			ОбъектЭлемент = Справочники[ИмяСправочника].СоздатьЭлемент();
			ОбъектЭлемент.Наименование = ИмяЭлемента;
		Иначе 
			Элемент = Неопределено
		КонецЕсли;				
	Иначе
		ОбъектЭлемент = Элемент.ПолучитьОбъект(); 
	КонецЕсли;	
	
	
	Если ОбъектЭлемент <> Неопределено тогда        
		// Устанвалвиаем доп. параметры	
		Если Параметры <> Неопределено тогда		
			Для каждого СтрПараметр из Параметры цикл				
				ОбъектЭлемент[СтрПараметр.Ключ] = СтрПараметр.Значение;
			КонецЦикла;			
		КонецЕсли;	
				
		Если Родитель <> Неопределено тогда		
			ОбъектЭлемент.Родитель = Родитель;	
		КонецЕсли;
	
		ОбъектЭлемент.Записать();					
		Элемент = ОбъектЭлемент.Ссылка;	
	КонецЕсли;		
		
	Возврат Элемент;
КонецФункции	

Читаем данные из Excel в 1С: 1 комментарий

  1. Radzhab

    Очень медленно обрабатывает большие листы Excel/ Лучше юзать ComArray///// Это так …. мысливслух

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *