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

Загрузка файла в 1с

Автор IrinaDIP, 11 июн 2024, 07:25

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

IrinaDIP

Уважаемые коллеги, возник такой вопрос. Необходимо загрузить файл через 1с предприятие. Появляется ошибка: Ошибка работы с Интернет:  Ошибка инициализации SSL-соединения
{Коннект ОбщийМодуль.Коннект_Сервер.Модуль(188)}:HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Код:
Функция ЗагрузитьФайл() Экспорт
 
    Действие = "ServiceRequestAttachFile";
    URIПространстваИмен = "http://buhphone.com/PartnerWebAPI2";   
   
    ВыходныеПараметры = Новый Структура;
    ВыходныеПараметры.Вставить("ServiceRequestAttachFileResponse", "ServiceRequestAttachFileResponse");
 
    Разделитель = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
 
    ПараметрыПодключения = ПараметрыПодключения();
    URIПространстваИмен = ПараметрыПодключения.URIПространстваИмен;
    ИмяПользователя     = ПараметрыПодключения.ИмяПользователя;
    Пароль                 = ПараметрыПодключения.Пароль;
   
    WSПрокси = WSСсылки.Коннект_WS.СоздатьWSПрокси(ПараметрыПодключения.URIПространстваИмен, "PartnerWebAPI2", "PartnerWebAPI2Soap12",,,
        Новый ЗащищенноеСоединениеOpenSSL(,Новый СертификатыУдостоверяющихЦентровОС));   
       
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(,Новый СертификатыУдостоверяющихЦентровОС);
    HTTPСоединение = Новый HTTPСоединение("cus.1c-connect.com",,ИмяПользователя, Пароль,,,ЗащищенноеСоединение);       
   
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type",  "multipart/related;charset=UTF-8");
    Заголовки.Вставить("Content-Type",  СтрШаблон("multipart/related; type=""application/soap+xml""; start=""%1""; boundary=""=_Part_=%1""", Разделитель));
    Заголовки.Вставить("SOAPAction",    СтрШаблон("%1#%2", URIПространстваИмен, Действие));
       
    ТелоЗапроса = ТекстВКонвертеSOAP(Действие, ПараметрыЗапроса);
   
    ПотокВПамяти = Новый ПотокВПамяти();
    ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);
   
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("--=_Part_=%1", Разделитель));
    ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/soap+xml; charset=UTF-8");
    ЗаписьДанных.ЗаписатьСтроку("Content-Transfer-Encoding: 8bit");
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-ID: %1", Разделитель));
    ЗаписьДанных.ЗаписатьСтроку("");
   
    ЗаписьДанных.ЗаписатьСтроку(ТелоЗапроса);
   
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("--=_Part_=%1", Разделитель));
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Type: application/octet-stream; name=""%1""", ПараметрыЗапроса.Name));
    ЗаписьДанных.ЗаписатьСтроку("Content-Transfer-Encoding: binary");
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-ID: <%1>", ПараметрыЗапроса.Name));
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: attachment; name=""%1""; filename=""%1""", ПараметрыЗапроса.Name));
    ЗаписьДанных.ЗаписатьСтроку("");
   
    ЗаписьДанных.ЗаписатьСтроку(Base64Строка(ПараметрыЗапроса.Data));
   
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("--=_Part_=%1--", Разделитель));
   
    ЗаписьДанных.Закрыть();
                       
    HTTPЗапрос = Новый HTTPЗапрос("/cus/ws/PartnerWebAPI2", Заголовки);
    РазмерСообщения = ПотокВПамяти.Размер();
    ДвоичныеДанные = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
 
    Заголовки.Вставить("Content-Length", XMLСтрока(РазмерСообщения));
   
    HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);   
   
    ПроксиСервер = Новый ИнтернетПрокси(Истина);     
   
    Сервер = "cus.buhphone.com";
    ДанныеПоАдресу = СтрРазделить(WSПрокси.ТочкаПодключения.Местоположение,"/");
    Для к = 0 по ДанныеПоАдресу.Количество()-1 цикл
        Если СтрНайти(ДанныеПоАдресу[к], "1c-connect.com") > 0 тогда
            Сервер = ДанныеПоАдресу[к];
            Прервать
        КонецЕсли;
    КонецЦикла;   
   
    HTTPСоединение = Новый HTTPСоединение(Сервер,,WSПрокси.Пользователь,WSПрокси.Пароль,ПроксиСервер,120,ЗащищенноеСоединение);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
   
    Результат = Новый Структура("ResultCode,ResultData");
    если HTTPОтвет.КодСостояния = 200 тогда
        ОтветСервера =  HTTPОтвет.ПолучитьТелоКакСтроку();
       
        // Обработка результата
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(ОтветСервера);
       
        Пока ЧтениеXML.Прочитать() Цикл       
            Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                ИмяЭлемента = СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(ЧтениеXML.Имя);
                Если ВыходныеПараметры.Свойство(ИмяЭлемента) Тогда
                    ТипОтвета = WSПрокси.ФабрикаXDTO.Тип(URIПространстваИмен, ВыходныеПараметры[ПараметрыЗапроса.Name]);
                    РезультатXDTO = WSПрокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипОтвета);
                    Если ТипЗнч(РезультатXDTO) = Тип("ОбъектXDTO") Тогда
                        Результат = СериализаторXDTO.ПрочитатьXDTO(РезультатXDTO.return);
                        Прервать;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
       
        ЧтениеXML.Закрыть();   
    КонецЕсли;
 
    Возврат Результат;
   
