|
XDTO обмен между базами | ☑ | ||
---|---|---|---|---|
0
wmzdeadman
03.10.13
✎
17:23
|
Борюсь с XDTO. Помогите, чем можете. Пересмотрел кучу веток уже, но так и не победил.
Задача - две базы 1С (для теста сделал одинаковые). Надо документ перемещение выгрузить в базу-приемник как документ оприходование. Казалось чего проще: из базы-приемника экспортировал xml-схему в базу источника, далее в базе источника для необязательных полей в пакете xdto у документа оприходование установил свойсто "возможно пустое = истина", написал обработку выгрузки - получил xml файл. из источника экспортировал измененную схему xml, по которой в приемнике создаю фабрику xdto и пытаюсь сериализовать файл выгрузки, однако ошибка Форма.Форма(19)}: Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка преобразования данных XDTO: НачалоСвойства: {http://v8.1c.ru/8.1/data/enterprise/current-config}DocumentObject.ОприходованиеТоваров Форма: Элемент Тип: {http://v8.1c.ru/8.1/data/enterprise/current-config}DocumentObject.ОприходованиеТоваров |
|||
1
wmzdeadman
03.10.13
✎
17:25
|
обработка выгрузки из базы источника
URI = "http://v8.1c.ru/8.1/data/enterprise/current-config"; ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ПутьКВыгрузке); ТипОприходование = ФабрикаXDTO.Тип(URI, "DocumentObject.ОприходованиеТоваров"); ТипОприходованиеТовары = ФабрикаXDTO.Тип(URI, "DocumentTabularSectionRow.ОприходованиеТоваров.Товары"); ОбъектОприходвание = ФабрикаXDTO.Создать(ТипОприходование); ОбъектОприходваниеТовары = ФабрикаXDTO.Создать(ТипОприходованиеТовары); Если ЗначениеЗаполнено(ДокПеремещение) Тогда ОбъектОприходвание.Ref = Новый УникальныйИдентификатор(); ОбъектОприходвание.DeletionMark = докПеремещение.ПометкаУдаления; ОбъектОприходвание.Date = докПеремещение.Дата; ОбъектОприходвание.Number = докПеремещение.Номер; ОбъектОприходвание.Posted = Ложь; ОбъектОприходвание.Фирма = докПеремещение.Фирма; ОбъектОприходвание.Склад = докПеремещение.СкладОтправитель; ОбъектОприходвание.Комментарий = "тестовая перегрузка через xdto"; КонецЕсли; Для Каждого ТекСтрока Из докПеремещение.Товары Цикл ЗаполнитьЗначенияСвойств(ОбъектОприходваниеТовары, ТекСтрока); ОбъектОприходвание.Товары.Добавить(ОбъектОприходваниеТовары); КонецЦикла; ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектОприходвание); ЗаписьXML.Закрыть(); |
|||
2
badboychik
03.10.13
✎
17:28
|
XDTO ведь пригодно только для обмена идентичными объектами.
А у тебя надо конвертацией правило создавать или самому в коде обработки-приемника преобразовывать Перемещение в Оприходование. |
|||
3
wmzdeadman
03.10.13
✎
17:28
|
обработка загрузки
Пути = Новый Массив(); Пути.Добавить(ПутьКСхеме); мояФабрика = СоздатьФабрикуXDTO(Пути); ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ПутьКВыгрузке); Попытка СериализаторXDTO.ПрочитатьXML(ЧтениеXML); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; //Если Не ДокОприходование.Пустая() Тогда // ОбъектДокОприходование = ДокОприходование.ПолучитьОбъект(); // ОбъектДокОприходование.Записать(РежимЗаписиДокумента.Запись); //КонецЕсли; ЧтениеXML.Закрыть(); |
|||
4
wmzdeadman
03.10.13
✎
17:29
|
обработка загрузки
Пути = Новый Массив(); Пути.Добавить(ПутьКСхеме); мояФабрика = СоздатьФабрикуXDTO(Пути); ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ПутьКВыгрузке); Попытка СериализаторXDTO.ПрочитатьXML(ЧтениеXML); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; //Если Не ДокОприходование.Пустая() Тогда // ОбъектДокОприходование = ДокОприходование.ПолучитьОбъект(); // ОбъектДокОприходование.Записать(РежимЗаписиДокумента.Запись); //КонецЕсли; ЧтениеXML.Закрыть(); |
|||
5
wmzdeadman
03.10.13
✎
17:31
|
почему только идентичными - какая разница из какого объекта какой делать? я ведь тип определяю для нового объекта XDTO - оприходование, и данные он должен эти понимать
|
|||
6
wmzdeadman
03.10.13
✎
17:32
|
(2) вот же определяю какой объект хочу создать:
ТипОприходование = ФабрикаXDTO.Тип(URI, "DocumentObject.ОприходованиеТоваров"); ТипОприходованиеТовары = ФабрикаXDTO.Тип(URI, "DocumentTabularSectionRow.ОприходованиеТоваров.Товары"); ОбъектОприходвание = ФабрикаXDTO.Создать(ТипОприходование); ОбъектОприходваниеТовары = ФабрикаXDTO.Создать(ТипОприходованиеТовары); |
|||
7
wmzdeadman
03.10.13
✎
17:34
|
кусок схемы
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://v8.1c.ru/8.1/data/core" xmlns:ns2="http://v8.1c.ru/8.1/data/enterprise" xmlns:tns="http://v8.1c.ru/8.1/data/enterprise/current-config" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://v8.1c.ru/8.1/data/enterprise/current-config"> <xsd:import namespace="http://v8.1c.ru/8.1/data/core"/> <xsd:import namespace="http://v8.1c.ru/8.1/data/enterprise"/> <xsd:complexType name="DocumentObject.ОприходованиеТоваров"> <xsd:sequence> <xsd:element name="Ref" type="tns:DocumentObject.ОприходованиеТоваров"/> <xsd:element name="DeletionMark" type="xsd:boolean"/> <xsd:element name="Date" type="xsd:dateTime"/> <xsd:element name="Number" type="xsd:string"/> <xsd:element name="Posted" type="xsd:boolean"/> <xsd:element name="Автор" nillable="true" type="tns:CatalogRef.акСотрудники"/> <xsd:element name="Фирма" type="tns:CatalogRef.Фирмы"/> <xsd:element name="Склад" type="tns:CatalogRef.Склады"/> <xsd:element name="Комментарий" type="xsd:string"/> <xsd:element name="ОснованиеОрдерногоУчета" nillable="true" type="tns:DocumentRef.ОрдерОприходованияТоваров"/> <xsd:element name="Валюта" nillable="true" type="tns:CatalogRef.Валюты"/> <xsd:element name="КратностьВзаиморасчетов" nillable="true" type="xsd:decimal"/> <xsd:element name="КурсВзаиморасчетов" nillable="true" type="xsd:decimal"/> <xsd:element name="Подразделение" nillable="true" type="tns:CatalogRef.акПодразделения"/> <xsd:element name="Ответственный" nillable="true" type="tns:CatalogRef.акСотрудники"/> <xsd:element name="ДокументОснование" nillable="true"/> <xsd:element name="СуммаВключаетНДС" nillable="true" type="xsd:boolean"/> <xsd:element name="ТипЦен" nillable="true" type="tns:CatalogRef.ТипыЦенНоменклатуры"/> <xsd:element maxOccurs="99999" minOccurs="0" name="Товары" nillable="true" type="tns:DocumentTabularSectionRow.ОприходованиеТоваров.Товары"/> |
|||
8
Serginio1
03.10.13
✎
17:35
|
Если ты пользуешься СериализаторXDTO то и записывай фыбрикой загружаемой уонфигурации.
Пути = Новый Массив(); Пути.Добавить(ПутьКСхеме); мояФабрика = СоздатьФабрикуXDTO(Пути); ТипОприходование = мояФабрика .Тип(URI, "DocumentObject.ОприходованиеТоваров"); ТипОприходованиеТовары = мояФабрика .Тип(URI, "DocumentTabularSectionRow.ОприходованиеТоваров.Товары"); мояФабрика .ЗаписатьXML(ЗаписьXML, ОбъектОприходвание); |
|||
9
wmzdeadman
03.10.13
✎
17:35
|
для ref уже написал type="tns:DocumentObject.ОприходованиеТоваров" вместо
type="tns:DocumentRef.ОприходованиеТоваров" но не помогает |
|||
10
wmzdeadman
03.10.13
✎
17:39
|
(8) не очень понял
везде пишут что запись очень проста, типа того ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайла); ПриходнаяНакладнаяОбъект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); ПриходнаяНакладнаяОбъект.ОбменДанными.Загрузка = Истина; ПриходнаяНакладнаяОбъект.Записать(РежимЗаписиДокумента.Запись); ЧтениеXML.Закрыть(); но вот не выходит оно так - падает на Ошибка преобразования данных XDTO |
|||
11
Serginio1
03.10.13
✎
17:44
|
У тебя конфигурации разные. Поэтому при записи ты должен использовать схему загружаемой конфигурации, которую ты должен предварительно выгрузит в ПутьКСхеме
|
|||
12
Serginio1
03.10.13
✎
17:45
|
При записи в файл ты должен использовать схему не текущей базы, а схему базы в которую загружаешь
|
|||
13
wmzdeadman
03.10.13
✎
17:50
|
(11, 12) Одинаковые абсолютно! конфигурации - в шапке же указал - в качестве теста две одинаковые конфы, только из дока перемещние - делаю оприходование
|
|||
14
Serginio1
03.10.13
✎
18:02
|
(7) И где ты эту схему используешь?
Для проверки выгрузи какой нибудь реальный документ ОприходованиеТоваров и загрузи. Если загрузка произойдет нормально смотри фыйлы. |
|||
15
badboychik
03.10.13
✎
18:03
|
ты просто создал объект XDTO и заполнил некоторые свойства. Возможно не все, что надо. Сериализуй существующий документ оприходования и сравни полученный файл со своим
|
|||
16
Serginio1
03.10.13
✎
18:04
|
(7)Всем nillable присвой неопределено.
|
|||
17
wmzdeadman
03.10.13
✎
18:05
|
(15) для тех полей которые я не заполняю я в схеме указываю свойство nillable="true"
|
|||
18
wmzdeadman
03.10.13
✎
18:06
|
зачем, если оно итак не обязательно к заполнению?
|
|||
19
wmzdeadman
03.10.13
✎
18:06
|
для веб сервиса такая тема проходила с nillable="true"
|
|||
20
badboychik
03.10.13
✎
18:07
|
(17) то есть ты еще и схему покорежил?
|
|||
21
wmzdeadman
03.10.13
✎
18:07
|
надо последнюю 8.2 поставить и попробовать простые примеры, может моя древняя 8.1.15 не воспринимает сие
|
|||
22
wmzdeadman
03.10.13
✎
18:08
|
(20) да))) но не покорежил - а изменил некоторые свойства, что такого то, чего ее боятся теперь эту схему и молиться на нее, если она гадина не работает))
|
|||
23
Serginio1
03.10.13
✎
18:17
|
(22) Схемы должны быть одинаковыми. Пользуйся схемой загрузки.
Для nillable нужно присваивать как неопределено, что бы в фыйл писалось как <Валюта xsi:nil="true" /> Если неопределить то в файл это свойство не пишется. Для таких нужно установливать минимальное количество 0 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |