Загрузка данных в 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);
			
		КонецЕсли;
		
	КонецЦикла;
	
	ТаблицаЗначенийИзЭксель = Неопределено;
			
	Сообщить("Загрузка завершена"); 
	
КонецПроцедуры

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

Комментарии

  • Гринёв 20.12.2017 09:45
    Только надо иметь ввиду, что СтандартнаяОбработка = Ложь в процедуре ПриКомпоновкеРезультата отключает стандартную расшифровку полей отчёта.

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

     
  • proekt 06.12.2017 10:03
    Привет. Обработка проведения РасходнойНакладной запрос от проведения ПланаПродаж необходимо подправить запрос для Расходной. Такой вопрос при проведении Расходной накладной почему сразу в запросе не ...

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

     
  • Ivan 01.11.2017 14:14
    Неверно. Так мы узнаем DNS сервер по умолчанию, но он не обязательно совпадает с контроллером домена. Нужно так > set logon В ответе получим имя сервера, на котором мы залогинились.

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