Быстрая обработка файла эксель средствами 1С
С недавних пор (относительно) 1С умеет загружать файлы эксель в табличный документ. Причём листы раскидывает на области. Обработка идет на удивление быстро, по сравнению со «старым» способом, через COM соединение с Excel.
Вот пример обработки файла:
1.Выбираем файл на «клиенте» и передаем его на «сервер»:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | &НаКлиенте Процедура ЗагрузкаПрайса(Команда) 		Режим = РежимДиалогаВыбораФайла.Открытие; 	    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); 	    ДиалогОткрытияФайла.ПолноеИмяФайла = ""; 	    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")+ "(*.xlsx)|*.xlsx"; 	    ДиалогОткрытияФайла.Фильтр = Фильтр; 	    ДиалогОткрытияФайла.МножественныйВыбор = Истина; 	    ДиалогОткрытияФайла.Заголовок = "Выберите файл(ы)"; 	    Если ДиалогОткрытияФайла.Выбрать() Тогда 	        МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; 	        Для Каждого ИмяФайла Из МассивФайлов Цикл 	            ВыбФайл = Новый Файл(ИмяФайла); 	            Сообщить(ИмяФайла+ НСтр("ru = '; Размер = '; en = '; Size = '")+ ВыбФайл.Размер());			 				АдресВременногоХранилища = "";      			ПоместитьФайл(АдресВременногоХранилища, ИмяФайла, , Ложь, ЭтаФорма.УникальныйИдентификатор);    				ЗагрузкаПрайсаНаСервере(АдресВременногоХранилища); 			 конеццикла; 		конецесли;	   					 КонецПроцедуры | 
2. Обрабатываем файл на «Сервере»:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | &НаСервере Процедура ЗагрузкаПрайсаНаСервере(АдресВременногоХранилища) 	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); 	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx"); 	ДвоичныеДанные.Записать(ИмяВременногоФайла); 	сообщить(ИмяВременногоФайла); 	ТабличныйДокумент = Новый ТабличныйДокумент; 	ТабличныйДокумент.Прочитать(ИмяВременногоФайла,СпособЧтенияЗначенийТабличногоДокумента.Значение); 	//листаем все листы 	Для Каждого ОбластьТД ИЗ ТабличныйДокумент.Области Цикл			 			ОбластьФайла = ТабличныйДокумент.ПолучитьОбласть(ОбластьТД.Имя); 			КолВоСтрокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоВертикали(); 			КолВоКолонокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоГоризонтали(); 			Сообщить("Строк:"+КолВоСтрокФайла); 			Сообщить("Колонок:"+КолВоКолонокФайла);			 			имялиста=ОбластьТД.Имя; 			Сообщить("Лист:"+имялиста);			 					МассивИменКолонок=Новый Массив(); 					// читаем шапку листа 					Для ит=1 ПО КолВоКолонокФайла Цикл 						нКолонка = СтрЗаменить(ит, Символы.НПП, ""); 						ИмяКолонки=ОбластьФайла.ПолучитьОбласть("R1" + "C"+нКолонка).ТекущаяОбласть.Текст; 						сообщить("- колонка: "+ИмяКолонки); 						МассивИменКолонок.Добавить(ИмяКолонки); 					конеццикла;	 					НачСтрока=0;КонСтрока=0; 					НачСтрока = ?(НачСтрока = 0, 2, НачСтрока); 					КонСтрока = ?(КонСтрока = 0, КолвоСтрокФайла, КонСтрока); 					//перебираем все строки без первой строки			 					Для нСтрокаТФ = НачСтрока ПО КонСтрока Цикл 						нСтрока = СтрЗаменить(нСтрокаТФ, Символы.НПП, ""); 						СодержимоеСтроки=Новый Массив(); 						Для нКолонкаТФ = 1 ПО КолВоКолонокФайла Цикл 							нКолонка = СтрЗаменить(нКолонкаТФ, Символы.НПП, ""); 							Область = ОбластьФайла.ПолучитьОбласть("R"+нСтрока+"C"+нКолонка); 							ТекущаяОбласть = Область.ТекущаяОбласть; 							ЗначениеЯчейки = СокрЛП(ТекущаяОбласть.Текст); 							СодержимоеСтроки.Добавить(ЗначениеЯчейки);					 						конеццикла;			 						// ОбработатьСписокЗначений в "СодержимоеСтроки" 					конеццикла;							 	конеццикла;			 КонецПроцедуры | 
