Разработка обработок для 1С

Загрузка данных из Excel средствами 1С

Относительно недавно в платформе 1С версии 8.3.6 и выше появилась возможность импортировать файлы Excel средствами встроенного языка в табличный документ. Это позволило считывать данные из Excel файлов без установленного на ПК Excel. Это особенно стало актуально, когда приходится работать с данными файла на сервере.

 Для этого всего лишь необходимо создать табличный документ и с помощью его метода Прочитать() считать данные файла Excel. Здесь надо иметь в виду, что метод прочитать() может долго отрабатывать на файлах большого объема:

ИмяФайла = ПутьКПапкеСФайлом + "ИмяФайла.xlsx";
ТабличныйДокумент = Новый ТабличныйДокумент;
Попытка
	ТабличныйДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
	Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;

Здесь надо обратить внимание на еще одно относительно недавно появившееся нововведение:  у метода Прочитать() параметр: СпособЧтенияЗначенийТабличногоДокумента  (доступен, начиная с версии 8.3.4.) -  определяет, каким образом нужно интерпретировать значения, считываемые из исходного документа XLS, XLSX или ODS. При загрузке табличного документа из формата Excel 97 - 2010 и OpenOffice Calc, в случае если в ячейке исходного документа содержалось значение типа Дата или Число, то в ячейку результирующего табличного документа это значение попадает в зависимости от значения этого параметра. По умолчанию значение Текст, если установить Значение, то считываться будет значение ячеек.

И еще одна особенность: начиная с платформы версии 8.3.10 каждый лист Excel файла грузится в отдельную область, таким образом можно считывать данные с отдельных листов файла, получая соответствующую область табличного документа. Имя области табличного документа будет равна имени листа Excel файла. Таким образом:

//Здесь считываем данные нужного нам листа файла Excel уже из табличного документа
ОбластьФайла = ТабличныйДокумент.ПолучитьОбласть(ИмяЛиста);

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

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

&НаКлиенте
Процедура ПрочитатьФайл(Команда)
	
  //Пусть на форме имеется поле ПутьКФайлу
  Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
	ОбработкаОкончанияЗагрузки = Новый ОписаниеОповещения("Обработчик_Завершения_Загрузки", ЭтотОбъект, ПутьКФайлу);
	НачатьПомещениеФайла(ОбработкаОкончанияЗагрузки, , ПутьКФайлу, Ложь, ЭтаФорма.УникальныйИдентификатор);
  Иначе	
	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = НСтр("ru = 'Файл не выбран!'; en = 'File is empty!'");
	Сообщение.Поле = "";
	Сообщение.Сообщить();
	Возврат;	
  КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Обработчик_Завершения_Загрузки(Результат, ДопПараметры, ИмяФайла, П2) Экспорт	
	
	Если НЕ Результат Тогда
		Возврат
	КонецЕсли;	
	
	ВременноеХранилище = ДопПараметры;
	
	Попытка		
		ЗагрузкаЛиста();
        ЧтениеФайлаВыполнено = Истина;
	Исключение
		ДанныеНайдены = Ложь;
        ЧтениеФайлаВыполнено = Ложь;
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = НСтр("ru = 'Ошибка. Возможно неверно указан наименование листа книги Excel.'; en = 'Error File!'");
		Сообщение.Сообщить();
		Возврат;
	КонецПопытки;
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузкаЛиста()
	
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(ВременноеХранилище);
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	
	Попытка
		ДвоичныеДанные.Записать(ИмяВременногоФайла);
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = НСтр("ru = 'Ошибка чтения файла Excel.'; en = 'Error reading Excel file.'");
		Сообщение.Сообщить();
		Возврат Ложь;
	КонецПопытки;
	
	ТабДокумент.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	
	Попытка	
		//ИмяЛистаДляЗагрузки - текстовое поле формы с именем лсита Excel, 
		//можно сразу прописать, например, "Лист1"
		ТабДок = ТабДокумент.ПолучитьОбласть(ИмяЛистаДляЗагрузки);
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = НСтр("ru = 'Ошибка. Возможно неверно указан наименование листа книги Excel.'; en = 'Error.'");
		Сообщение.Сообщить();
		Возврат Ложь;
	КонецПопытки;
	
	RowCount = ТабДок.ПолучитьРазмерОбластиДанныхПоВертикали(); 	
	
	//ПерваяСтрокаКЗагрузке - номер первой строки, задается в форме.
	//Если надо считывать с первой строки, то можно сразу написать Row =1 
	Для Row = ПерваяСтрокаКЗагрузке По RowCount Цикл
		//построчно считываем данные строк, например
		СтрТЗ = Сотрудники.Добавить();
		//где Сотрудники - некоторая таблица значений, например, на форме
		//ТабДок.Область(Row, 1, Row, 1).Текст - текст из ячейки табличного документа из строки номер Row из первой колонки
		СтрТЗ.ТабельныйНомер = СокрЛП(ТабДок.Область(Row, 1, Row, 1).Текст); 	 
	КонецЦикла;
	
КонецПроцедуры

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

 

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

# User 04.12.2020 11:04
Спасибо. Пригодится.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Еще почитать: