1С8. Загружаем данные из файла Excel в табличную часть документа.

Задача - загрузить данные из файла Excel в табличную часть документа.

1С8. Загрузка данных из файла Excel в табличную часть документа.
Скачать обработку (архив RAR)

В этом примере приведен простой код для организации теста (TDD). Это две функции: Asset() и ПервоеРазличиеТекстов(строка1,строка2).


Функция ПолучитьСсылкуНаДокВводНачальныхОстатковДисконтПоНомеруДате(строкаНомерДок,датаДок)

	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ВводНачальныхОстатковДисконт.Ссылка,
	|	ВводНачальныхОстатковДисконт.Номер,
	|	ВводНачальныхОстатковДисконт.Дата
	|ИЗ
	|	Документ.ВводНачальныхОстатковДисконт КАК ВводНачальныхОстатковДисконт
	|ГДЕ
	|	ВводНачальныхОстатковДисконт.Номер = &Номер
	|	И НАЧАЛОПЕРИОДА(ВводНачальныхОстатковДисконт.Дата,День) = НАЧАЛОПЕРИОДА(&Дата,День)";
	//Параметры запроса
	Запрос.УстановитьПараметр("Дата",датаДок);// Дата
	Запрос.УстановитьПараметр("Номер",строкаНомерДок);// Строка
	Результат = Запрос.Выполнить();
	
	Выборка = Результат.Выбрать();
		
	Результат = Неопределено;
	Пока Выборка.Следующий() Цикл
		Результат = Выборка.Ссылка;		
	КонецЦикла;

	Возврат Результат;
	
КонецФункции


// @param   строкаСсылкаНаДокумент "Ввод начальных остатков по информационным картам ЛDБ000076 от 20.03.2012 12:00:05"
// @return  СсылкаНаОбъект
Функция ПолучитьСсылкуНаДокВводНачальныхОстатковДисконт(строкаСсылкаНаДокумент)
	
	строкаНомер_Дата_Время = СтрЗаменить(строкаСсылкаНаДокумент,"Ввод начальных остатков по информационным картам",""); // "ЛDБ000076 от 20.03.2012 12:00:05"
	
	целоеПозицияДаты = Найти(строкаНомер_Дата_Время, " от "); 
	строкаНомер = Сред(строкаНомер_Дата_Время, 0, целоеПозицияДаты);
	
	строкаДата  = Сред(строкаНомер_Дата_Время, целоеПозицияДаты + 4 ,10); // "20.03.2015"
	строкаВремя = Сред(строкаНомер_Дата_Время, целоеПозицияДаты + 15,8);  // "12:00:05"
	
	числоДень  = Число(Сред(строкаДата, 0, 2));	
	числоМесяц = Число(Сред(строкаДата, 4, 2));
	числоГод   = Число(Сред(строкаДата, 7, 4)); 
	
	датаДок = Дата(числоГод, числоМесяц, числоДень);
	
	строкаНомерДок = СокрЛП(строкаНомер) + "    ";                           	
		
	СсылкаНаОбъект = ПолучитьСсылкуНаДокВводНачальныхОстатковДисконтПоНомеруДате(строкаНомерДок,датаДок);
	
	Возврат СсылкаНаОбъект;
	
КонецФункции

функция ЗагрузитьТЧДокВводНачальныхОстатковДисконт(полноеИмяФайлаДанных,ДокументСсылка,Индикатор)    Экспорт  
	
	если ДокументСсылка = Документы.ВводНачальныхОстатковДисконт.ПустаяСсылка()  тогда
		
		Сообщить("Не выбран документ для загрузки!" , СтатусСообщения.Важное);
		Возврат 0 ;
	конецесли;
	
	Попытка
		Excel = ПолучитьCOMОбъект(полноеИмяФайлаДанных);		
	Исключение
		Excel = NULL;
		Сообщить("Ошибка при установке соединения с COM-объектом:" + полноеИмяФайлаДанных, СтатусСообщения.Важное);
		Возврат 0 ;
	КонецПопытки;			
	
	Лист = Excel.Sheets.Item(1);	
	КоличествоСтрок = Лист.UsedRange.Rows.Count();
	
	Символ160 = Символ(160); // пробел - разделитель разрядов "5 550 000 003 167" 
	
	//ДокументСсылка = ПолучитьСсылкуНаДокВводНачальныхОстатковДисконт("Ввод начальных остатков по информационным картам 000000115 от 11.03.2015 18:31:20");	
	
	ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
	
	ТЧ_ПродажиПоДисконтнымКартам = ДокументОбъект.ПродажиПоДисконтнымКартам;

	
	// Начинаем со строки = 2
	Для номерСтроки = 1 По КоличествоСтрок Цикл
		
	    // СокрЛП(Лист.Cells(Стр, НомерКолонкиExcel.НомерСтроки).Value);
		кодКарты = СтрЗаменить((Лист.Cells(номерСтроки,2).Value),Символ160,"");								
		сумма 	 = СтрЗаменить((Лист.Cells(номерСтроки,4).Value),Символ160,"");	
		
		сообщить("Прочитано: кодКарты:" + кодКарты + "  сумма:" + сумма);
				
		ЗаполнитьТабличнуюЧастьДокВводНачальныхОстатковДисконт(ТЧ_ПродажиПоДисконтнымКартам, кодКарты,Сумма);
				
		индикатор = 100 * номерСтроки / КоличествоСтрок;	
	КонецЦикла;
	
	ДокументОбъект.Записать();
	
	//Excel.Quit();  - ошибка 
	Excel = NULL;  
	
КонецФункции


// Найти в справочнике ИнформационнуюКарту по наименованию 
// Установить КодКарты 
функция ЗаполнитьИнформационнуюКарту(наименование,кодКарты)
	
	инфКарта = Справочники.ИнформационныеКарты.НайтиПоНаименованию(наименование);
	Если инфКарта = Справочники.ИнформационныеКарты.ПустаяСсылка()  Тогда	 
		сообщить("Не найдена Информационная Карта:" + наименование );		
		возврат 0;
	КонецЕсли;
	
	инфКартаОбъект = инфКарта.ПолучитьОбъект();
	инфКартаОбъект.КодКарты = кодКарты;	
	инфКартаОбъект.Записать();
	
	сообщить("Для карты, наименование:" + наименование + " - присвоен кодКарты:" + кодКарты );
	
	возврат инфКартаОбъект.КодКарты;
	
КонецФункции


// Найти в справочнике ИнформационнуюКарту по НайтиПоРеквизиту ("кодКарты")  
// Добавить строку в ТЧ 
функция ЗаполнитьТабличнуюЧастьДокВводНачальныхОстатковДисконт(ТЧ_ПродажиПоДисконтнымКартам,кодКарты,Сумма);

	//ТЧ_НоваяСтрока.ДисконтнаяКарта = Справочники.ИнформационныеКарты.НайтиПоНаименованию(наименованиеКарты);
	имяРеквизита = "КодКарты";
	значениеРеквизита = кодКарты;
		
	ДисконтнаяКартаСсылка = Справочники.ИнформационныеКарты.НайтиПоРеквизиту(имяРеквизита, значениеРеквизита);	
	
	если ДисконтнаяКартаСсылка = Справочники.ИнформационныеКарты.ПустаяСсылка()  тогда  
		сообщить("Не найдена ДК по реквизиту [" + имяРеквизита + "]:" + кодКарты );
		Возврат Неопределено;	
	конецесли;
	
	сообщить("Найдена ДК по реквизиту [" + имяРеквизита + "]:" + кодКарты + " ДисконтнаяКартаСсылка:" + ДисконтнаяКартаСсылка);
	
	ТЧ_НоваяСтрока = ТЧ_ПродажиПоДисконтнымКартам.Добавить();
	ТЧ_НоваяСтрока.ДисконтнаяКарта = ДисконтнаяКартаСсылка;	
	ТЧ_НоваяСтрока.ВладелецДисконтнойКарты = ТЧ_НоваяСтрока.ДисконтнаяКарта.ВладелецКарты;
	ТЧ_НоваяСтрока.Сумма = Сумма;
	
	Возврат ТЧ_ПродажиПоДисконтнымКартам;
КонецФункции	

//----------------------------------------------------------------------------	
// Тесты:
//----------------------------------------------------------------------------	

//1. Вспомогательные функции для тестов :                             
Функция Asset(ожидали,получили,имяфункции)
		
	различие = первоеРазличиеТекстов(ожидали,получили);		
		
	Ок = (получили = ожидали); 
	
	Если Ок Тогда	// Ок. молчим
	иначе
		сообщить("!!!Не прошел тест: " + имяФункции + " ожидали:" + "<> получили:" + получили);		
		сообщить(имяФункции);		
		сообщить("получили:" + получили);
		сообщить("ожидали :" + ожидали);
		различие = первоеРазличиеТекстов(ожидали,получили);	          		
		
		//сообщить("получили2:" + получили2);		
		сообщить("различие:" + различие,СтатусСообщения.Важное);	
	КонецЕсли;  
		
	возврат Ок;	
КонецФункции	


