Загрузка данных в 1С из Эксель - довольно распространённая задача. И если в режиме обычного приложения решить эту задачу не составляет труда, то в управляемом приложении, в режиме тонкого клиента, появляются нюансы, связанные с передачей данных межу клиентом и сервером.

Итак, условие задачи: организовать загрузку данных из файла Эксель в табличную часть элемента справочника. Приложение Майкрософт Эксель установлено только на рабочем компьютере. На сервере его нет.

Первым делом создаём форму справочника, если её ещё нет, и размещаем на форме команду «Загрузить из Эксель».

В модуле формы клиентская процедура:

&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
	
	НомерПервойСтроки = 1;
	НомерПервойКолонки = 1;
	КоличествоСтрокВЭксель = 0;
	КоличествоКолонокВЭксель = 0;
	
	ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбора.Заголовок = "Выберите файл";
	
	Если ДиалогВыбора.Выбрать() Тогда
		
		ИмяФайлаЭксель = ДиалогВыбора.ПолноеИмяФайла;
		
		//Подключаемся к Эксель
		Попытка
			Эксель = Новый COMОбъект("Excel.Application");
			Эксель.WorkBooks.Open(ИмяФайлаЭксель);
			Состояние("Обработка файла Microsoft Excel...");
		Исключение
			Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
		Попытка 
			//Открываем необходимый лист
			Эксель.Sheets(1).Select();  // лист 1, по умолчанию  
		Исключение
			//Закрываем Excel
			Эксель.ActiveWorkbook.Close();  
			Эксель = 0;
			Сообщить("Файл "+Строка(Объект.ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
			Возврат;
		КонецПопытки;
		
		//Получим количество строк и колонок.		
		КоличествоСтрокВЭксель = Эксель.Cells.SpecialCells(11).Row;
		КоличествоКолонокВЭксель = Эксель.Cells.SpecialCells(11).Column;
		
		// Выделяем область на листе Эксель.
		Область = Эксель.Range(Эксель.Cells(НомерПервойСтроки,НомерПервойКолонки), Эксель.Cells(КоличествоСтрокВЭксель,КоличествоКолонокВЭксель));
		
		// Выгружаем область Эксель в двумерный массив.
		Данные = Область.Value.Выгрузить();		
		
		//Отключаемся от Excel 
		Попытка
			Эксель.DisplayAlerts = 0;
			Эксель.ActiveWorkbook.Close();
			Эксель.DisplayAlerts = 1;
			Эксель.Quit(); 
			Эксель = Неопределено;        
		Исключение
			Сообщить("Не удалось отключиться от Excel - " + ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		
		//Далее обрабатываем на сервере полученные из Эксель данные.
		ОбработатьДанныеИзЭксельНаСервере(Данные)
		
	КонецЕсли;
	
КонецПроцедуры

После того как мы на клиенте считали данные из файла Эксель и поместили эти данные в двумерный массив, передаём эти данные на сервер для дальнейшей обработки и заполнения табличной части.

&НаСервере
Процедура ОбработатьДанныеИзЭксельНаСервере(Данные)
	
	ТаблицаЗначенийИзЭксель = Новый ТаблицаЗначений;
	ТаблицаЗначенийИзЭксель.Колонки.Добавить("Номенклатура", , "Номенклатура");
	ТаблицаЗначенийИзЭксель.Колонки.Добавить("Код", , "Код");
	ТаблицаЗначенийИзЭксель.Колонки.Добавить("Цена", , "Цена");
	ТаблицаЗначенийИзЭксель.Колонки.Добавить("Количество", , "Количество");
	
	Счетчик = 1;
	
	Для Индекс = 1 По Данные[0].Количество()-1 Цикл
		
		// Заполняем таблицу значений из массива.
		СтрокаТаблицаЗначенийИзЭксель = ТаблицаЗначенийИзЭксель.Добавить();
		СтрокаТаблицаЗначенийИзЭксель.Номенклатура = СокрЛП(Данные[1][Счетчик]);   // Номенклатура
		СтрокаТаблицаЗначенийИзЭксель.Код = СокрЛП(Данные[2][Счетчик]);            // Код
		СтрокаТаблицаЗначенийИзЭксель.ДирективнаяЦенаСНДС = СокрЛП(Данные[3][Счетчик]); // Цена
		СтрокаТаблицаЗначенийИзЭксель.Количество = СокрЛП(Данные[4][Счетчик]);  //Количество
		
		Счетчик = Счетчик +1;
		
	КонецЦикла;
	
	// Очищаем табличную часть элемента справочника
	Объект.ПозицииНоменклатуры.Очистить();
	
	// Заполняем табличную часть
	Для Каждого СтрокаТЗ Из ТаблицаЗначенийИзЭксель Цикл 
		
		Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СтрокаТЗ.Код);
		
		Если Не ЗначениеЗаполнено(Номенклатура) Тогда
			
			Сообщить("В справочнике «Номенклатура» не найден элемент с кодом " + СтрокаТЗ.Код);
			
		Иначе
			
			НовСтрокаТчПозицииНоменклатуры = Объект.ПозицииНоменклатуры.Добавить();
			НовСтрокаТчПозицииНоменклатуры.Номенклатура = Номенклатура;
			НовСтрокаТчПозицииНоменклатуры.Код = СтрокаТЗ.Код;
			НовСтрокаТчПозицииНоменклатуры.ДирективнаяЦенаСНДС = СтрокаТЗ.Цена;
			НовСтрокаТчПозицииНоменклатуры.Количество = СтрокаТЗ.Количество;
			НовСтрокаТчПозицииНоменклатуры.Стоимость = ?(ЗначениеЗаполнено(СтрокаТЗ.Количество), СтрокаТЗ.Количество, 0)  * ?(ЗначениеЗаполнено(СтрокаТЗ.Цена), Цена, 0);
			
		КонецЕсли;
		
	КонецЦикла;
	
	ТаблицаЗначенийИзЭксель = Неопределено;
			
	Сообщить("Загрузка завершена"); 
	
КонецПроцедуры

В результате имеем табличную часть справочника, заполненную из файла Эксель.

Комментарии

  • Moby 05.07.2018 11:51
    Спасибо! По "Варианту 2" заработало только после добавления ресурса в выбранные поля группировки строк. Не помню что до этого менял, может ресурс там и был когда-то.

    Подробнее...

     
  • MariNew 20.06.2018 15:36
    Отлично!!! У меня получилось!!!! СПАСИБО!

    Подробнее...

     
  • Ирина 09.06.2018 13:05
    Спасибо большое! Пригодилось.

    Подробнее...