8.х Можно ли создать HTTP запрос в 1С 8.1 и обработать ответ?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Bonov, 9 апр 2009.

  1. TopicStarter Overlay
    Bonov
    Offline

    Bonov

    Регистрация:
    9 апр 2009
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    День добрый!

    Есть задача организовать импорт курсов валют с сайта oanda.com, используя услугу FXML

    Смысл в следующем: для получения курса USD/EUR можно использовать следующий HTTP запрос:

    http://www.oanda.com/cgi-bin/fxml/fxml?fxm...lt;/convert>

    Его можно ввести и в строке браузера, получив ответ в виде XML с курсами.

    Вопрос: Можно ли организовать отправку такого запроса с помощью 1С 8.1 и каким-то образом получить ответ в переменную или файл? Фактически нужно не отобразить данную страницу в окне, а выгрузить в переменную.

    Есть какие-нибудь идеи?
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Смотри, как в типовой получают курсы валют всё украдено до нас :)
  3. TopicStarter Overlay
    Bonov
    Offline

    Bonov

    Регистрация:
    9 апр 2009
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    Смотрел - там идет загрузка файлов, а не HTTP запрос/ответ. Пробовал через HTTPСоединение следующим образом:

    HTTP = Новое HTTPСоединение("www.oanda.com");
    HTTP.Получить("http://www.oanda.com/cgi-bin/fxml/fxml?fxmlrequest=<convert><client_id>oandatest</client_id><expr>USD</expr><exch>EUR</exch></convert>", "C:\111.txt");

    Не работает, не находит такой файл на сервере, что и логично, поскольку процедура предназначена для получения файлов с HTTP сервера.
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Создавай браузер, запихивай туда ссылку и читай значения.
    Т.е. через ActiveX элемент работай
  5. TopicStarter Overlay
    Bonov
    Offline

    Bonov

    Регистрация:
    9 апр 2009
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    Думаю, браузер даже не обязательно, можно попробовать и встроенный в 1С использовать, но это получается использование визуальных компонентов, а значит - на сервере работать не будет, а хотелось бы...
  6. GreenFox
    Offline

    GreenFox

    Регистрация:
    19 фев 2009
    Сообщения:
    14
    Симпатии:
    0
    Баллы:
    1
    Код:
    objHTTP = ПолучитьCOMОбъект("","Microsoft.XMLHTTP");
    ЗаписьЖурналаРегистрации("Завантаження файлу",УровеньЖурналаРегистрации.Информация, , ,"Сервер " + СокрЛП(Сервер));
    Попытка
    objHTTP.open("GET", СокрЛП(Сервер) ,0,СокрЛП(Логін),СокрЛП(Пароль));
    исключение
    ЗаписьЖурналаРегистрации("Помилка",УровеньЖурналаРегистрации.Ошибка, , ,ОписаниеОшибки());
    КонецПопытки;	
    objHTTP.send();
    Если objHTTP.readyState = 4 Тогда
    Строка = toBase64(objHTTP.responseBody);
    Двоичные = Base64Значение(Строка);
    если НЕ ПустаяСтрока(Куди) тогда
    Двоичные.Записать(СокрЛП(Куди));
    Ф1 = Новый Файл(СокрЛП(Куди));
    ЗаписьЖурналаРегистрации("Завантаження файлу закінчено",УровеньЖурналаРегистрации.Информация, , ,"Сервер " + СокрЛП(Сервер));
    //Состояние("Готово");
    Возврат Ф1;
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">			иначе	</span>
    Двоичные.Записать(СокрЛП(Константы.КаталогЗакачки.Получить()+"\"+"tmp"+Формат(ТекущаяДата(),"ДФ=yyyy_MM_dd_hh_mm_ss"+".tmp")));
    Ф1 = Новый Файл(СокрЛП(Константы.КаталогЗакачки.Получить()+"\"+"tmp"+Формат(ТекущаяДата(),"ДФ=yyyy_MM_dd_hh_mm_ss"+".tmp")));
    ЗаписьЖурналаРегистрации("Завантаження файлу закінчено",УровеньЖурналаРегистрации.Информация, , ,"Сервер " + СокрЛП(Сервер));
    //Состояние("Готово");
    Возврат Ф1;
    КонецЕсли;	
    иначе
    ЗаписьЖурналаРегистрации("Завантаження файлу невдале",УровеньЖурналаРегистрации.Ошибка, , ,"Сервер " + СокрЛП(Сервер));
    Ф1 = Неопределено;
    Возврат Ф1;
    КонецЕсли;
    
    
    
    
    функция toBase64(БезопасныйМассив) Экспорт
    
    КОМ = Новый COMОбъект("MSXML2.DomDocument.3.0");
    ТМП = КОМ.createElement("a");
    ТМП.DataType = "bin.base64";
    ТМП.nodeTypedValue = БезопасныйМассив;
    Возврат ТМП.text
    
    КонецФункции
    
  7. TopicStarter Overlay
    Bonov
    Offline

    Bonov

    Регистрация:
    9 апр 2009
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    Большое спасибо за идею!

    Преобразовал код под свои нужны и уже более-менее верный результат получил!
    По теме нашел очень хорошую страничку по описанию XMLHTTP:
    Использование XMLHttp

    Как будет готов код процедуры, выполняющий поставленную задачу, обязательно выложу.
  8. TopicStarter Overlay
    Bonov
    Offline

    Bonov

    Регистрация:
    9 апр 2009
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    И так, функция получения курса с Оанды готова. К сожалению, не получилось реализовать асинхронный запрос, поэтому если сервис будет недоступен, не повиснет ли 1С-ка наглухо, ожидая ответа, пока неизвестно :( Спасибо, GreenFox!
    Код:
    //Получение курса от сервиса Oanda FXML путем отправки и получения XML запроса
    Function GetExchangeRate(FromCurrency, ToCurrency, ExchDate) Export
    //Формирование текста запроса
    QueryLink = "http://www.oanda.com/cgi-bin/fxml/fxml?fxmlrequest=<convert><client_id>";
    QueryLink = QueryLink + Constants.OandaClientID.Get();
    QueryLink = QueryLink + "</client_id><exch>";
    QueryLink = QueryLink + FromCurrency.Description;
    QueryLink = QueryLink + "</exch><expr>";
    QueryLink = QueryLink + ToCurrency.Description;
    QueryLink = QueryLink + "</expr><date>";
    QueryLink = QueryLink + Format(ExchDate, "DF=MM/DD/YYYY");
    QueryLink = QueryLink + "</date></convert>";
    //Создание объекта XMLHttp
    Try
    XMLHttp = GetCOMObject("", "Microsoft.XMLHTTP");
    Except
    DoMessageBox(ErrorDescription(),,"Get Exchange Rate from Oanda");
    Return "Error";
    EndTry;
    //Инициируем асинхронный запрос, который вернет управление программе только после получения ответа
    Try
    XMLHttp.Open("GET", QueryLink, False);
    Except
    DoMessageBox(ErrorDescription(),,"Get Exchange Rate from Oanda");
    Return "Error";
    EndTry;
    //Отправка запроса
    XMLHttp.Send();
    //Проверка ответа и его обработка
    If XMLHttp.Status = 200 Then			//Если ОК
    //Разбор XML ответа
    StreamXML = New XMLReader;
    StreamXML.SetString(XMLHttp.ResponseText);		//Чтение XML из строки
    StreamXML.Read();
    If StreamXML.NodeType <> XMLNodeType.StartElement or StreamXML.Name <> "RESPONSE" Then
    DoMessageBox("Error while XML Parsing",,"Get Exchange Rate from Oanda");
    Return "Error";
    EndIf;
    //Чтение XML строки
    While StreamXML.Read() Do
    //Не подошли ли к закрытию узла 'response'?
    If StreamXML.NodeType = XMLNodeType.EndElement And StreamXML.Name = "RESPONSE" Then
    DoMessageBox("Error while XML Parsing",,"Get Exchange Rate from Oanda");
    Return "Error";
    EndIf;
    //Чтение XML строки и поиск ключа 'ASK'
    If StreamXML.NodeType = XMLNodeType.StartElement And StreamXML.Name = "ASK" Then
    StreamXML.Read();
    Rate = Number(StreamXML.Value);
    StreamXML.Close();
    Return Rate;
    Else
    Continue;
    EndIf;
    EndDo;
    StreamXML.Close();
    EndIf;
    DoMessageBox("Error: " + XMLHttp.StatusText,,"Get Exchange Rate from Oanda");
    Return "Error";
    EndFunction
    

Поделиться этой страницей