Отправка файлов через SOAP. SOAP with attachments, MTOM

18.04.19

Интеграция - WEB-интеграция

В продолжение «своеобразной» поддержки 1С протокола SOAP, описанной в https://infostart.ru/public/965259/, опишу еще одну особенность. 1С не поддерживает возможность отправки файлов-вложений. Для решения этой проблемы пришлось самостоятельно писать формирование пакетов SOAP и разбор ответов сервера.

Была задача сделать обмен 1С с  электронной торговой площадкой B2B-Center (https://www.b2b-center.ru/). У площадки есть SOAP интерфейс, но передача файлов поддерживается только по протоколу MTOM. Описание этого протокола есть здесь https://www.w3.org/TR/SOAP-attachments и здесь https://www.soapui.org/docs/soap-and-wsdl/attachments.html.

Если говорить кратко, то запрос SOAP представляет из себя HTTP POST запрос, в теле которого расположены данные в формате XML. Данные запрос представляют собой «конверт», содержащий заголовок запроса и тело запроса.  Если нужно отправить файл, то все сообщение оформляется multipart, одной частью является SOAP запрос, а файлы прикладываются как остальные части.


                                                         

 

Будем считать, что wsdl ссылка у нас успешно импортирована и мы может создавать XDTO объекты для обмена.

Местоположение = "https://demo.b2b-center.ru/market/remote_alternative.html";
URIПространстваИмен = "urn:ws";
ИмяСервиса = "ws";
ИмяТочкиПодключения = "wsPort";
АдресWSDL =  Местоположение + "?wsdl";
ИнтернетПрокси = ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(АдресWSDL);
Таймаут = 120;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;

WSПрокси = WSСсылки.WS_B2B_Center.СоздатьWSПрокси(URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения,
        ИнтернетПрокси, Таймаут, ЗащищенноеСоединение, Местоположение);

WSПрокси.Пользователь = "ИмяПользователя";
WSПрокси.Пароль       = "Пароль";


// отправка запроса без файлов
                ТипАвторизация      = WSПрокси.ФабрикаXDTO.Тип(URIПространстваИмен, "auth_info");
                ТипВнешнийИД        = WSПрокси.ФабрикаXDTO.Тип(URIПространстваИмен, "external_id");        
                Авторизация         = WSПрокси.ФабрикаXDTO.Создать(ТипАвторизация);
                
                Авторизация.token   = "Билет";
                ВнешнийИД           = WSПрокси.ФабрикаXDTO.Создать(ТипВнешнийИД);
                
                ВнешнийИД.id        = "Идентификатор";
                ВнешнийИД.type      = 0;
                
                Этап                = 0; //Номер этапа, 0 - основной, 1 - первая переторжка, 2 - вторая переторжка и т.д
                                
                ВходныеПараметры = Новый Структура;
                ВходныеПараметры.Вставить("auth",Авторизация);
                ВходныеПараметры.Вставить("auction_id",ИД_Аукциона);
                ВходныеПараметры.Вставить("external_id",ВнешнийИД);
                
                ВыходныеПараметры = Новый Структура;
                ВыходныеПараметры.Вставить("return","ret_auction_position");
                
                // получим данные по позициям от площадки для связки позиций в 1С и на площадке
                ОтветСервера = ОтправитьSOAPЗапрос(WSПрокси,URIПространстваИмен,"getPositions","RemoteAuction_getPositions",ВходныеПараметры,ВыходныеПараметры);
Успешно = (Число(ОтветСервера.status.error_code) = 0);                
Если НЕ Успешно Тогда
         ВызватьИсключение ОтветСервера.status.error_message;    
КонецЕсли;  


// отправка запроса с вложенными файлами
    СвязанныеФайлы  =   СвязанныеФайлыВызовСервера.СвязанныеФайлыПоВладельцу(Ссылка);

    Для каждого Файл Из СвязанныеФайлы Цикл
        Если ТипЗнч(Файл.Файл) <> Тип("СправочникСсылка.Файлы")  Тогда
            Продолжить;	
        КонецЕсли; 
        
        ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия(Файл.Файл, Неопределено, Неопределено, Неопределено, Неопределено);	
        
        // отправить файл
        // отправляем файлы по одному, чтобы можно было отправлять файлы максимального размера                    
        Хеш = Новый ХешированиеДанных(ХешФункция.MD5);
        Хеш.Добавить(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
        
        ИмяФайла     =   WSПрокси.ФабрикаXDTO.Создать(ТипИмяФайла);
        ИмяФайла.filename   = СтрШаблон("%1.%2",ДанныеФайла.Наименование,ДанныеФайла.Расширение);
        ИмяФайла.md5        = ПолучитьHexСтрокуИзДвоичныхДанных(Хеш.ХешСумма);    
        
        МассивФайлов = Новый Массив;
        МассивФайлов.Добавить(ДанныеФайла);
        
        Действие = "uploadDoc";
        Метод = "RemoteAuction_uploadDoc";
        
        ВходныеПараметры = Новый Структура;
        ВходныеПараметры.Вставить("auth",Авторизация);
        ВходныеПараметры.Вставить("auction_id",ИД_Аукциона);
        ВходныеПараметры.Вставить("external_id",ВнешнийИД);
        ВходныеПараметры.Вставить("type","docs");
        ВходныеПараметры.Вставить("append_mode",1);
        ВходныеПараметры.Вставить("attachment_name",ИмяФайла);      
        
        ВыходныеПараметры = Новый Структура;
        ВыходныеПараметры.Вставить("return","ret_status");
        
        ОтветСервера = ОтправитьSOAPЗапросСФайлами(WSПрокси,URIПространстваИмен,Действие,Метод,ВходныеПараметры,МассивФайлов,ВыходныеПараметры);                                    
        
        Успешно = (Число(ОтветСервера.status.error_code) = 0);
        Если НЕ Успешно Тогда
            ВызватьИсключение ОтветСервера.status.error_message;	
        КонецЕсли;         	
       
   КонецЦикла;








     /// ---------------------------------------------------------------------------------------------------------- 
// Работа с SOAP

Функция ОтправитьSOAPЗапрос(WSПрокси,URIПространстваИмен,Действие,Метод,ВходныеПараметры,ВыходныеПараметры)
    
    Результат = Неопределено;
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type",  "text/xml;charset=UTF-8");
    Заголовки.Вставить("SOAPAction",    СтрШаблон("%1#%2",URIПространстваИмен,Действие));

    ПространствоИменSOAP = "http://schemas.xmlsoap.org/soap/envelope/";
        
    // формируем конверт    
    ТелоЗапросаSOAP =  СформироватьКонвертSOAP(WSПрокси,URIПространстваИмен,Метод,ВходныеПараметры);    
 
    
    HTTPЗапрос = Новый HTTPЗапрос("/market/remote_alternative.html", Заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаSOAP, "UTF-8");
    
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);   
    ПроксиСервер = Новый ИнтернетПрокси(Истина);     
    
    // https://demo.b2b-center.ru/market/remote_alternative.html
    HTTPСоединение = Новый HTTPСоединение("demo.b2b-center.ru",,,,ПроксиСервер,120,ЗащищенноеСоединение); 
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    //
    ОтветСервера =  HTTPОтвет.ПолучитьТелоКакСтроку();
    
    // Обработка результата
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ОтветСервера);
    
    Результат = Новый Структура;
    
    Пока ЧтениеXML.Прочитать() Цикл        
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяЭлемента = СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(ЧтениеXML.Имя);
            Если ВыходныеПараметры.Свойство(ИмяЭлемента) Тогда
                ТипОтвета = WSПрокси.ФабрикаXDTO.Тип(URIПространстваИмен,ВыходныеПараметры[ИмяЭлемента]);
                РезультатXDTO = WSПрокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОтвета);
                Если ТипЗнч(РезультатXDTO) = Тип("ОбъектXDTO") Тогда
                    //Результат = ОбъектXDTOВСтруктуру(РезультатXDTO);
                    Результат = РезультатXDTO;
                    Прервать;
                КонецЕсли;
            КонецЕсли; 
        КонецЕсли; 
    КонецЦикла; 
    
    ЧтениеXML.Закрыть();
        
    Возврат Результат;
    
КонецФункции
 
Функция ОтправитьSOAPЗапросСФайлами(WSПрокси,URIПространстваИмен,Действие,Метод,ВходныеПараметры,СписокФайлов,ВыходныеПараметры)
    
    Результат = Неопределено;
    
    Разделитель = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", ""); 
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type",  "text/xml;charset=UTF-8");
    Заголовки.Вставить("Content-Type",СтрШаблон("multipart/related; type=""text/xml""; boundary=""%1""",Разделитель));
    Заголовки.Вставить("SOAPAction",    СтрШаблон("%1#%2",URIПространстваИмен,Действие));
    
    // формируем конверт    
    ТелоЗапросаSOAP =  СформироватьКонвертSOAP(WSПрокси,URIПространстваИмен,Метод,ВходныеПараметры);    
    
    ПотокТелоЗапроса = Новый ПотокВПамяти();
    ЗаписьДанных = Новый ЗаписьДанных(ПотокТелоЗапроса);
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("--%1",Разделитель));
    ЗаписьДанных.ЗаписатьСтроку("Content-Type: text/xml; charset=UTF-8");
    ЗаписьДанных.ЗаписатьСтроку("Content-Transfer-Encoding: 8bit");
    ЗаписьДанных.ЗаписатьСтроку("");

    ЗаписьДанных.ЗаписатьСтроку(ТелоЗапросаSOAP);

    // добавляем файлы
    Для каждого ДанныеФайла Из СписокФайлов Цикл
        
        ДопустимоеНаименованиеФайла = СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(ДанныеФайла.Наименование);
        ДопустимоеРасширениеФайла = СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(ДанныеФайла.Расширение);
        //ДопустимоеНаименованиеФайла = ДанныеФайла.Наименование;
        //ДопустимоеРасширениеФайла = ДанныеФайла.Расширение;        
        ИмяФайла   = СтрШаблон("%1.%2",ДопустимоеНаименованиеФайла,ДопустимоеРасширениеФайла);
        ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("--%1",Разделитель));
        ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Type: application/octet-stream; name=""%1""",ИмяФайла));
        ЗаписьДанных.ЗаписатьСтроку("Content-Transfer-Encoding: binary");
        ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-ID: <%1>",ИмяФайла));
        ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: attachment; name=""%1""; filename=""%1""",ИмяФайла));
        ЗаписьДанных.ЗаписатьСтроку("");
        
        ЗаписьДанных.Записать(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));        
        
    КонецЦикла; 
    
    
    ЗаписьДанных.Закрыть();
    
    
    HTTPЗапрос = Новый HTTPЗапрос("/market/remote_alternative.html", Заголовки);
    РазмерСообщения = ПотокТелоЗапроса.Размер();
    ДвоичныеДанныеТело = ПотокТелоЗапроса.ЗакрытьИПолучитьДвоичныеДанные();
    
    Заголовки.Вставить("Content-Length",XMLСтрока(РазмерСообщения));
    
    HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТело);    
    
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);   
    ПроксиСервер = Новый ИнтернетПрокси(Истина);     
    
    // https://demo.b2b-center.ru/market/remote_alternative.html
    HTTPСоединение = Новый HTTPСоединение("demo.b2b-center.ru",,,,ПроксиСервер,120,ЗащищенноеСоединение); 
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    //
    ОтветСервера =  HTTPОтвет.ПолучитьТелоКакСтроку();
    
    // Обработка результата
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ОтветСервера);
    
    Результат = Новый Структура;
    
    Пока ЧтениеXML.Прочитать() Цикл        
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяЭлемента = СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(ЧтениеXML.Имя);
            Если ВыходныеПараметры.Свойство(ИмяЭлемента) Тогда
                ТипОтвета = WSПрокси.ФабрикаXDTO.Тип(URIПространстваИмен,ВыходныеПараметры[ИмяЭлемента]);
                РезультатXDTO = WSПрокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,ТипОтвета);
                Если ТипЗнч(РезультатXDTO) = Тип("ОбъектXDTO") Тогда
                    //Результат = ОбъектXDTOВСтруктуру(РезультатXDTO);
                    Результат = РезультатXDTO;
                    Прервать;
                КонецЕсли;
            КонецЕсли; 
        КонецЕсли; 
    КонецЦикла; 
    
    ЧтениеXML.Закрыть();
        
    Возврат Результат;
    
