Добрый день!
Нужно перенести документы в другую базу, не идентичную. При записи в xml происходит ошибка.
Не пойму в чем дело. Если кто сталкивался, подскажите плиз
Ошибка при вызове метода контекста (ЗаписатьXML)
XDTO.ЗаписатьXML(ФайлXML, ОбъектСФАванс);
по причине:
Ошибочный порядок записи XML
Код:
Нужно перенести документы в другую базу, не идентичную. При записи в 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.Закрыть();
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
А дело в том, что в xml файле корневой элемент должне быть только один, а тут каждый док становится корневым.
Вобщем надо сначала записать начало корневого элемента, потом все документы, потом конец корневого элемента.
Вобщем надо сначала записать начало корневого элемента, потом все документы, потом конец корневого элемента.
Вроде так работает )
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.Закрыть();
Показать
Спасибо, да, формироваться XML начал полноценно
Но с этим новым корневым элементом его не удается считать обратно в 1С, выдается ошибка "Ошибка преобразования данных XDTO. Начало свойства "s" Тип ".... anyType"
я приведу код при помощи которого я гружу это обратно, возможно требуется его доработка (код я брал из примера)
Заранее спасибо за помощь, очень не хватает информации по этому вопросу.
И если можно, киньте кусок XML который у Вас получается, начиная с первой строки (два-три документа в структуре XML), может по нему мне удастся понять что не так.
P.S. Я пытаюсь обмениваться простейшими справочниками, поэтому сделал один цикл, а не два, как советовалось (сам не понял зачем второй)
Но с этим новым корневым элементом его не удается считать обратно в 1С, выдается ошибка "Ошибка преобразования данных XDTO. Начало свойства "s" Тип ".... anyType"
я приведу код при помощи которого я гружу это обратно, возможно требуется его доработка (код я брал из примера)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\XML_unload.xml");
РеализацияОбъект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
РеализацияОбъект.ОбменДанными.Загрузка = Истина;
РеализацияОбъект.Записать();
ЧтениеXML.Закрыть();
КонецПроцедуры
Заранее спасибо за помощь, очень не хватает информации по этому вопросу.
И если можно, киньте кусок XML который у Вас получается, начиная с первой строки (два-три документа в структуре XML), может по нему мне удастся понять что не так.
P.S. Я пытаюсь обмениваться простейшими справочниками, поэтому сделал один цикл, а не два, как советовалось (сам не понял зачем второй)
Чтение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.СчетФактураВыданный>
Показать
Пример вызгрузки и загрузки через 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(Чтение);
//покажем что прочитали, осталось только записать объект
Сообщить(""+ТипЗнч(Объект)+" - "+Объект);
КонецЦикла;
Чтение.Закрыть();
Показать
Вот оно - загрузка 8-)
Это реально работающий код, при помощи (с должными доработками) которого у меня получилось произвести загрузку и выгрузку.
Только вот вопрос написавшему, 2 раза встречается строка .УстановитьСтроку()
В первом случае этого нельзя делать при записи (возникает ошибка), во втором случае у меня загрузка и выгрузка разделены в разные обработки и переменной "текст" попросту нет.
В обоих случаях удалил эту строку, все работает отменно.
Вопрос: зачем она предполагалась?
И еще вопрос: в этом тексте нет ни команды "Запись.ОТкрытьФайл(*ИмяФайла*)" ни "Чтение.ОткрытьФайл(*ИмяФайла*)"
Я их приписал в нужные места. Их и не должно быть или это мне нужно было додуматься?
Это реально работающий код, при помощи (с должными доработками) которого у меня получилось произвести загрузку и выгрузку.
Только вот вопрос написавшему, 2 раза встречается строка .УстановитьСтроку()
В первом случае этого нельзя делать при записи (возникает ошибка), во втором случае у меня загрузка и выгрузка разделены в разные обработки и переменной "текст" попросту нет.
В обоих случаях удалил эту строку, все работает отменно.
Вопрос: зачем она предполагалась?
И еще вопрос: в этом тексте нет ни команды "Запись.ОТкрытьФайл(*ИмяФайла*)" ни "Чтение.ОткрытьФайл(*ИмяФайла*)"
Я их приписал в нужные места. Их и не должно быть или это мне нужно было додуматься?
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот