Имя: Пароль:
1C
1С v8
Разная скорость работы с COM объектом
0 баржоми
 
22.10.13
22:08
Подскажите почему огромная разница в скорости получения данных
Вариант №1
В этом варианте открываю браузер IE
ПолучитьAppIE() ;
url = "бла бла бла";
ДокументСайт = ПолучитьHtmlDoc(appIE,url);
    
Для Каждого Стр из ДокументСайт.body.all Цикл
        Сообщить( Стр.className+ " = " + Стр.innerText);
КонецЦикла;


Функция ПолучитьAppIE()    
    Попытка
        // создаем новый процесс приложения IE
        appIE = Новый COMОбъект("InternetExplorer.Application");
        appIE.Visible = Истина; // не отображаем его (браузер) на экране        
    Исключение
        Сообщить("Ошибка создания приложения InternetExplorer.Application...");
    КонецПопытки;    
    Возврат appIE; // вернем указатель на процесс
КонецФункции

Функция ПолучитьHtmlDoc(appIE,url)    
    Попытка    
        // загружаем страницу из интернета    
        appIE.Navigate(url);
        i=0;
        // ждем пока загрузится страница по url
        Пока appIE.Busy цикл
            i = i + 1;
            сообщить(i);
        КонецЦикла;    
        htmlDoc=appIE.Document;

    Исключение
        Сообщить("Ошибка создания документа html");    
    КонецПопытки;

    Возврат htmlDoc;

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


Вариант №2
Размещаю на форме поле табличного документа

ЭлементыФормы.Сайт.Перейти("бла бла бла");
Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all
Цикл
Сообщить( Стр.className+ " = " + Стр.innerText);
КонецЦикла;

Собственно вопрос: почему вариант №2 работает примерно в 200-300 раз быстрее?
Есть необходимость использовать именно первый метод.
1 shurikvz
 
22.10.13
23:06
Пока appIE.Busy цикл
            i = i + 1;
            сообщить(i);
        КонецЦикла;

не надо так делать.


и не понял, а во втором варианте где ожидание окнчания загрузки страницы? В первом ждем, а во втором пофиг?

Или тогда пояснить: в чем именно вариант 2 работает в 200 раз быстрее.
2 Нуф-Нуф
 
23.10.13
09:35
(1) как я понимаю в первом варианте открывается ИЕ, в нем получается страница, и средствами ие перебирается страница.

во втором случае страница открывается в 1с в поле хтмл и перебирается средствами 1с.
3 баржоми
 
23.10.13
09:49
(1) В втором варианте дожидаюсь открытия страницы путем вот такой проверки (дожидаюсь в коде появления текста "Мы в Контакте" - это самый низ страницы):
Пока Найти(ЭлементыФормы.Сайт.ПолучитьТекст(),"Мы в Контакте") = 0  
        Цикл
        пауза(1);
        счетчикСекунд = СчетчикСекунд+1;
        Если СчетчикСекунд > 60
            тогда
            ОснСтрока.Комментарий= "Ошибка сервера";
            Возврат Ложь;
            Прервать;
        КонецЕсли;
    КонецЦикла;
4 баржоми
 
23.10.13
09:54
(2) Да. Все верно
Вариант №1 предполагает открытие интернет эксплорера в отдельном окне, где пробегаюсь по нему циклом
Для Каждого Стр из ДокументСайт.body.all Цикл

Вариант№2 предполагает открытие страницы на форме обработке, где таким же циклом пробегаюсь по странице
Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all

Вроде бы и там и там COM объект, а вот именно скорость перебора циклом существенно разная

Мне по ряду причин необходимо использовать именно вариант№1 (интернет эксплорер в отдельном окне), но так очень долго перебор в цикле работает
5 Нуф-Нуф
 
23.10.13
10:03
не с той стороны, но все же, почему нельзя использовать второй вариант? с обработкой?
6 баржоми
 
23.10.13
10:08
(5) Может быть и можно, но я не нашел способа как сделать одновременно обращение к нескольким сайтам (т.е. не по очереди, а именно параллельно).
А вот при использовании интернет эксплорера- то пожалуйста, наплодил сколько нужно окон и работай с ними
+ когда работаешь на форме (ПолеHTMLДокумента), то возникают проблемы с скриптами майлру, гугла (соц сети). Выходит надпись "Произошла ошибка скрипта" и кнопочки продолжить ДА НЕТ (настройки интернет эксплорера крутить не помогает)
7 arsik
 
гуру
23.10.13
10:16
(0) Тебе уже написали - убери  "сообщить(i);"
8 баржоми
 
23.10.13
10:17
(5) В продолжение
При работе именно с окном интернет эксплорера можно использовать свойство объекта Silent (Управляет возможностью выдачи обозревателем диалоговых окон о критических ошибках и сообщений безопасности (булево). )
9 баржоми
 
23.10.13
10:19
(7) Убрано. некорректно скопировал из кода. Но в там милисекунды на самом деле. Долго идет именно перебор Для Каждого Стр из ДокументСайт.body.all Цикл
10 arsik
 
гуру
23.10.13
10:29
ДокументСайт.body.all - а что это. Может его каким то образом в массив можно закинуть?
11 Нуф-Нуф
 
23.10.13
10:30
(10) имхо поле HTML
12 баржоми
 
23.10.13
10:33
(10) Это СОМ объект полученный вот так:
ПолучитьAppIE() ;
url = "http://www.........";;
ДокументСайт = ПолучитьHtmlDoc(appIE,url);

