Загрузка документов перемещеня МПЗ из XML

1. Elected 21 13.10.17 14:11 Сейчас в теме
Доброго времени суток, уважаемые читатели и "УМЫ" форума! :)

У меня возникла трудность с загрузкой XML файла в 1С 7.7. Раньше я использовал только типовые загрузки XML, поэтому каюсь, в этом вопросе опыта мало... Начну с того, что есть "Выгрузка.xml" с документами перемещение за определенный период. Структура XML-файла приложена. Есть также внешняя обработка импорта данных документов, которая создает документы "ПеремещениеМПЗ" в 1С 7.7.. Обработку писал не сам, а честно признаюсь, что позаимствовал её здесь на форуме, только слегка переделал под свои нужды :). Так вот всё вроде бы работает, но почему-то номенклатуры в табличной части не появляются. Я подозреваю, что в обработке "логические" ошибки при чтении "Тегов" скорее всего, так как при выполнении запроса не дохожу до тега "Строка Номер...". Прошу помощи у вас! Заранее благодарю.
//*******************************************
Процедура Сформировать()
	
	ПутьКФайлуЗагрузки = "c:\Выгрузка.xml";
	
	Если ( ПустоеЗначение(ПутьКФайлуЗагрузки) = 1 ) Тогда
		Предупреждение("Не указан файл загрузки");
		Возврат;
	КонецЕсли;    
    
    флЕстьОшибкиВФайлеЗагрузки = 0;
	
	ТЗнач = СоздатьОбъект("ТаблицаЗначений"); 
    ТЗнач.НоваяКолонка("НомерДок");    
    ТЗнач.НоваяКолонка("ДатаДок");
    ТЗнач.НоваяКолонка("МестоХранения");   
    ТЗнач.НоваяКолонка("МестоХраненияВ");  
    ТЗнач.НоваяКолонка("Номенклатура");
	ТЗнач.НоваяКолонка("Количество", "Число", 15, 2);    
    
    ТЗначТовары = СоздатьОбъект("ТаблицаЗначений");
    ТЗнач.Выгрузить(ТЗначТовары);
        
    Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
        Предупреждение("Внешняя компонента не найдена"); 
        Возврат;
    КонецЕсли;
    
    гXMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
    ФайлXML = гXMLАнализатор.СоздатьПоследовательноСчитываемыйДокумент();
    ФайлXML.СвязатьСФайлом(ПутьКФайлуЗагрузки);
    
    ТипТега = ФайлXML.Спуститься();  
    
    Пока ТипТега <> 4 Цикл        			// пока не достигнут конец файла
        
        Если ТипТега <> 1 Тогда
            ТипТега = ФайлXML.Следующий();
            Продолжить
        КонецЕсли;    						//    пропускаем концы уровней
        ИмяТега    = ФайлXML.СвойстваТекущегоУзла.Имя;
        
        Если ИмяТега = "Документ" Тогда
            Объект = ФайлXML.ТекущийЭлементВВидеОбъекта();
            НомерДок = ""; 
            ДатаДок = ""; 
            СкладОтправитель = "";   
			СкладОтправитель = "";   
            КолвоПодчиненныхУзлов_Накладные = Объект.КоличествоПодчиненных();    
             
			Сообщить(КолвоПодчиненныхУзлов_Накладные);
            Для сч_Накладные = 1 По КолвоПодчиненныхУзлов_Накладные Цикл
                УзелНакладные= Объект.ПолучитьПодчиненныйПоНомеру(сч_Накладные);
				Если ( УзелНакладные.Наименование = "Номер" ) Тогда
					НомерДок = УзелНакладные.Значение; 
				ИначеЕсли ( УзелНакладные.Наименование = "Дата" ) Тогда
					ДатаДок = УзелНакладные.Значение;               
				ИначеЕсли ( УзелНакладные.Наименование = "СкладОтправитель" ) Тогда
                    СкладОтправитель = УзелНакладные.Значение;                     
                ИначеЕсли ( УзелНакладные.Наименование = "СкладПолучатель" ) Тогда
                    СкладПолучатель = УзелНакладные.Значение;                     
				ИначеЕсли ( УзелНакладные.Наименование = "Товары" ) Тогда           
					ТипТега = ФайлXML.Спуститься();
					
					Если ИмяТега = "Строка" Тогда
						Объект = ФайлXML.ТекущийЭлементВВидеОбъекта(); 
						КоличествоЛинийНакладной = Объект.КоличествоПодчиненных();
						Номенклатура = "";  
						Количество = "";
						Для сч_Линий = 1 По КоличествоЛинийНакладной Цикл   
							УзелЛинии = Объект.Объект.ПолучитьПодчиненныйПоНомеру(сч_Линий);
							Если ( УзелЛинии.Наименование = "Номенклатура" ) Тогда
								Номенклатура = УзелЛинии.Значение;  
								Сообщить(Номенклатура);
							ИначеЕсли ( УзелЛинии.Наименование = "Количество" ) Тогда
								Количество = УзелЛинии.Значение;                                
								Сообщить(Количество);
							КонецЕсли; 
						КонецЦикла;             
					КонецЕсли;
 
                    // записываем даные в таблицу значений   
                    ТЗнач.НоваяСтрока();
                    ТЗнач.НомерДок = НомерДок;
                    ТЗнач.ДатаДок = ДатаДок;    
                    ТЗнач.МестоХранения = СкладОтправитель;     
					ТЗнач.МестоХраненияВ = СкладПолучатель;     
                    ТЗнач.Номенклатура = Номенклатура;      
					ТЗнач.Количество = Количество;    
				КонецЕсли;    
			КонецЦикла;    
		Иначе
			ТипТега = ФайлXML.Спуститься();
			Продолжить;
		КонецЕсли;
		ТипТега = ФайлXML.Следующий();
	КонецЦикла;    
    ТЗнач.Сортировать("+НомерДок");
    ТЗнач.ВыбратьСтроки();
    Пока ТЗнач.ПолучитьСтроку() = 1 Цикл
        ТЗначТовары.НоваяСтрока();
        ТЗначТовары.НомерДок = ТЗнач.НомерДок;
        ТЗначТовары.ДатаДок = ТЗнач.ДатаДок; 
        ТЗначТовары.МестоХранения = ТЗнач.МестоХранения; 
		ТЗначТовары.МестоХраненияВ = ТЗнач.МестоХраненияВ; 
        ТЗначТовары.Номенклатура = ТЗнач.Номенклатура; 
		ТЗначТовары.Количество = ТЗнач.Количество; 
    КонецЦикла;   
    
    СпрСклады      = СоздатьОбъект("Справочник.МестаХранения");  
    СпрТовары      = СоздатьОбъект("Справочник.Материалы");      
    
    // Товары
    ДокумТовары    = СоздатьОбъект("Документ.ДвижениеМПЗ");
    ТЗначДокументы = СоздатьОбъект("ТаблицаЗначений"); 
    ТЗначТовары.Выгрузить(ТЗначДокументы); 
	ТЗначДокументы.Свернуть("НомерДок", ""); 
    
    ТЗначДокументы.ВыбратьСтроки();
    Пока ТЗначДокументы.ПолучитьСтроку() = 1 Цикл
        ДокумТовары.Новый();
        ДокумТовары.ДатаДок = ТЗначТовары.ДатаДок;  
        ДокумТовары.НомерДок = ТЗначТовары.НомерДок; 
        ТекКодСклада = ТЗначТовары.МестоХранения;
        Если ( СпрСклады.НайтиПоНаименованию(ТекКодСклада, 0) = 1 ) Тогда
            ТекСклад = СпрСклады.ТекущийЭлемент();
        Иначе
            ТекСклад = "";
            Сообщить("В справочнике мест хранения не найден склад с кодом " + ТекКодСклада);
		КонецЕсли;
		
        ДокумТовары.МестоХранения = ТекСклад;      

        ТекКодСкладаВ = ТЗначТовары.МестоХраненияВ;
        Если ( СпрСклады.НайтиПоНаименованию(ТекКодСкладаВ, 0) = 1 ) Тогда
            ТекСкладВ = СпрСклады.ТекущийЭлемент();
        Иначе
            ТекСкладВ = "";
            Сообщить("В справочнике мест хранения не найден склад с кодом " + ТекКодСкладаВ);
		КонецЕсли;
		
        ДокумТовары.МестоХраненияВ = ТекСкладВ;      
		
        ТЗначТовары.ВыбратьСтроки();
        Пока ТЗначТовары.ПолучитьСтроку() = 1 Цикл   
              
			ДокумТовары.ВидМПЗвТЧ = Перечисление.ВидыМПЗ.Материалы;
			
            ТекНаименованиеТовара = Строка(ТЗначТовары.Номенклатура);
            Если ( СпрТовары.НайтиПоНаименованию(ТекНаименованиеТовара, 0 ) = 1 ) Тогда
                ТекНаименованиеТовара = СпрТовары.ТекущийЭлемент();
            Иначе
                ТекНаименованиеТовара = "";
                Сообщить("Товар " + ТекНаименованиеТовара + ", не найден в справочнике");
            КонецЕсли;   
            
            ДокумТовары.НоваяСтрока();
            ДокумТовары.МПЗ = ТекНаименованиеТовара;     
		КонецЦикла;
		
		ДокумТовары.Записать();
		Сообщить("Создан документ " + ДокумТовары.ТекущийДокумент());
