Красивый код по загрузке УПД через X-Path

Как я писал ранее, помощник мне не помог, пришлось написать код самому. Делюсь красотой:

Функция ЗагрузитьИзXML(НовыйДок, ИмяВФ)     
	
	
	//https://infostart.ru/1c/tools/280340/ 
	Ч = Новый ЧтениеXML;
	Ч.ОткрытьФайл(ИмяВФ);
	
	П = Новый ПостроительDOM;
	ДОМ = П.Прочитать(Ч); 
	Разыменователь = Новый РазыменовательПространствИменDOM(ДОМ); //https://geniy1s.ru/primery-xpath/

	//Адрес РФ
	ТекстЗапроса = ".//ГрузПолуч/Адрес/АдрРФ"; Выражение = ДОМ.СоздатьВыражениеXPath(СокрЛП(ТекстЗапроса), Разыменователь); Результат = Выражение.Вычислить(ДОМ);
	Узел = Результат.ПолучитьСледующий();
	Если Узел <> Неопределено Тогда 
		М = Новый Массив();
		Для Каждого Атрибут Из Узел.Атрибуты Цикл
			М.Добавить(Атрибут.Значение);
		КонецЦикла;                      
		Адрес = СтрСоединить(М, " ");
	КонецЕсли;                            

	//Номер и дата, записать в поле вида: № 250/11/123 от 27 мая 2025       
	ИсхНомер = ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, ДОМ, ".//СвСчФакт/@НомерДок");
	Исхдата = ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, ДОМ, ".//СвСчФакт/@ДатаДок");       
	ПоставщикНаименование = ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, ДОМ, ".//СвПрод/ИдСв/СвЮЛУч/@НаимОрг");       
	ПоставщикИНН = СокрЛП(ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, ДОМ, ".//СвПрод/ИдСв/СвЮЛУч/@ИННЮЛ"));       
	ПоставщикКПП = СокрЛП(ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, ДОМ, ".//СвПрод/ИдСв/СвЮЛУч/@КПП"));       
	НовыйДок.Документ = "№ " + ИсхНомер + " от " + Исхдата;
	НовыйДок.Комментарий = ПоставщикНаименование + " : " + Адрес;
	
	
	НовыйДок.Поставщик = НайтиПоставщика(ПоставщикИНН, ПоставщикКПП);
	Если ЗначениеЗаполнено(НовыйДок.Поставщик) Тогда  
		НовыйДок.Подразделение = НайтиПодразделениеПоАдресуПоставщика(НовыйДок.Поставщик, Адрес);
	Иначе
		Сообщить("Не найден поставщик : " + ПоставщикНаименование + " ИНН: " + ПоставщикИНН + " КПП: " +  ПоставщикКПП);
	КонецЕсли;
	
	
	//Сведения о товаре
	ТекстЗапроса = ".//СведТов"; Выражение = ДОМ.СоздатьВыражениеXPath(СокрЛП(ТекстЗапроса), Разыменователь); Результат = Выражение.Вычислить(ДОМ);
	
	Пока Истина Цикл
		
		Узел = Результат.ПолучитьСледующий();
		Если Узел = Неопределено Тогда Прервать КонецЕсли;
		
		ОписаниеСтроки = ОписаниеСтроки();
		ОписаниеСтроки.Код = ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, Узел, ".//@КодТов");
		//ОписаниеСтроки.Бренд = ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, Узел, "string(.//СведТов/@НаимТов)");;
		ОписаниеСтроки.Количество = ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, Узел, ".//@КолТов");
		ОписаниеСтроки.Цена = ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, Узел, ".//@ЦенаТов");
		ОписаниеСтроки.Сумма = ПолучитьПолеXMLЗапросомXPATH(ДОМ, Разыменователь, Узел, ".//СумНал/СумНал");
		
		ОбработатьСтроку(НовыйДок, ОписаниеСтроки);
		
	КонецЦикла;	
КонецФункции

Мне начинает нравиться X-Path, времена, когда я разбирал XML через ЧтениеXML кажутся дурным сном.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *