Здравствуйте!
Подскажите пожалуйста, как правильно прочитать файл XML
Пытаюсь с файла заполнить табл. часть документа
Но пока не совсем выходит(
Такой код написал:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);
фабрика = Новый ФабрикаXDTO;
ДокументXDTO = фабрика.ПрочитатьXML(ЧтениеXML);
Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();
Для Каждого СтрокаТЧ Из ДокументXDTO.Строка Цикл
Новаястрока = Таблица.Добавить();
КонецЦикла;
Проблема в основном получается что если несколько строк, тогда у ДокументXDTO.Строка = тип "СписокXDTO"
А если одна строка (как в примере) тогда ДокументXDTO.Строка = тип "ОбъектXDTO"
И выходит ошибка
Функция РезультатЗапросаВСтруктуре(Знач РезультатЗапроса) Экспорт
Результат = Новый Структура;
Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
Результат.Вставить(Колонка.Имя);
КонецЦикла;
Если РезультатЗапроса.Пустой() Тогда
Возврат Результат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Данные = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Результат, Выборка);
Данные.Добавить(Результат);
КонецЦикла;
Возврат Данные;
КонецФункции // ()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();
Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);
СписокДанных = новый Массив;
Для Каждого Строка Из Данные Цикл
КаждуюСтрокуВСтруктуру = новый Структура;
КаждуюСтрокуВСтруктуру.Вставить("КПП", Строка(Строка.Значение.КПП));
КаждуюСтрокуВСтруктуру.Вставить("КодПо", Строка(Строка.Значение.КодПо));
КаждуюСтрокуВСтруктуру.Вставить("КодБюд", Строка(Строка.Значение.КодБюд));
КаждуюСтрокуВСтруктуру.Вставить("Сумма", Строка.Значение.СуммаПлатежаПоНалогу); // Можно как число записать
СписокДанных.Добавить(КаждуюСтрокуВСтруктуру);
КонецЦикла;
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлуДляЗаписи);
//Преобразуем массив в объект XDTO
МассивВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокДанных);
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, МассивВОбъектеXDTO);
Запись.Закрыть(); // документ готов!
Процедура ПримерЗаписи()
Выборка = запрос.Выполнить().Выбрать();
СписокНоменклатуры = новый Массив;
Пока Выборка.Следующий() Цикл
//Каждую номенклатуру помещаем в струткуру
ДанныеНоменклатуры = новый Структура("Код, Наименование, Ссылка, ЭтоГруппа, Родитель",
Выборка.Код, Выборка.Наименование,XMLСтрока(Выборка.Ссылка),Выборка.ЭтоГруппа,);
//Если есть родитель, то создаем рекурсивно родителя
Если НЕ Выборка.Родитель.Пустая() Тогда
ДанныеНоменклатуры.Родитель = ДобавитьРодителей(Выборка.Ссылка.Родитель);
КонецЕсли;
СписокНоменклатуры.Добавить(ДанныеНоменклатуры);
КонецЦикла;
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
//Преобразуем массив в объект XDTO
МассивВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокНоменклатуры);
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, МассивВОбъектеXDTO);
ДанныеXML = Запись.Закрыть(); // документ готов!
КонецПроцедуры
Функция ДобавитьРодителей(Родитель)
ДанныеРодителя = новый Структура("Код, Наименование, Ссылка, ЭтоГруппа, Родитель",
Родитель.Код, Родитель.Наименование,XMLСтрока(Родитель.Ссылка),Родитель.ЭтоГруппа,);
Если НЕ Родитель.Родитель.Пустая() Тогда
ДанныеРодителя.Родитель = ДобавитьРодителей(Родитель.Родитель);
КонецЕсли;
Возврат ДанныеРодителя;
КонецФункции
Показать
Пример Чтения:
Процедура ПримерЧтения()
ТекстXML = ТвойТекстВХМL;
ЧтениеXML = новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
МассивНоменклатуры = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Для каждого Стр из МассивНоменклатуры Цикл
Номенклатура = СоздатьНоменклатуру(Стр);
КонецЦикла;
КонецПроцедуры
Функция СоздатьНоменклатуру(ДанныеНоменклатуры)
///Проверка на существование ссылки. Если ссылка найдена, пропускаем.
СсылкаНоменклатуры = XMLЗначение(Тип("СправочникСсылка.Номенклатура"),ДанныеНоменклатуры.Ссылка);
/// проверяем по реквизиту "ВерсияДанных"
Если НЕ ЗначениеЗаполнено(СсылкаНоменклатуры.ВерсияДанных) Тогда
Если ДанныеНоменклатуры.ЭтоГруппа Тогда
СПР = Справочники.Номенклатура.СоздатьГруппу();
Иначе
СПР = Справочники.Номенклатура.СоздатьЭлемент();
КонецЕсли;
СПР.УстановитьСсылкуНового(СсылкаНоменклатуры);
Иначе
СПР = СсылкаНоменклатуры.ПолучитьОбъект();
КонецЕсли;
СПР.Код = ДанныеНоменклатуры.Код;
СПР.Наименование = ДанныеНоменклатуры.Наименование;
///Если есть родитель, сначала нужно создать родителя, и так до самого корня начала
Если ДанныеНоменклатуры.Родитель <> Неопределено Тогда
СПР.Родитель = СоздатьНоменклатуру(ДанныеНоменклатуры.Родитель);
КонецЕсли;
СПР.Записать();
Возврат СПР.Ссылка;
КонецФункции
Прочитать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);
Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();
Для Каждого Стр Из МассивСтрокДокумента Цикл
Новаястрока = Таблица.Добавить();
КонецЦикла;
(7) В примере выше используются примитивные типы (Структура, строка, массив, число и тд)
А у вас в записях скорее всего содержится объект метаданных 1С одной базы, который отсутствует в другой
Функция РезультатЗапросаВСтруктуре(Знач РезультатЗапроса) Экспорт
Результат = Новый Структура;
Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
Результат.Вставить(Колонка.Имя);
КонецЦикла;
Если РезультатЗапроса.Пустой() Тогда
Возврат Результат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Данные = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Результат, Выборка);
Данные.Добавить(Результат);
КонецЦикла;
Возврат Данные;
КонецФункции // ()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();
Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлуДляЗаписи);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
Для Каждого Строка Из Данные Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");
ЗаписьXML.ЗаписатьАтрибут("КПП", Строка(Строка.Значение.КПП));
ЗаписьXML.ЗаписатьАтрибут("КодПо", Строка(Строка.Значение.КодПо));
ЗаписьXML.ЗаписатьАтрибут("КодБюд", Строка(Строка.Значение.КодБюд));
ЗаписьXML.ЗаписатьАтрибут("Сумма", Строка(Строка.Значение.СуммаПлатежаПоНалогу));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Страны
ЗаписьXML.Закрыть();
Функция РезультатЗапросаВСтруктуре(Знач РезультатЗапроса) Экспорт
Результат = Новый Структура;
Для каждого Колонка Из РезультатЗапроса.Колонки Цикл
Результат.Вставить(Колонка.Имя);
КонецЦикла;
Если РезультатЗапроса.Пустой() Тогда
Возврат Результат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Данные = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Результат, Выборка);
Данные.Добавить(Результат);
КонецЦикла;
Возврат Данные;
КонецФункции // ()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
РезультатЗапроса = Запрос.Выполнить();
Данные = РезультатЗапросаВСтруктуре(РезультатЗапроса);
СписокДанных = новый Массив;
Для Каждого Строка Из Данные Цикл
КаждуюСтрокуВСтруктуру = новый Структура;
КаждуюСтрокуВСтруктуру.Вставить("КПП", Строка(Строка.Значение.КПП));
КаждуюСтрокуВСтруктуру.Вставить("КодПо", Строка(Строка.Значение.КодПо));
КаждуюСтрокуВСтруктуру.Вставить("КодБюд", Строка(Строка.Значение.КодБюд));
КаждуюСтрокуВСтруктуру.Вставить("Сумма", Строка.Значение.СуммаПлатежаПоНалогу); // Можно как число записать
СписокДанных.Добавить(КаждуюСтрокуВСтруктуру);
КонецЦикла;
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлуДляЗаписи);
//Преобразуем массив в объект XDTO
МассивВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокДанных);
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, МассивВОбъектеXDTO);
Запись.Закрыть(); // документ готов!
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПолеИмениФайла);
фабрика = Новый ФабрикаXDTO;
ДокументXDTO = фабрика.ПрочитатьXML(ЧтениеXML);
Таблица = СсылкаДокумент.Тест.Выгрузить();
Таблица.Очистить();
Для Каждого СтрокаТЧ Из ДокументXDTO.Строка Цикл
Новаястрока = Таблица.Добавить();
КонецЦикла;