КонецФункции
 
Функция ВыполнитьЗапрос() Экспорт
 
    ПараметрыПодключения = ПараметрыПодключения();
    ИмяПользователя = ПараметрыПодключения.ИмяПользователя;
    Пароль             = ПараметрыПодключения.Пароль;
 
    WSПрокси = WSСсылки.Коннект_WS.СоздатьWSПрокси(ПараметрыПодключения.URIПространстваИмен, "PartnerWebAPI2", "PartnerWebAPI2Soap12",,,
        Новый ЗащищенноеСоединениеOpenSSL(,Новый СертификатыУдостоверяющихЦентровОС));   
   
    WSПрокси.Пользователь     = ИмяПользователя;
    WSПрокси.Пароль         = Пароль;
   
    Если ПараметрыЗапроса = Неопределено Тогда
        ПараметрыЗапроса = Новый Структура;
    КонецЕсли;
   
    ПараметрыЗапросаXDTO = СериализаторXDTO.ЗаписатьXDTO(ПараметрыЗапроса);
       
    Если Метод = "ServiceRequestAttachFile" Тогда
        РезультатXDTO = WSПрокси.ServiceRequestAttachFile(ПараметрыЗапроса.ServiceRequestID, ПараметрыЗапроса.AuthorID, ПараметрыЗапроса.Name, ПараметрыЗапроса.Hash, Base64Строка(ПараметрыЗапроса.Data));
    Иначе
        ВызватьИсключение СтрШаблон("Вызываемый метод (%1) не реализован", Метод);
    КонецЕсли;
 
КонецФункции
 
#КонецОбласти

Функция ПараметрыПодключения()
   
    ПараметрыПодключения = Новый Структура;
    ПараметрыПодключения.Вставить("МестоположениеWSDL",     "https://cus.buhphone.com/cus/ws/PartnerWebAPI2?wsdl");
    ПараметрыПодключения.Вставить("URIПространстваИмен",     "http://buhphone.com/PartnerWebAPI2");
    ПараметрыПодключения.Вставить("ИмяПользователя",         "");
    ПараметрыПодключения.Вставить("Пароль",                 "");
   
    Возврат ПараметрыПодключения;
 
КонецФункции
 
Функция ТекстВКонвертеSOAP(Действие, ВходныеПараметры)
   
    ПространствоИменSOAP = "http://www.w3.org/2003/05/soap-envelope";
   
    ПараметрыПодключения = ПараметрыПодключения();
    WSПрокси = WSСсылки.Коннект_WS.СоздатьWSПрокси(ПараметрыПодключения.URIПространстваИмен, "PartnerWebAPI2", "PartnerWebAPI2Soap12",,,
        Новый ЗащищенноеСоединениеOpenSSL(,Новый СертификатыУдостоверяющихЦентровОС));   
 
    Пакет = 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.ЗаписатьСоответствиеПространстваИмен("par", ПараметрыПодключения.URIПространстваИмен);
    ЗаписьXML.ЗаписатьНачалоЭлемента("Header", ПространствоИменSOAP);
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Body", ПространствоИменSOAP);
    ЗаписьXML.ЗаписатьНачалоЭлемента(СвойствоXDTOМетод.ЛокальноеИмя, ПараметрыПодключения.URIПространстваИмен);
    Для каждого Элемент Из ВходныеПараметры Цикл
        Если ТипЗнч(Элемент.Значение) <> Тип("ОбъектXDTO") Тогда
            Значение = ЗначениеТипаВЗначениеXDTO(Элемент.Значение);
        Иначе
            Значение = Элемент.Значение;
        КонецЕсли;   
        WSПрокси.ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Значение, Элемент.Ключ, ПараметрыПодключения.URIПространстваИмен);   
    КонецЦикла;
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();
   
    Возврат ЗаписьXML.Закрыть();   
 
КонецФункции
 
Функция ЗначениеТипаВЗначение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.Тип("http://www.w3.org/2001/XMLSchema", "base64Binary");   
    КонецЕсли;     
    Возврат ФабрикаXDTO.Создать(ТипXDTO, ЗначениеТипа);   
КонецФункции

alexandr_ll


IrinaDIP

alexandr_ll, подскажите пожалуйста, что указывать здесь HTTPS, ведь выдаёт ошибку: Переменная не определена (https)
    Если <<?>>https Тогда (Проверка: Сервер)

Если HTTPS Тогда
        #Если Клиент  Тогда
            SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать),Новый СертификатыУдостоверяющихЦентровWindows());
        #Иначе
            SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено);
        #КонецЕсли 
        HTTPСоединение = Новый HTTPСоединение(СокрЛП(текURLСервера),,,,,5,SSL);
    Иначе
        HTTPСоединение = Новый HTTPСоединение(СокрЛП(текURLСервера));
    КонецЕсли;

IrinaDIP

alexandr_ll, ещё такой вопрос, что делать при ошибке: Ошибка разбора XML:  - [6,8]
Фатальная ошибка: 
Opening and ending tag mismatch: hr line 5 and body

{Коннект ОбщийМодуль.Коннект_Сервер.Модуль(198)}:Пока ЧтениеXML.Прочитать() Цикл

Теги:

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

Рейтинг@Mail.ru

Поиск