КонецФункции

Функция СформироватьКонвертSOAP(WSПрокси,URIПространстваИмен,Метод,ВходныеПараметры)
    
    ПространствоИменSOAP = "http://schemas.xmlsoap.org/soap/envelope/";
    
    Пакет = WSПрокси.ФабрикаXDTO.Пакеты.Получить(URIПространстваИмен);
    СвойствоXDTOМетод = Пакет.КорневыеСвойства.Получить(Метод);
    
    // формируем конверт
    ЗаписьXML = Новый ЗаписьXML;
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8");
    ЗаписьXML.УстановитьСтроку(ПараметрыЗаписиXML);
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Envelope", ПространствоИменSOAP);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("soap", ПространствоИменSOAP);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("urn", URIПространстваИмен);
    ЗаписьXML.ЗаписатьНачалоЭлемента("Header", ПространствоИменSOAP);
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Body", ПространствоИменSOAP);
    ЗаписьXML.ЗаписатьНачалоЭлемента(СвойствоXDTOМетод.ЛокальноеИмя, URIПространстваИмен);
    Для каждого Элемент Из ВходныеПараметры Цикл
        Если ТипЗнч(Элемент.Значение) <> Тип("ОбъектXDTO") Тогда
            Значение = ЗначениеТипаВЗначениеXDTO(Элемент.Значение);
        Иначе
            Значение = Элемент.Значение;
        КонецЕсли;    
        WSПрокси.ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Значение, Элемент.Ключ, URIПространстваИмен);   
    КонецЦикла; 
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    Возврат ЗаписьXML.Закрыть();    
    
КонецФункции

 

SOAP with Attachments MTOM веб сервисы

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    16223    14    18    

14

Интеграция 1С и Битрикс 24 — модуль синхронизации для обмена задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    18387    10    15    

16

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13070    34    8    

13

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    85684    26    51    

50

Интеграция с сервисом vetmanager

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16712    43    49    

24
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vano-ekt 124 19.04.19 08:16 Сейчас в теме
2. пользователь 20.04.19 20:46
(0) Спасибо за полезный материал!
3. Kyrales 145 23.07.20 08:57 Сейчас в теме
Добрый день. Подскажите. У вас в статье приведен код. Но нет в нем информации по функции ЗначениеТипаВЗначениеXDTO(). Не могли бы вы код по этой функции скинуть?
4. mysm 85 23.07.20 23:34 Сейчас в теме
(3)
Функция ЗначениеТипаВЗначениеXDTO(знач ЗначениеТипа)
	Если ТипЗнч(ЗначениеТипа) = Тип("Строка") Тогда
		ТипXDTO = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string");
	ИначеЕсли ТипЗнч(ЗначениеТипа) = Тип("Булево") Тогда		  
		ТипXDTO = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "boolean");
	ИначеЕсли ТипЗнч(ЗначениеТипа) = Тип("Дата") Тогда 
		ТипXDTO = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "date");	
	ИначеЕсли ТипЗнч(ЗначениеТипа) = Тип("Число") Тогда 
		ТипXDTO = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "integer");	
	КонецЕсли; 	
	Возврат ФабрикаXDTO.Создать(ТипXDTO, ЗначениеТипа);	
КонецФункции
Показать
5. voronin_a_2000 27 25.11.20 12:19 Сейчас в теме
Добрый день.
Спасибо за полезный материал!
Нет ли у вас модуля загрузки заявок из B2B-Center?
6. mysm 85 25.11.20 16:53 Сейчас в теме
(5) Универсального решения нет. Там есть вариации, в зависимости от типов торгов, скажем. Пишется под клиента.
7. janna_k 29.06.23 22:27 Сейчас в теме
Спасибо, очень помогла ваша публикация!
Сэкономила кучу времени на реализацию похожей задачи.
8. mysm 85 30.06.23 09:00 Сейчас в теме
(7) Спасибо, что обратили внимание. Рад, что пригодилось.
9. pila86 129 27.10.23 12:33 Сейчас в теме
Можете пояснить, а почему mtom не работает. Ведь вроде заявлено, что это есть с версии 8.3.8?
https://downloads.v8.1c.ru/content//Platform/8_3_10_1877/1cv8upd.htm#5a3fed9c-6292-11e5-a3f7-0050569f678a
Прикрепленные файлы:
10. verunca 26.04.24 12:59 Сейчас в теме
(9) Нигде нет практического примера реализации mtom, кто нибудь раскрыл этот секрет?
12. mysm 85 16.05.24 20:55 Сейчас в теме
(11) multipart не секрет. А вот SOAP with multipart, увы не реализован. И примером ручного формирования пакетов на тот момент не нашел. Сейчас, мне кажется HTTP сервисы рулят. SOAP уже не так актуален.
13. tvm 22.05.24 07:05 Сейчас в теме
(12)
Насколько я понимаю, то предлагается только "ручной режим". С помощью кода из ссылок я смог с B2B получить файлы
SOAP уже не так актуален
да, но тот же B2B-Center всё живёт с ним
Оставьте свое сообщение