Имя: Пароль:
1C
1С v8
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
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.