Пример парсера XML файла через построитель DOM

Shemyl 27 1
Путь = "Путь до файла";
МассивФайлов = НайтиФайлы(путь, "*docum*.xml", Ложь);
КоличествоФайлов = МассивФайлов.Количество();
Если КоличествоФайлов > 0 Тогда
		Для каждого Файл из МассивФайлов Цикл 


			Тест = Новый ДвоичныеДанные(Файл.ПолноеИмя); 


			Парсер = Новый ЧтениеXML;        
			Парсер.УстановитьСтроку(ПолучитьСтрокуИзДвоичныхДанных(Тест, КодировкаТекста.UTF8));  //устанавливаем парсер на строку с файлом	
			ДокументДОМ = Новый ПостроительDOM;
			Рез = ДокументДОМ.Прочитать(Парсер); 
			Попытка 
				ФлагПроведения = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[0].ТекстовоеСодержимое;
				ДатаДок = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[1].ТекстовоеСодержимое;
				СчетПокупателю = Документы.СчетНаОплатуПокупателю.НайтиПоНомеру(Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[2].ТекстовоеСодержимое,ОбщегоНазначенияКлиентСервер.СтрокаВДату(ДатаДок));
				НомерДок = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[2].ТекстовоеСодержимое;
				Если ЗначениеЗаполнено(СчетПокупателю.Ссылка) Тогда
					Док = СчетПокупателю.ПолучитьОбъект();
					Док.Товары.Очистить();     //очищаем табличные части, иначе они задваиваются
				Иначе
					Док = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
					Док.Дата = ДатаДок;
					Док.Номер = НомерДок;
				КонецЕсли; 
				Док.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[8].ТекстовоеСодержимое); 


				Если Док.Контрагент.Пустая() Тогда
					НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
					НовыйКонтрагент.Наименование = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[14].ТекстовоеСодержимое;
					НовыйКонтрагент.ИНН = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[8].ТекстовоеСодержимое;
					НовыйКонтрагент.КПП = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[15].ТекстовоеСодержимое;
					НовыйКонтрагент.КодПоОКПО = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[16].ТекстовоеСодержимое;
					НовыйКонтрагент.Записать();
					Док.Контрагент = НовыйКонтрагент.Ссылка;
				КонецЕсли;

				Док.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[4].ТекстовоеСодержимое, , , Док.Контрагент);
				Если Док.ДоговорКонтрагента.Пустая() Тогда
					НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
					НовыйДоговор.Наименование = "Основной договор";
					НовыйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить();
					НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
					НовыйДоговор.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
					НовыйДоговор.Владелец = Док.Контрагент;
					НовыйДоговор.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "9703016258");
					НовыйДоговор.Записать();
					Док.ДоговорКонтрагента = НовыйДоговор.Ссылка;
				КонецЕсли;
				Док.Ответственный = Справочники.Пользователи.НайтиПоНаименованию(Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[3].ТекстовоеСодержимое);
				Док.КратностьВзаиморасчетов = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[6].ТекстовоеСодержимое;
				Док.Комментарий = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[9].ТекстовоеСодержимое;
				Док.АдресДоставки = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[10].ТекстовоеСодержимое;
				Док.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
				Док.СуммаВключаетНДС = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[12].ТекстовоеСодержимое;
				Док.СуммаДокумента = Рез.ДочерниеУзлы[0].ДочерниеУзлы[0].ДочерниеУзлы[13].ТекстовоеСодержимое; 
				Док.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "9703016258"); 
				Док.Товары.Очистить();
				Для каждого стр из Рез.ДочерниеУзлы Цикл
					Для каждого стр2 из стр.ДочерниеУзлы Цикл
						Для каждого стр3 из стр2.ДочерниеУзлы Цикл 
							Если стр3.ИмяУзла  = "Товары" Тогда 
								НоваяСтрока = Док.Товары.Добавить();
								Для каждого стр4 из стр3.ДочерниеУзлы Цикл
									для Каждого стр4 из стр3.ДочерниеУзлы Цикл 
										Если стр4.ИмяУзла = "Цена" тогда
											НоваяСтрока.Цена = Число(стр4.ТекстовоеСодержимое);
										КонецЕсли;
										Если стр4.ИмяУзла = "Сумма" Тогда
											НоваяСтрока.Сумма = Число(стр4.ТекстовоеСодержимое);
										КонецЕсли;
										Если стр4.ИмяУзла = "СуммаНДС" Тогда
											НоваяСтрока.СуммаНДС = Число(стр4.ТекстовоеСодержимое);
										КонецЕсли; 
										Если стр4.ИмяУзла = "Количество" Тогда
											НоваяСтрока.Количество = Число(стр4.ТекстовоеСодержимое);
										КонецЕсли;
										Если стр4.ИмяУзла = "Номенклатура" Тогда
											наименованиетовара = стр4.ТекстовоеСодержимое;
											Номен = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(наименованиетовара)); 

											Если Номен = Справочники.Номенклатура.ПустаяСсылка() Тогда
												Номен = Справочники.Номенклатура.СоздатьЭлемент();
												Номен.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
												Номен.Наименование = СокрЛП(наименованиетовара);
												Номен.ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");    
												Номен.Комментарий = "Перенесено из УСЦ";
												Номен.Записать();
											КонецЕсли;
											НоваяСтрока.Номенклатура = Номен.Ссылка;
										КонецЕсли;
									КонецЦикла;

								КонецЦикла; 
							КонецЕсли;
						КонецЦикла;
					КонецЦикла;
				КонецЦикла; 

				Если Док.Товары.Количество() > 0 Тогда
					Для каждого стр из Док.Товары Цикл
						стр.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
					КонецЦикла;
				КонецЕсли;

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

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

			Исключение 
				Сообщить(ОписаниеОшибки());
			КонецПопытки;

		КонецЦикла;

КонецЕсли;
0
{1} Высокая цикломатическая сложность: 21
Орфографическая ошибка в парсера: парсера
Орфографическая ошибка в docum: docum
Орфографическая ошибка в Парсер (найдено 3): Парсер
Орфографическая ошибка в парсер: парсер
Орфографическая ошибка в задваиваются: задваиваются
Орфографическая ошибка в наименованиетовара (найдено 3): наименованиетовара

См. также

Чтение файла (в таблицу значений) расширения .xlsx с помощью построителя запроса

ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезФайл (БСП)

ПараметрыОбменаДаннымиЧерезФайлИлиСтроку (БСП)

Пример использования регулярных выражений RegExp в 1С

Пример работы с OpenOffice/LibreOffice Calc

СобытиеЖурналаРегистрацииДобавлениеФайлаОбменЧерезФС (БСП)

СобытиеЖурналаРегистрацииДобавлениеФайлаОбменНеЧерезФС (БСП)

ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку (БСП)

Как сохранять и восстанавливать настройки системы компоновки данных

Модератору