Где:
Функция ПолучитьAppIE()    
    Попытка
        // создаем новый процесс приложения IE
        appIE = Новый COMОбъект("InternetExplorer.Application");
        appIE.Visible = Истина; // не отображаем его (браузер) на экране        
    Исключение
        Сообщить("Ошибка создания приложения InternetExplorer.Application...");
    КонецПопытки;    
    Возврат appIE; // вернем указатель на процесс
КонецФункции

// Получаем объект DOMDocument с помощью приложения InternetExplorer.Application
Функция ПолучитьHtmlDoc(appIE,url)    
    Попытка    
        // загружаем страницу из интернета    
        appIE.Navigate(url);
        i=0;
        // ждем пока загрузится страница по url
        Пока appIE.Busy цикл
            i = i + 1;
            //сообщить(i);
        КонецЦикла;    
        // получаем html-страницу как DOM (объектная модель документа)
        htmlDoc=appIE.Document;
     //   body = appIE.Document.getElementsByTagName("body");

    Исключение
        Сообщить("Ошибка создания документа html");    
    КонецПопытки;

    Возврат htmlDoc;

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

А вот если бы его в массив запихнуть, то наверное все проблемы бы и исчезли.
Пробовал даже скопировать его (СОМ объект) на ПолеХТМЛДокумента на форме, не дает, говорит что поле объекта недоступно для записи
13 kiruha
 
23.10.13
10:33
(9)
А в каком случае перебор свойств внешнего com объекта идет быстро ?
Я таких не знаю.
Поэтому и юзают ComSafeArray и цельную выгрузку листа Exel например
14 баржоми
 
23.10.13
10:36
(11) А как быть с тем что у меня одновременно обращение к 15 страницам должно быть? Сделать просто 15 ПолеHTMLДокумента на форме и по очереди каждому сказать Перейти (Navigate) и не заморачиваться?
15 баржоми
 
23.10.13
10:38
(13) Быстро идет когда на форме создаю ПолеHTMLДокумента (HTMLDocumentField) и использую 1совский метод Перейти (Navigate)
тогда да. быстро идет перебор Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл

где Сайт - Поле ХТМЛ документа
16 kiruha
 
23.10.13
10:41
Ты разницу между объектом 1С и com объектом совсем не различаешь ?
17 kiruha
 
23.10.13
10:42
Есть еще объект ДокументHTML
18 баржоми
 
23.10.13
10:44
(17) Можно чуть поглубже мысль развернуть? И да есть пробелы в знаниях. Потому и спрашиваю
19 kiruha
 
23.10.13
10:47
1С медленно работает с перебором свойств не родных com объектов, а не только с html. Поэтому нужно использовать по возможности внутренние объекты 1С и операции массовой загрузки
20 Нуф-Нуф
 
23.10.13
10:51
ну если действительно чужой комобъект работает медленее, тогда действительно - 15 полей и работа с ними.
или 15 раз запускать обработку через фоновое задание.
21 баржоми
 
23.10.13
10:54
(19) Спасибо. Стало понятнее почему так.
Т.е. мне есть смысл почитать про ComSafeArray и использовать массовую загрузку с чужого СОМ объекта?
22 kiruha
 
23.10.13
11:02
(21)
Лучше про ДокументHTML
23 баржоми
 
23.10.13
11:25
(22) Но к сожалению это не решает проблемы "ошибка выполнения скрипта на странице". При использовании внутреннего объекта 1С нет метода Silent
24 Serginio1
 
23.10.13
14:27
(19) Внутренние сервера (DLL) работают тоже быстро. А вот с внешними (.exe) из-за маршалинга между процессами беда.
InternetExplorer.Application соответствует ielowutil.exe
25 kiruha
 
23.10.13
14:42
(24)
А как тут применить DLL ?
А в vbscript ?
26 kiruha
 
23.10.13
14:43
в смысле есть DLL для доступа к страницам HTML ?
27 Serginio1
 
23.10.13
15:08
(25) Например самому написать или воспользоваться нетовским враппером v8: Вопрос по NetObjectToIDispatch
28 shurikvz
 
23.10.13
15:51
да, не поленился посмотрел, действительно с ком объектом обход дольше.

Возник вопрос - а для чего document.body.all? Не проще ли получить только нужные HTMLЭлементы и с ними работать (getElementsByTagName, getElementByID)?

И потом - действительно ли нужно параллельно парсить 15 страниц? Да, возможно удастся сэкономить время на параллельной загрузке страниц (еще смотря как код написать), но обработка результата то все равно последовательно в одном потоке идти будет.
29 баржоми
 
23.10.13
16:04
(28) Страничка полностью в  даже браузере гугл хром подгружается примерно за 2-4 секунды (отвечает медленно сам сайт). Если последовательно делать, то только на загрузку страниц уйдет до 1 минуты
А вот за getElementsByTagName, getElementByID спасибо, упустил я это из виду. Сейчас попробую
30 shurikvz
 
23.10.13
16:20
(29) Я даже больше подскажу: все зависит от того что за сайт, и какие данные с него получить надо. Если там не используются всякие относительно новомодные ajaxы, и какая-нибудь еще браузероспецифичная хрень, не нужен программный серфинг по сайту, то вообще можно использовать класс 1С HTTPСоединение, послать гет запрос, и получить тело html страницы. Как дом-документ парсить естественно не получится, но если известно что ищешь, просто пользоваться поиском по строке, ну или подключить регулярные выражения.
31 kiruha
 
23.10.13
17:55
(27)
Круто.
Может  на инфостарт выложишь ?
32 Serginio1
 
23.10.13
18:22
(31) Может быть. Сейчас кстати прикручиваю к семерке для вэб сайтов. Но этим больше пользуется oleg_km
наверное у него уже больше наработок.