|   |   | 
| 
 | 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 | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |