Имя: Пароль:
1C
1С v8
Асинхронные WinHttp.WinHttpRequest.5.1 и MSXML2.XMLHTTP
0 qwerty
 
24.01.16
12:29
Платформа 8.3.7, УФ

Хочу асинхронно получить данные с сайта. При использовании WinHttp.WinHttpRequest.5.1:

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "utf-8");

ДобавитьОбработчик WinHttp.OnError, http_OnError;
ДобавитьОбработчик WinHttp.OnResponseDataAvailable, http_OnResponseDataAvailable;
ДобавитьОбработчик WinHttp.OnResponseFinished, http_OnResponseFinished;
ДобавитьОбработчик WinHttp.OnResponseStart, http_OnResponseStart;

WinHttp.Open("GET", "https://btc-e.com/api/3/ticker/btc_usd";, Истина);
WinHttp.Send();

1с вылетает при наступлении события.

При использовании MSXML2.XMLHTTP

XmlHttp = Новый COMОбъект("MSXML2.XMLHTTP");
ДобавитьОбработчик XmlHttp.OnReadyStateChange, http_OnReadyStateChange;

пишет Событие объекта не обнаружено (OnReadyStateChange)

ЧЯДНТ?
1 spock
 
24.01.16
12:55
(0)биржа открывается браузером? Может провайдер блокирует трафик?
2 spock
 
24.01.16
12:57
3 qwerty
 
24.01.16
16:04
Сайт открывается. Синхронно все работает, не работает именно асинхронно
4 qwerty
 
24.01.16
16:49
Я так понимаю, больше нет способов получить данные с сайта асинхронно?
5 Serginio1
 
24.01.16
17:07
6 Serginio1
 
24.01.16
17:08
7 Lexey_
 
24.01.16
17:31
(4) фоновое задание
8 Lexey_
 
24.01.16
17:39
+(7) + HTTPЗапрос и HTTPСоединение
9 qwerty
 
24.01.16
18:21
(7) Было через фоновное сделано. В файловом варианте фоновые как нужно не работают.
10 Serginio1
 
24.01.16
19:57
11 Serginio1
 
24.01.16
20:39
(0) Если нужно помочь то обращайся
12 qwerty
 
24.01.16
21:24
(11) Не планировал .net применять. Хочу разобраться с указанными объектами.
13 Serginio1
 
24.01.16
21:48
Ну если не получится обращайся. .Net ничем не хуже MSXML2.XMLHTTP даже возможностей больше
14 Serginio1
 
24.01.16
21:55
(12) А можешь объяснить почему не планируешь?
15 qwerty
 
25.01.16
10:18
Апну разок, может будут у кого идеи. Если нет, то буду пробовать способ от Serginio1
16 Serginio1
 
25.01.16
10:21
(15) Набросал на скору руку правда для обычного приложения

http://files.rsdn.ru/19608/%d0%a2%d0%b5%d1%81%d1%82WebClient.zip

Ну и NetObjectToIDispatch для него
http://files.rsdn.ru/19608/%d0%a4%d0%b0%d0%b9%d0%bb%d1%8bNetObjectToIDispatch.zip
17 qwerty
 
25.01.16
11:14
Не заработало

{Форма.ФормаОтчета.Форма(4)}: Метод объекта не обнаружен (СоздатьОберткуДляСобытий)
ОберткаСобытий=врап.СоздатьОберткуДляСобытий(объект);

dll зарегестрирована
18 Serginio1
 
25.01.16
11:23
А какую DLL регистрировал?
Попробуй \Тест\ФайлыNetObjectToIDispatch\NetObjetToIDispatch45\NetObjetToIDispatch45\bin\Debug\

Может я оставил старую в
Тест\ФайлыNetObjectToIDispatch\DLLNetObjetToIDispatch45\

Сейчас выложу последнюю без SignalR
19 Serginio1
 
25.01.16
11:27
20 Serginio1
 
25.01.16
11:29
Да и запусти из толстого клиента
21 qwerty
 
25.01.16
11:32
С этой заработало. Запускаю пока из толстого клиента.
Но, есть небольшая проблема. Делаю изменения в обработке, сохраняю, переоткрываю обработку в предприятии - изменений не видно. Изменения появляются только когда перезапускаешь предпрятие. Наверное, созданные объекты подвисают...
22 Serginio1
 
25.01.16
11:58
Попробуй

Процедура ПриЗакрытии()
    // Вставить содержимое обработчика.
    Врап.ОчиститьСобытияОбъекта(Клиент);
    Врап.ОчиститьСобытияОбъекта(ОберткаСобытий);
    ОберткаСобытий=Неопределено;
    Клиент.Dispose();
    Клиент=Неопределено;
    GC=Врап.ПолучитьТип("System.GC");
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Врап= Неопределено;

КонецПроцедуры
23 Serginio1
 
25.01.16
12:01
Да там еще в
   Процедура DownloadProgressChanged(Данные)
               Сообщить("DownloadProgressChanged "+Врап.ВСтроку(Данные));
                e=Данные.e;

// Почему то последний парамер это Objec[]
// Просто добавь доплнительный параметр

               Сообщить(String.Format("загружено {0} из {1} байт. {2}  % complete...",
        e.BytesReceived,
        e.TotalBytesToReceive,
        e.ProgressPercentage,
        0));
        
// Или можно вызвать метод
         Сообщить(Врап.ВыполнитьМетод(String,"Format","загружено {0} из {1} байт. {2}  % complete...",
        e.BytesReceived,
        e.TotalBytesToReceive,
        e.ProgressPercentage));
            КонецПроцедуры
24 Serginio1
 
25.01.16
12:32
Только зачем тебе асинхронно? Там данные быстро получаются.
Просто при первом вызове происходит компиляция. Последующие вызовы мгновенны
25 qwerty
 
25.01.16
13:06
(24) Сайт отдает данные где-то через 1 сек. На это время форма "подвисает" и работать не комфортно.
26 Serginio1
 
25.01.16
13:26
(25) То есть у тебя в фоне через таймер данные подгружаются?
27 Serginio1
 
25.01.16
14:48
Там несложно переделать и на УФ, просто у меня генерируются методы для толстого клиента. Можешь сам посмотреть в обработке ТестСобытийИзмененийВДиректории.epf там генерируются модули. В том числе можно использовать ОбработкаВнешнегоСобытия

Для WebClient вводишь В поле Полное имя файла System.Net.WebClient и жмакаешь на "Получить описание модулей"
28 Serginio1
 
25.01.16
16:28
Да еще после создания установи
Клиент.Encoding = Врап.ПолучитьТип("System.Text.Encoding").UTF8;

Иначе будешь работать с кодировкой по умолчанию 1251
29 Serginio1
 
28.01.16
11:57
Добавил класс для выполнения асинхронно асинхронных методов
Использование классов .Net в 1С для новичков
Независимо от того, куда вы едете — это в гору и против ветра!