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