Интеграция 1С со службой доставки DPD

Делал интеграцию с DPD через SOAP сервис, конечно же само сразу не заработало.

Написал в поддержку, ответили что я не передаю не правильные заголовки XML, т.е. сам дурак, а у них все работает. В общем то на их месте я бы так же ответил ) Большое спасибо что указали верные заголовки ))

Пришлось пилить костыли отправки XML на ихний сервер.

Процедура Отправить()

    URL = "http://wstest.dpd.ru/services/order2?wsdl";
    URL = "http://ws.dpd.ru/services/order2?wsdl";

    WSОпределения = Новый WSОпределения(URL);
    Namespace = WSОпределения.Сервисы[0].URIПространстваИмен;
    WSПрокси = Новый WSПрокси(WSОпределения, Namespace, WSОпределения.Сервисы[0].Имя, WSОпределения.Сервисы[0].ТочкиПодключения[0].Имя);

    НастройкиDPD = Настройки.Найти(Организация, "Организация");
    Если НастройкиDPD = Неопределено Тогда Продолжить;
    КонецЕсли;

    auth = WSОпределения.ФабрикаXDTO.Создать(WSОпределения.ФабрикаXDTO.Тип(Namespace, "auth"));
    auth.clientKey = НастройкиDPD.clientKey;
    auth.clientNumber = НастройкиDPD.clientNumber;

    senderAddress = WSОпределения.ФабрикаXDTO.Создать(WSОпределения.ФабрикаXDTO.Тип(Namespace, "address"));
    ЗаполнитьАдресОтправителя(senderAddress, Организация);

    header = WSОпределения.ФабрикаXDTO.Создать(WSОпределения.ФабрикаXDTO.Тип(Namespace, "header"));
    header.datePickup = Формат(ПутевойЛист.ДатаЗабораDPD, "ДФ=yyyy-MM-dd");
    header.senderAddress = senderAddress;

    dpdOrdersData = WSОпределения.ФабрикаXDTO.Создать(WSОпределения.ФабрикаXDTO.Тип(Namespace, "dpdOrdersData"));
    dpdOrdersData.auth = auth;
    dpdOrdersData.header = header;

    receiverAddress = WSОпределения.ФабрикаXDTO.Создать(WSОпределения.ФабрикаXDTO.Тип(Namespace, "address"));
    ЗаполнитьАдресПолучателя(receiverAddress, Заказ);

    order = WSОпределения.ФабрикаXDTO.Создать(WSОпределения.ФабрикаXDTO.Тип(Namespace, "order"));
    order.orderNumberInternal = a_ВолшебныйМодульСерверПовтор.ПолучитьНомер(Заказ.НомерДилер);
    order.serviceCode = "CUR";
    order.serviceVariant = "ДД";
    order.cargoNumPack = 1;
    order.cargoWeight = 2;
    order.cargoVolume = 2;
    order.cargoRegistered = Ложь;
    order.cargoCategory = "мебель";
    order.receiverAddress = receiverAddress;

    dpdOrdersData.order.Добавить(order);

    createOrder = WSОпределения.ФабрикаXDTO.Создать(WSОпределения.ФабрикаXDTO.Тип(Namespace, "createOrder"));
    createOrder.orders = dpdOrdersData;

    Результат = ОтправитьСообщение("createOrder",
        URL,
        WSОпределения.ФабрикаXDTO,
        createOrder,
        "orders");

    Если ТипЗнч(Результат) = Тип("Строка") Тогда Возврат;
    КонецЕсли;

    Если Результат.Статус <> 200 Тогда Возврат;
    КонецЕсли;

    ПрочитатьОтвет(Результат.Ответ, ТабЗаказов);

КонецПроцедуры

Функция ОтправитьСообщение(Сервис, URL, ФабрикаСервиса, Сообщение, Тег)

    ИмяФайлаВыгрузки = ПолучитьИмяВременногоФайла("xml");

    ДокументXML = Новый ЗаписьXML;
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0");
    ДокументXML.ОткрытьФайл(ИмяФайлаВыгрузки, ПараметрыЗаписиXML);
    ДокументXML.ЗаписатьОбъявлениеXML();
    ФабрикаСервиса.ЗаписатьXML(ДокументXML, Сообщение);
    ДокументXML.Закрыть();

    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.Прочитать(ИмяФайлаВыгрузки);
    ОсновнойТекст = ТекстовыйДокумент.ПолучитьТекст();

    НачалоДокумента = "
        |
        |
        |";

    КонецДокумента = "
        |
        |";

    НачалоОбласти = Найти(ОсновнойТекст, "<" + Тег + ">");
    КонецОбласти  = Найти(ОсновнойТекст, "+ Тег + ">") + СтрДлина("+ Тег + ">") - НачалоОбласти;

    Документ = СокрЛП(Сред(ОсновнойТекст, НачалоОбласти, КонецОбласти));

    НовыйДокумент = НачалоДокумента + Символы.ПС + Документ + Символы.ПС + КонецДокумента;

    ТекстовыйДокумент.Очистить();
    ТекстовыйДокумент.УстановитьТекст(НовыйДокумент);
    ТекстовыйДокумент.Записать(ИмяФайлаВыгрузки);

    Таймаут = 20000;

    WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.SetTimeouts(Таймаут, Таймаут, Таймаут, Таймаут);
    WinHttp.Option(2, "utf-8");
    WinHttp.Open("POST", URL);
    WinHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");

    Попытка     WinHttp.Send(НовыйДокумент);
    Исключение  Возврат "(-1) " + ОписаниеОшибки();
    КонецПопытки;

    Ответ = Новый Структура();
    Ответ.Вставить("Ответ", WinHttp.ResponseText);
    Ответ.Вставить("Статус", WinHttp.Status);
    Ответ.Вставить("ОписаниеСтатуса", WinHttp.StatusText);

    Возврат Ответ

КонецФункции

Процедура ПрочитатьОтвет(Ответ, ТабЗаказов)

    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(Ответ);

    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);

    ЭлементыReturn = ДокументDOM.ПолучитьЭлементыПоИмени("return");

    Для Каждого Заказ Из ЭлементыReturn Цикл

        ЭлементOrderNumberInternal = Заказ.ПолучитьЭлементыПоИмени("orderNumberInternal");
        Если ЭлементOrderNumberInternal.Количество() = 0 Тогда Продолжить;
        КонецЕсли;

        Номер = ЭлементOrderNumberInternal[0].ТекстовоеСодержимое;
        Строки = ТабЗаказов.НайтиСтроки(Новый Структура("Номер", Номер));
        СтрЗаказ = Строки[0];

        ЭлементStatus = Заказ.ПолучитьЭлементыПоИмени("status");
        Если ЭлементStatus.Количество() > 0 Тогда СтрЗаказ.Статус = ЭлементStatus[0].ТекстовоеСодержимое;
        КонецЕсли;

        ЭлементErrorMessage = Заказ.ПолучитьЭлементыПоИмени("errorMessage");
        Если ЭлементErrorMessage.Количество() > 0 Тогда СтрЗаказ.Ошибка = ЭлементErrorMessage[0].ТекстовоеСодержимое;
        КонецЕсли;

    КонецЦикла;

КонецПроцедуры

Добавить комментарий