Использование XDTO

1. AngV 15 09.06.09 12:13 Сейчас в теме
Добрый день!

Нужно перенести документы в другую базу, не идентичную. При записи в xml происходит ошибка.
Не пойму в чем дело. Если кто сталкивался, подскажите плиз

Ошибка при вызове метода контекста (ЗаписатьXML)
XDTO.ЗаписатьXML(ФайлXML, ОбъектСФАванс);
по причине:

Ошибочный порядок записи XML




Код:

  ФайлXML = Новый ЗаписьXML;	
	ФайлXML.ОткрытьФайл(КаталогВыгрузки + "\XML_выгрузка.xml");	
	ФайлXML.ЗаписатьОбъявлениеXML();		
	
	Пути = Новый Массив();
	Пути.Добавить(КаталогВыгрузки + "\DestinationConf.xsd");
	XDTO = СоздатьФабрикуXDTO(Пути);
	СФАванс = XDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.СчетФактураВыданный");
		
	ОбъектСФАванс = XDTO.Создать(СФАванс);
	
	ВыборкаДокументов = Документы.СчетФактураНаАванс.Выбрать(ДатаНач,ДатаКон);
	
	Пока ВыборкаДокументов.Следующий() Цикл
	
	
		ОбъектСФАванс.Ref = ВыборкаДокументов.Ссылка.УникальныйИдентификатор();
		ОбъектСФАванс.DeletionMark = ВыборкаДокументов.ПометкаУдаления;
		ОбъектСФАванс.Date = ВыборкаДокументов.Дата;
		ОбъектСФАванс.Number = ВыборкаДокументов.Номер;
		ОбъектСФАванс.Posted = ВыборкаДокументов.Проведен;
		ОбъектСФАванс.Организация = ВыборкаДокументов.Организация;
		ОбъектСФАванс.Контрагент = ВыборкаДокументов.Контрагент;
		ОбъектСФАванс.ДоговорКонтрагента = ВыборкаДокументов.ДоговорКонтрагента;
		ОбъектСФАванс.СчетНаОплату = ВыборкаДокументов.Счет;
		XDTO.ЗаписатьXML(ФайлXML, ОбъектСФАванс);

	КонецЦикла;
	
	ФайлXML.Закрыть();
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DmitrO-75 09.06.09 16:11 Сейчас в теме
А дело в том, что в xml файле корневой элемент должне быть только один, а тут каждый док становится корневым.
Вобщем надо сначала записать начало корневого элемента, потом все документы, потом конец корневого элемента.
softgarant; ludmila_perekrestova; +2 Ответить
3. AngV 15 10.06.09 09:56 Сейчас в теме
Спасибо, уже разобралась
Дело было именно в этом )
4. jakob291 02.11.09 19:14 Сейчас в теме
А мне видимо не судьба самому.
Может на примере поможете? А то не дойду никак (как записать начало корневого элемента чтобы не нарушить структуру, ее ж потом грузить тем же xdto)
5. AngV 15 03.11.09 09:35 Сейчас в теме
Вроде так работает )



        XDTO = СоздатьФабрикуXDTO(Пути);
	СФАванс = XDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.СчетФактураВыданный");
	ВидыСФ = XDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "EnumRef.НДСВидСчетаФактуры");
	
	ОбъектСФАванс = XDTO.Создать(СФАванс);
	ОбъектВидыСФ = XDTO.Создать(ВидыСФ);
	
	ВыборкаДокументов = Документы.СчетФактураНаАванс.Выбрать(ДатаНач,ДатаКон);
	
	ФайлXML.ЗаписатьНачалоЭлемента("s");

	Пока ВыборкаДокументов.Следующий() Цикл
		
                Для Каждого Стр ИЗ ВыборкаДокументов.Номенклатура Цикл
		
		ОбъектСФАванс.Ref = ВыборкаДокументов.Ссылка.УникальныйИдентификатор();
		ОбъектСФАванс.DeletionMark = ВыборкаДокументов.ПометкаУдаления;
		ОбъектСФАванс.Date = ВыборкаДокументов.Дата;
		ОбъектСФАванс.Number = ВыборкаДокументов.Номер;
		ОбъектСФАванс.Posted = ВыборкаДокументов.Проведен;
		ОбъектСФАванс.Организация = ВыборкаДокументов.Организация;
		ОбъектСФАванс.Контрагент = ВыборкаДокументов.Контрагент;
		ОбъектСФАванс.ДоговорКонтрагента = ВыборкаДокументов.ДоговорКонтрагента;
		ОбъектСФАванс.СчетНаОплату = ВыборкаДокументов.Счет;
		XDTO.ЗаписатьXML(ФайлXML,ОбъектСФАванс);
		
		КонецЦикла;
		
	КонецЦикла;

	ФайлXML.ЗаписатьКонецЭлемента();
				
	ФайлXML.Закрыть();
Показать
6. jakob291 03.11.09 10:09 Сейчас в теме
Спасибо, да, формироваться XML начал полноценно
Но с этим новым корневым элементом его не удается считать обратно в 1С, выдается ошибка "Ошибка преобразования данных XDTO. Начало свойства "s" Тип ".... anyType"

я приведу код при помощи которого я гружу это обратно, возможно требуется его доработка (код я брал из примера)

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\XML_unload.xml");
РеализацияОбъект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
РеализацияОбъект.ОбменДанными.Загрузка = Истина;
РеализацияОбъект.Записать();
ЧтениеXML.Закрыть();
КонецПроцедуры


Заранее спасибо за помощь, очень не хватает информации по этому вопросу.

И если можно, киньте кусок XML который у Вас получается, начиная с первой строки (два-три документа в структуре XML), может по нему мне удастся понять что не так.

P.S. Я пытаюсь обмениваться простейшими справочниками, поэтому сделал один цикл, а не два, как советовалось (сам не понял зачем второй)
7. AngV 15 03.11.09 12:48 Сейчас в теме
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\XML_выгрузка.xml");
СчетФактураВыданный = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
СчетФактураВыданный.ОбменДанными.Загрузка = Истина;
СчетФактураВыданный.Записать(РежимЗаписиДокумента.Запись);
ЧтениеXML.Закрыть();


<?xml version="1.0" encoding="UTF-8"?>

	<DocumentObject.СчетФактураВыданный xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<Ref>759d7bca-6f9d-11de-b9e9-0019bbcae48a</Ref>
		<DeletionMark>false</DeletionMark>
		<Date>2009-04-30T00:00:00</Date>
		<Number>0430900000001</Number>
		<Posted>true</Posted>
		<Организация>fbf16b75-1f4b-11de-a001-001871eb4c1d</Организация>
		<Контрагент>8ca60ce6-33e0-11de-a001-001871eb4c1d</Контрагент>
		<ДоговорКонтрагента>00000000-0000-0000-0000-000000000000</ДоговорКонтрагента>
	</DocumentObject.СчетФактураВыданный>
	<DocumentObject.СчетФактураВыданный xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<Ref>759d7bcb-6f9d-11de-b9e9-0019bbcae48a</Ref>
		<DeletionMark>false</DeletionMark>
		<Date>2009-04-30T00:00:00</Date>
		<Number>0430900000002</Number>
		<Posted>true</Posted>
		<Организация>25a1f66d-727b-11dc-96c5-001731d8548e</Организация>
		<Контрагент>5be343e0-2596-11de-a001-001871eb4c1d</Контрагент>
		<ДоговорКонтрагента>00000000-0000-0000-0000-000000000000</ДоговорКонтрагента>
	</DocumentObject.СчетФактураВыданный>
	<DocumentObject.СчетФактураВыданный xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<Ref>759d7bcc-6f9d-11de-b9e9-0019bbcae48a</Ref>
		<DeletionMark>false</DeletionMark>
		<Date>2009-04-30T00:00:00</Date>
		<Number>0430900000003</Number>
		<Posted>true</Posted>
		<Организация>25a1f66d-727b-11dc-96c5-001731d8548e</Организация>
		<Контрагент>5228692a-f67d-11dd-8af2-001871eb4c1d</Контрагент>
		<ДоговорКонтрагента>00000000-0000-0000-0000-000000000000</ДоговорКонтрагента>
	</DocumentObject.СчетФактураВыданный>