КонецЦикла;
КонецПроцедуры
Показать


P.S. Загрузку делаю в конфигурацию Производство+Услуги+Бухгалтерия.
Прикрепленные файлы:
Выгрузка.xml
ЗагрузкаXML.ert
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
4. pirat123457 90 24.10.17 05:27 Сейчас в теме +1.38 $m
Можно так сделать))) Обработка во вложении + Print Screen

ИначеЕсли ( УзелНакладные.Наименование = "Товары" ) Тогда           
							УзелКорень = Объект.ВыбратьУзел("Товары");
							//загружаем товары
							Товары = УзелКорень.ВыбратьУзлы("Строка");
							Для ш=1 По Товары.КоличествоУзлов() Цикл
								ТекТовар = Товары.ПолучитьУзел(ш-1);
			                    // записываем даные в таблицу значений   
			                    ТЗнач.НоваяСтрока();
			                    ТЗнач.НомерДок 		 = НомерДок;
			                    ТЗнач.ДатаДок  		 = ДатаДок;    
			                    ТЗнач.МестоХранения  = СкладОтправитель;     
			                    ТЗнач.МестоХраненияВ = СкладПолучатель;     
			                    ТЗнач.Номенклатура   = ТекТовар.ВыбратьУзел("Номенклатура").Значение;       
			                    ТЗнач.Количество     = ТекТовар.ВыбратьУзел("Количество").Значение;              
							КонецЦикла; 
                КонецЕсли;
