Как прочитать XML файл

1. Airat116 16.12.22 14:15 Сейчас в теме
Здравствуйте!
Подскажите пожалуйста, как правильно прочитать файл XML

Пытаюсь с файла заполнить табл. часть документа
Но пока не совсем выходит(

Такой код написал:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);
фабрика = Новый ФабрикаXDTO;
ДокументXDTO = фабрика.ПрочитатьXML(ЧтениеXML);

Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();

Для Каждого СтрокаТЧ Из ДокументXDTO.Строка Цикл
      Новаястрока = Таблица.Добавить();
КонецЦикла;
Показать


Собрал файл XML

<?xml version="1.0" encoding="UTF-8" ?>
- <Данные>
<Строка КПП="91111111" КодПо="000000" КодБюдж="1111111111" Сумма="11 552" />
</Данные>

Проблема в основном получается что если несколько строк, тогда у ДокументXDTO.Строка = тип "СписокXDTO"
А если одна строка (как в примере) тогда ДокументXDTO.Строка = тип "ОбъектXDTO"
И выходит ошибка
По теме из базы знаний
Найденные решения
14. user5300 1010 16.12.22 15:01 Сейчас в теме
(12)
Функция РезультатЗапросаВСтруктуре(Знач РезультатЗапроса) Экспорт
	Результат = Новый Структура;
	Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
		Результат.Вставить(Колонка.Имя);
	КонецЦикла;
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Результат;
	КонецЕсли;
	Выборка = РезультатЗапроса.Выбрать();
	Данные = Новый СписокЗначений;
	Пока Выборка.Следующий() Цикл
		ЗаполнитьЗначенияСвойств(Результат, Выборка);
		Данные.Добавить(Результат);
	КонецЦикла;
	Возврат Данные;

КонецФункции // ()


////////////////////////////////////////////////////////////­///////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();

Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);

СписокДанных = новый Массив;

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

	СписокДанных.Добавить(КаждуюСтрокуВСтруктуру);
КонецЦикла;

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлуДляЗаписи); 
    
//Преобразуем массив в объект XDTO
МассивВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокДанных);
    
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, МассивВОбъектеXDTO); 
    
Запись.Закрыть(); // документ готов!

Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 34 16.12.22 14:20 Сейчас в теме
(1)Проверяй тип значения у ДокументXDTO.Строка. Если список - то в цикле заполняй, если объект, то без цикла.
3. Airat116 16.12.22 14:21 Сейчас в теме
(2) Можете подсказать (краткий пример) как проверить, пытался глобальным поиском в конфигураторе найти
что то не увидел( или пропустил(
9. Sashares 34 16.12.22 14:47 Сейчас в теме
(3)
Если ТипЗнч(ДокументXDTO.Строка) = Тип("СписокXDTO") Тогда
//цикл
Иначе
//без цикла
КонецЕсли;
4. user5300 1010 16.12.22 14:26 Сейчас в теме
Пример записи:
Процедура ПримерЗаписи()
	
	Выборка = запрос.Выполнить().Выбрать();
	
	СписокНоменклатуры = новый Массив;

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

Функция ДобавитьРодителей(Родитель)
	
	ДанныеРодителя = новый Структура("Код, Наименование, Ссылка, ЭтоГруппа, Родитель",
		 						Родитель.Код, Родитель.Наименование,XMLСтрока(Родитель.Ссылка),Родитель.ЭтоГруппа,);

	Если НЕ Родитель.Родитель.Пустая() Тогда
		ДанныеРодителя.Родитель = ДобавитьРодителей(Родитель.Родитель);
	КонецЕсли;
	
	Возврат ДанныеРодителя;
КонецФункции
Показать

Пример Чтения:
Процедура ПримерЧтения()
	
	ТекстXML  = ТвойТекстВХМL;   
	
	ЧтениеXML = новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ТекстXML);
		
	МассивНоменклатуры = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
	
	
	Для каждого Стр из МассивНоменклатуры Цикл
		
		Номенклатура = СоздатьНоменклатуру(Стр);
		
	КонецЦикла;  
	

КонецПроцедуры

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

	СПР.Код 			= ДанныеНоменклатуры.Код;     
	СПР.Наименование 	= ДанныеНоменклатуры.Наименование; 
		
	///Если есть родитель, сначала нужно создать родителя, и так до самого корня начала
	Если ДанныеНоменклатуры.Родитель <> Неопределено Тогда
		СПР.Родитель 		= СоздатьНоменклатуру(ДанныеНоменклатуры.Родитель);	
	КонецЕсли;
					
	СПР.Записать();
					
	Возврат СПР.Ссылка;
  		
КонецФункции  
Показать
5. Airat116 16.12.22 14:36 Сейчас в теме
(4) Вместо "ТекстXML = ТвойТекстВХМL;" я могу использовать "ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);"?
Не совсем пойму как получить текст
6. user5300 1010 16.12.22 14:37 Сейчас в теме
(5)
 ЧтениеXML = новый ЧтениеXML;
    //ЧтениеXML.УстановитьСтроку(ТекстXML);
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);
7. Airat116 16.12.22 14:44 Сейчас в теме
(6) Ошибка выходит(

ПрочитатьXML)
{ВнешняяОбработка.ПолучитьДанныеИзСап_XML.Форма.Форма.Форма(9)}:
МассивСтрокДокумента = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Данные Форма: Элемент
Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Строка Форма: Элемент
Тип: {http://www.w3.org/2001/XMLSchema}anyType

Пытался так сделать

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);

МассивСтрокДокумента = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);

Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();
Для Каждого Стр Из МассивСтрокДокумента Цикл
Новаястрока = Таблица.Добавить();

КонецЦикла;
Показать
8. user5300 1010 16.12.22 14:46 Сейчас в теме
(7) В примере выше используются примитивные типы (Структура, строка, массив, число и тд)
А у вас в записях скорее всего содержится объект метаданных 1С одной базы, который отсутствует в другой
10. Airat116 16.12.22 14:49 Сейчас в теме
(8) Я переводил в тип строку "КПП="91111111""
11. user5300 1010 16.12.22 14:51 Сейчас в теме
12. Airat116 16.12.22 14:56 Сейчас в теме
(11)

Код который создаёт XML файл

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

КонецФункции // ()


////////////////////////////////////////////////////////////­///////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();
     Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);
    ЗаписьXML = Новый ЗаписьXML;

    ЗаписьXML.ОткрытьФайл(ПутьКФайлуДляЗаписи);
    
    ЗаписьXML.ЗаписатьОбъявлениеXML();    
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
    
    Для Каждого Строка Из Данные Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");
        ЗаписьXML.ЗаписатьАтрибут("КПП", Строка(Строка.Значение.КПП));
ЗаписьXML.ЗаписатьАтрибут("КодПо", Строка(Строка.Значение.КодПо));
ЗаписьXML.ЗаписатьАтрибут("КодБюд", Строка(Строка.Значение.КодБюд));
ЗаписьXML.ЗаписатьАтрибут("Сумма", Строка(Строка.Значение.СуммаПлатежаПоНалогу));
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); 
КонецЦикла;
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Страны
    
    ЗаписьXML.Закрыть();
Показать
14. user5300 1010 16.12.22 15:01 Сейчас в теме
(12)
Функция РезультатЗапросаВСтруктуре(Знач РезультатЗапроса) Экспорт
	Результат = Новый Структура;
	Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
		Результат.Вставить(Колонка.Имя);
	КонецЦикла;
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Результат;
	КонецЕсли;
	Выборка = РезультатЗапроса.Выбрать();
	Данные = Новый СписокЗначений;
	Пока Выборка.Следующий() Цикл
		ЗаполнитьЗначенияСвойств(Результат, Выборка);
		Данные.Добавить(Результат);
	КонецЦикла;
	Возврат Данные;

КонецФункции // ()


////////////////////////////////////////////////////////////­///////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();

Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);

СписокДанных = новый Массив;

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

	СписокДанных.Добавить(КаждуюСтрокуВСтруктуру);
КонецЦикла;

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлуДляЗаписи); 
    
//Преобразуем массив в объект XDTO
МассивВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокДанных);
    
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, МассивВОбъектеXDTO); 
    
Запись.Закрыть(); // документ готов!

Показать
15. Airat116 16.12.22 15:04 Сейчас в теме
(14) Спасибо большое) сейчас попробую
13. Airat116 16.12.22 14:57 Сейчас в теме
Этот код который я пытался заполнить документ

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);
фабрика = Новый ФабрикаXDTO;
ДокументXDTO = фабрика.ПрочитатьXML(ЧтениеXML);

Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();

Для Каждого СтрокаТЧ Из ДокументXDTO.Строка Цикл
Новаястрока = Таблица.Добавить();
КонецЦикла;
Показать
Оставьте свое сообщение

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