Показать
8. AngV 15 03.11.09 12:56 Сейчас в теме
черт, у меня такая же ошибка!
9. AngV 15 03.11.09 12:57 Сейчас в теме
если честно я плюнула тогда на XDTO и сделала просто через xml, наверное из-за этой ошибки )
10. AngV 15 03.11.09 12:59 Сейчас в теме
могу скинуть обработку, если что ;)
11. jakob291 03.11.09 13:07 Сейчас в теме
Если можете - скиньте, перенастрою начальство может быть.
Никак не сориентируюсь как дать Вам увидеть какие-нибудь мои контакты, чтобы не писать в открытую.
Как еще можно?
12. DmitrO-75 10.11.09 11:46 Сейчас в теме
Пример вызгрузки и загрузки через XDTO:
    //Имя справочника для примера
    ИмяСправочника = "Номенклатура";
    
    ////////////////////////////////////////////////////////////­/////////////
    //Выгрузка
    
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    
    //записываем объявление xml файла: <?xml version="1.0"?>
    Запись.ЗаписатьОбъявлениеXML();
    
    //записываем корневой элемент, по спецификации xml он может быть только один, назовем его "Данные"
    Запись.ЗаписатьНачалоЭлемента("Данные");
    
    //для того чтобы пространства имен не объявлялись сериализатором в кажом элементе, пишем их в корневой элемент
    //они будут работать на все вложеные элементы
    //пространство имен по-умолчанию
    Запись.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config");
    
    //пространства имен остальные префиксы
    Запись.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema");
    Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    
    //ограничение количества выгружаемых элементов для примера
    Кол = 4;
    Выборка = Справочники[ИмяСправочника].Выбрать();
    Пока Выборка.Следующий() Цикл
        
        //вместо этого кода в боевой реализации выгрузки будет создание ОбъектаXDTO и его сериализация
        //через ФабрикуXDTO и загруженные в нее схемы конфигурации приемника
        СериализаторXDTO.ЗаписатьXML(Запись, Выборка.ПолучитьОбъект());
        //
        
        Кол = Кол - 1;
        Если Кол=0 Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    //записываем конец корневого элемента
    Запись.ЗаписатьКонецЭлемента();
    
    //покажем что получилось
    Текст = Запись.Закрыть();
    Сообщить("Содержимое файла:");
    Сообщить(Текст);
    
    //а теперь загрузим это обратно
    
    ////////////////////////////////////////////////////////////­/////////////
    //Загрузка
    Сообщить("Данные полученные при загрузке:");
    
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(Текст);
    
    //прочитаем начало xml файла
    Чтение.ПерейтиКСодержимому();
    
    //прочитаем начало корневого элемента
    Чтение.Прочитать();
    
    //читаем содержимое пока текущим не станет конец корневого элемента, т.к. мы писали туда только целые элементы справочника,
    //а сериализатор читает каждый из их полностью, то мы упремся именно в конец корневого
    Пока Чтение.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл
        
        //читаем очередной элемент справочника
        Объект = СериализаторXDTO.ПрочитатьXML(Чтение);
        
        //покажем что прочитали, осталось только записать объект
        Сообщить(""+ТипЗнч(Объект)+" - "+Объект);
    КонецЦикла;
    
    Чтение.Закрыть();
Показать
Dolour; softgarant; EMelihoff; pit201201; webester; nissal; +6 Ответить
13. jakob291 10.11.09 20:11 Сейчас в теме
Вот оно - загрузка 8-)

Это реально работающий код, при помощи (с должными доработками) которого у меня получилось произвести загрузку и выгрузку.
Только вот вопрос написавшему, 2 раза встречается строка .УстановитьСтроку()
В первом случае этого нельзя делать при записи (возникает ошибка), во втором случае у меня загрузка и выгрузка разделены в разные обработки и переменной "текст" попросту нет.
В обоих случаях удалил эту строку, все работает отменно.
Вопрос: зачем она предполагалась?
И еще вопрос: в этом тексте нет ни команды "Запись.ОТкрытьФайл(*ИмяФайла*)" ни "Чтение.ОткрытьФайл(*ИмяФайла*)"
Я их приписал в нужные места. Их и не должно быть или это мне нужно было додуматься?
Оставьте свое сообщение

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