Показать
Прикрепленные файлы:
ЗагрузкаXML_123.ert
8. pirat123457 90 24.10.17 12:15 Сейчас в теме
(7)
Если несколько документов тогда можно сделать так:
Если ТЗначТовары.НомерДок <> ТЗначДокументы.НомерДок Тогда
Прикрепленные файлы:
ЗагрузкаXML_123.ert
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. T-y 18.10.17 13:20 Сейчас в теме
ИначеЕсли ( УзелНакладные.Наименование = "Товары" ) Тогда           
             ОбъектТовары = ФайлXML.ТекущийЭлементВВидеОбъекта();
             КолвоПодчиненныхУзлов_Товары = ОбъектТовары.КоличествоПодчиненных();
              
                Для сч_Товары = 1 По КолвоПодчиненныхУзлов_Товары Цикл
                УзелТовары= ОбъектТовары.ПолучитьПодчиненныйПоНомеру(сч_Товары);
                Если ( УзелТовары.Наименование = "Строка" ) Тогда
                        ОбъектСтрока = ФайлXML.ТекущийЭлементВВидеОбъекта(); 
                        КоличествоЛинийСтроки = ОбъектСтрока.КоличествоПодчиненных();
                        Номенклатура = "";  
                        Количество = "";
                        Для сч_Линий = 1 По КоличествоЛинийСтроки Цикл   
                            УзелЛинии = ОбъектСтрока.ПолучитьПодчиненныйПоНомеру(сч_Линий);
                            Если ( УзелЛинии.Наименование = "Номенклатура" ) Тогда
                                Номенклатура = УзелЛинии.Значение;  
                                Сообщить(Номенклатура);
                            ИначеЕсли ( УзелЛинии.Наименование = "Количество" ) Тогда
                                Количество = УзелЛинии.Значение;                                
                                Сообщить(Количество);
                            КонецЕсли; 
                        КонецЦикла;             
                    КонецЕсли;
Показать


Попробуй так, но не уверен что получится нет 7ки под рукой
3. Elected 21 18.10.17 16:14 Сейчас в теме
(2) Спасибо за ответ, но не помогло(((
4. pirat123457 90 24.10.17 05:27 Сейчас в теме +1.38 $m
Можно так сделать))) Обработка во вложении + Print Screen

ИначеЕсли ( УзелНакладные.Наименование = "Товары" ) Тогда           
							УзелКорень = Объект.ВыбратьУзел("Товары");
							//загружаем товары
							Товары = УзелКорень.ВыбратьУзлы("Строка");
							Для ш=1 По Товары.КоличествоУзлов() Цикл
								ТекТовар = Товары.ПолучитьУзел(ш-1);
			                    // записываем даные в таблицу значений   
			                    ТЗнач.НоваяСтрока();
			                    ТЗнач.НомерДок 		 = НомерДок;
			                    ТЗнач.ДатаДок  		 = ДатаДок;    
			                    ТЗнач.МестоХранения  = СкладОтправитель;     
			                    ТЗнач.МестоХраненияВ = СкладПолучатель;     
			                    ТЗнач.Номенклатура   = ТекТовар.ВыбратьУзел("Номенклатура").Значение;       
			                    ТЗнач.Количество     = ТекТовар.ВыбратьУзел("Количество").Значение;              
							КонецЦикла; 
                КонецЕсли;
Показать
Прикрепленные файлы:
ЗагрузкаXML_123.ert
5. Elected 21 24.10.17 08:48 Сейчас в теме
(4) Спасибо огромное за Ваше решение!
6. Elected 21 24.10.17 10:38 Сейчас в теме
Есть проблема! Если в XML-файле несколько документов, то загружается только последний (один) документ, но со всеми номенклатурами в табличной части(((
7. Elected 21 24.10.17 11:34 Сейчас в теме
Нашел ошибку сам, теперь создается несколько документов, но табличная часть у всех одна и та же.
Прикрепленные файлы:
ЗагрузкаXML_123.ert
выгрузка2.xml
8. pirat123457 90 24.10.17 12:15 Сейчас в теме
(7)
Если несколько документов тогда можно сделать так:
Если ТЗначТовары.НомерДок <> ТЗначДокументы.НомерДок Тогда
Прикрепленные файлы:
ЗагрузкаXML_123.ert
9. Elected 21 24.10.17 12:48 Сейчас в теме
(8) Гениально!

Человеческое Вам спасибо, Григорий!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот