С недавних пор (относительно) 1С умеет загружать файлы эксель в табличный документ. Причём листы раскидывает на области. Обработка идет на удивление быстро, по сравнению со «старым» способом, через COM соединение с Excel.
Вот пример обработки файла:
1.Выбираем файл на «клиенте» и передаем его на «сервер»:
&НаКлиенте
Процедура ЗагрузкаПрайса(Команда)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = НСтр("ru = 'Текст'; en = 'Text'")+ "(*.xlsx)|*.xlsx";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Истина;
ДиалогОткрытияФайла.Заголовок = "Выберите файл(ы)";
Если ДиалогОткрытияФайла.Выбрать() Тогда
МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
Для Каждого ИмяФайла Из МассивФайлов Цикл
ВыбФайл = Новый Файл(ИмяФайла);
Сообщить(ИмяФайла+ НСтр("ru = '; Размер = '; en = '; Size = '")+ ВыбФайл.Размер());
АдресВременногоХранилища = "";
ПоместитьФайл(АдресВременногоХранилища, ИмяФайла, , Ложь, ЭтаФорма.УникальныйИдентификатор);
ЗагрузкаПрайсаНаСервере(АдресВременногоХранилища);
конеццикла;
конецесли;
КонецПроцедуры
2. Обрабатываем файл на «Сервере»:
&НаСервере
Процедура ЗагрузкаПрайсаНаСервере(АдресВременногоХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
сообщить(ИмяВременногоФайла);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ИмяВременногоФайла,СпособЧтенияЗначенийТабличногоДокумента.Значение);
//листаем все листы
Для Каждого ОбластьТД ИЗ ТабличныйДокумент.Области Цикл
ОбластьФайла = ТабличныйДокумент.ПолучитьОбласть(ОбластьТД.Имя);
КолВоСтрокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоВертикали();
КолВоКолонокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоГоризонтали();
Сообщить("Строк:"+КолВоСтрокФайла);
Сообщить("Колонок:"+КолВоКолонокФайла);
имялиста=ОбластьТД.Имя;
Сообщить("Лист:"+имялиста);
МассивИменКолонок=Новый Массив();
// читаем шапку листа
Для ит=1 ПО КолВоКолонокФайла Цикл
нКолонка = СтрЗаменить(ит, Символы.НПП, "");
ИмяКолонки=ОбластьФайла.ПолучитьОбласть("R1" + "C"+нКолонка).ТекущаяОбласть.Текст;
сообщить("- колонка: "+ИмяКолонки);
МассивИменКолонок.Добавить(ИмяКолонки);
конеццикла;
НачСтрока=0;КонСтрока=0;
НачСтрока = ?(НачСтрока = 0, 2, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрокФайла, КонСтрока);
//перебираем все строки без первой строки
Для нСтрокаТФ = НачСтрока ПО КонСтрока Цикл
нСтрока = СтрЗаменить(нСтрокаТФ, Символы.НПП, "");
СодержимоеСтроки=Новый Массив();
Для нКолонкаТФ = 1 ПО КолВоКолонокФайла Цикл
нКолонка = СтрЗаменить(нКолонкаТФ, Символы.НПП, "");
Область = ОбластьФайла.ПолучитьОбласть("R"+нСтрока+"C"+нКолонка);
ТекущаяОбласть = Область.ТекущаяОбласть;
ЗначениеЯчейки = СокрЛП(ТекущаяОбласть.Текст);
СодержимоеСтроки.Добавить(ЗначениеЯчейки);
конеццикла;
// ОбработатьСписокЗначений в "СодержимоеСтроки"
конеццикла;
конеццикла;
КонецПроцедуры