Функция первоеРазличиеТекстов(строка1,строка2)
	
	результат = "";

	число_строк1 = СтрЧислоСтрок(строка1);
	число_строк2 = СтрЧислоСтрок(строка2);
	
	число_строкМах = Макс(число_строк1,число_строк2); 
	
	Для Счетчик = 1 По СтрЧислоСтрок(строка1) Цикл
    	ТекСтрока1 = СтрПолучитьСтроку(строка1, Счетчик);    
		ТекСтрока2 = СтрПолучитьСтроку(строка2, Счетчик);    
		
		Если ТекСтрока1 = ТекСтрока2  Тогда	 
			// ок
		иначе 
			результат = ТекСтрока1 + " <> " + ТекСтрока2;
			Возврат результат;
		КонецЕсли;            				
		
	КонецЦикла;	
	
	Возврат результат;	
КонецФункции


Функция ПройтиТесты() экспорт
	
	имяФункции = "ПройтиТесты()";
	
	// структура уровня видимости - модуль
	мСтрукураТест = новый структура("Имя,НомерЗБ,КаталогФайлов,ФайлЭталон,ФайлРезультат,Результат");	
	
	Ок = (Истина и 	
		тест02_ЗаполнитьТабличнуюЧасть() и		
		тест01_ЗаполнитьТабличнуюЧасть() и
		Истина);	
		
	cОк = ?(Ок,"Успех! Тесты пройдены!","!!! ERRORs !!!");
	сообщить(имяФункции + ":" + cОк);		
	Возврат Ок;
КонецФункции


функция тест02_ЗаполнитьТабличнуюЧасть()  // ПродажиПоДисконтнымКартам  
		
	имяФункции = "тест02_ЗаполнитьТабличнуюЧасть()";                                		
	
	кодКарты   = "000000000000";	
	Сумма = 10;
	
	ДокументСсылка = ПолучитьСсылкуНаДокВводНачальныхОстатковДисконт("Ввод начальных остатков по информационным картам 000000115 от 11.03.2015 18:31:20");	
	
	ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
	ТЧ_ПродажиПоДисконтнымКартам = ДокументОбъект.ПродажиПоДисконтнымКартам;
		
	ТЧ = ЗаполнитьТабличнуюЧастьДокВводНачальныхОстатковДисконт(ТЧ_ПродажиПоДисконтнымКартам,кодКарты, Сумма);
	
	результат = ТЧ; 
		
	ДокументОбъект.Записать();
		
	получили  = результат;
	//получили2 = СтрЗаменить(мСтрукураТест.Результат,Символы.ПС,Символы.ПС + "|");

	ожидали  = Неопределено; 
	
	Ок = Asset(ожидали,получили,имяФункции);    
			
	возврат Ок;

КонецФункции	


функция тест01_ЗаполнитьТабличнуюЧасть()  // ПродажиПоДисконтнымКартам  
		
	имяФункции = "тест01_ЗаполнитьИнформационнуюКарту()";                                		
	
	кодКарты   = "100000000000";
	
	Сумма = 7;
	
	ДокументСсылка = ПолучитьСсылкуНаДокВводНачальныхОстатковДисконт("Ввод начальных остатков по информационным картам 000000115 от 11.03.2013 18:31:20");	
	
	ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
	ТЧ_ПродажиПоДисконтнымКартам = ДокументОбъект.ПродажиПоДисконтнымКартам;
		
	ТЧ = ЗаполнитьТабличнуюЧастьДокВводНачальныхОстатковДисконт(ТЧ_ПродажиПоДисконтнымКартам,кодКарты, Сумма);
	
	результат = Строка(ТЧ.ДисконтнаяКарта.Наименование) + "; " +  
		Строка(ТЧ.ДисконтнаяКарта.Код) + "; " +  
		Строка(ТЧ.ДисконтнаяКарта.КодКарты) + "; " +  
		Строка(ТЧ.ВладелецДисконтнойКарты) + "; " +  
		Строка(ТЧ.Сумма)
		; 
		
	ДокументОбъект.Записать();
		
	получили  = результат;
	//получили2 = СтрЗаменить(мСтрукураТест.Результат,Символы.ПС,Символы.ПС + "|");

	ожидали  = "110001392484; 0026949  ; 100000000000; ; 7"; 
	
	Ок = Asset(ожидали,получили,имяФункции);    
			
	возврат Ок;

КонецФункции	


ПройтиТесты(); 


Скачать обработку (архив RAR)




Рекламный блок:

Предлагаем решение Ваших задач 1С.

Внедрение 1С:

Доработка и сопровождение 1С:

Ориентировочная стоимость работ программиста 1С : 500 р. за 1 час работы.

Пишите: j008@j008.ru

Звоните: 8 916 710 83 51 Ольга