Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
11 дек 2024, 13:29

Ошибка преобразования данных XDTO

Автор MRAK87, 25 июл 2014, 10:58

0 Пользователей и 1 гость просматривают эту тему.

MRAK87

Здравствуйте.

У меня есть веб сервис на 1С 8.2. С помощью XDTO создал 2 пакета с пространством имен http://irz.tmc.org/MyHeader и http://irz.tmc.org/Classification:

Представлены XSD схема этих пакетов

<xs:schema xmlns:ns1="http://irz.tmc.org/Classification" xmlns:tns="http://irz.tmc.org/MyHeader" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://irz.tmc.org/MyHeader" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:import namespace="http://irz.tmc.org/Classification"/>
<xs:complexType name="MyDocumentHeader">
<xs:sequence>
<xs:element name="MySupplier" type="ns1:SupplierClass"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="SupplierEx">
<xs:sequence>
<xs:element name="IdSupplier" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

<xs:schema xmlns:tns="http://irz.tmc.org/Classification" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://irz.tmc.org/Classification" attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xs:complexType name="SupplierClass">
    <xs:sequence>
      <xs:element name="IdSupplier" type="xs:string" nillable="true" minOccurs="0"/>
      <xs:element name="SupplierName" type="xs:string" nillable="true" minOccurs="0"/>
      <xs:element name="URF" type="xs:int" nillable="true" minOccurs="0"/>
      <xs:element name="INN" type="xs:string" nillable="true" minOccurs="0"/>
      <xs:element name="KPP" type="xs:string" nillable="true" minOccurs="0"/>
      <xs:element name="IdRegion" type="xs:string" nillable="true" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>


Я вызываю данный веб сервис из Delphi 2006:

procedure TForm1.Button1Click(Sender: TObject);
var
  header: MyDocumentHeader;
  Supp: SupplierClass;
  res: WebServiceUPP1CPortType;
  result: string;
begin
  Supp := SupplierClass.Create;
  Supp.IdSupplier := '343';
  Supp.URF := 45;
  Supp.SupplierName := '32354';
  Supp.KPP := '444';
  Supp.INN := '234234';
  Supp.IdRegion := '18';

  res := GetWebServiceUPP1CPortType();

  header := MyDocumentHeader.Create;
  header.MySupplier := Supp;

  result := res.MyCreate(header);

  ShowMessage(result);
end;
 

Delphi 2006 генерирует файл с описанием веб сервиса:

  WebServiceUPP1CPortType = interface(IInvokable)
  ['{C2795ED9-E73E-C9FA-328F-6320FBA4DC2F}']
    function  MyCreate(const Header: MyDocumentHeader): WideString; stdcall;
  end;

function GetWebServiceUPP1CPortType(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): WebServiceUPP1CPortType;
const
  defWSDL = 'http://192.168.56.21:55556/upp1c.1cws?wsdl';
  defURL  = 'http://192.168.56.21:55556/upp1c.1cws';
  defSvc  = 'WebServiceUPP1C';
  defPrt  = 'WebServiceUPP1CSoap';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as WebServiceUPP1CPortType);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;

  // XML       : MyDocumentHeader, global, <complexType>
  // Namespace : http://irz.tmc.org/MyHeader
  MyDocumentHeader = class(TRemotable)
  private
    FMySupplier: SupplierClass;
  public
    destructor Destroy; override;
  published
    property MySupplier: SupplierClass read FMySupplier write FMySupplier;
  end;

  // XML       : SupplierClass, global, <complexType>
  // Namespace : http://irz.tmc.org/Classification
  SupplierClass = class(TRemotable)
  private
    FIdSupplier: WideString;
    FSupplierName: WideString;
    FURF: Integer;
    FINN: WideString;
    FKPP: WideString;
    FIdRegion: WideString;
  published
    property IdSupplier: WideString read FIdSupplier write FIdSupplier;
    property SupplierName: WideString read FSupplierName write FSupplierName;
    property URF: Integer read FURF write FURF;
    property INN: WideString read FINN write FINN;
    property KPP: WideString read FKPP write FKPP;
    property IdRegion: WideString read FIdRegion write FIdRegion;
  end;


При вызове метода MyCreate падает ошибка:
Ошибка преобразования данных XDTO. Структура объекта не соответствует типу
MyDocumentHeader по полю SupplierClass.

Данная ошибка не падает на Delphi XE2, также пробовал написать клиент на C# и все тоже работает с вызовом веб сервиса. Видимо ошибка в самой Delphi 2006. Но может кто-то сталкивался с такой проблемой именно при использовании Delphi 2006.
Самое интересное, что если перенести описание SupplierClass из пакета http://irz.tmc.org/Classification в пакет http://irz.tmc.org/MyHeader то все работает на Delphi 2006.
Почему когда SupplierClass описан в другом пакете XDTO и вызов сервиса происходит из Delphi 2006, то падает такая ошибка.

P.S. На форуме embarcadero я уже оставил сообщение, может они что-то подскажут. Вариант с переносом все в один пакет тоже возможен. Интересно почему именно с разными пакетами выдает ошибку?

Теги: XDTO wsdl delphi 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск