Имя: Пароль:
1C
 
ПолеHTML - как понять что страничка загрузилась?
0 serega33
 
03.03.09
16:35
Всем привет! Кинул я полехтмл на форму, перехожу по ссылке из программы, и надо мне понять - загрузилась страничка или нет...как это выяснить?
у ПолеХТМЛ событий для этого никаких нету. Что можно сделать?

Есть идея анализировать строку состояния на "Готово", но как это сделать?
1 73
 
03.03.09
16:45
Это не помогает?

ПолеHTMLДокумента (HTMLDocumentField)
ДокументСформирован (DocumentComplete)
Синтаксис:
ДокументСформирован()
Описание:
Возникает, когда HTML-документ построен и готов к использованию.
2 serega33
 
03.03.09
16:53
(1) проблема в том что это событие возникает параллельно ходу самой программы.
Т.е.
ЭлементыФормы.Обозреватель.Перейти(Ссылка);
//страничка пойдет на загрузку, но следующие операторы будут выполняться сразу,
//а не после ДокументСформирован
Оператор 1;
Оператор 2;

подскажите как анализировать строку состояний можно?
3 Immortal
 
03.03.09
17:00
нефиг к жопе через гланды лезть
подожди пока документ не сформируется
4 asady
 
03.03.09
17:18
юзай readyState
или Status
5 vde69
 
03.03.09
17:21
в конце скрипт с присвоение переменой определенного значения, как только он отработал - значит готово
6 73
 
03.03.09
17:28
Да завести переменную булеву,
перед формированием сбрасывать, в ДокументСформирован() устанавливать.
7 serega33
 
03.03.09
17:57
(4) а как это использовать в ПолеХТМЛ? это же для КОМ
(5) какой скрипт
(6) пробовую все равно хрень...Операторы то выполняются
8 73
 
03.03.09
17:58
(7) Ну так перед ними цикл с опросом ее родимой.
9 73
 
03.03.09
17:59
(8)+ но только так и повеситься недолго...
Что-то с постановкой задачи не совсем...
10 vde69
 
03.03.09
18:01
(7) скрипт на VB в конец загружаемой страницы, обращаться к переменным можно через свойство Document
11 serega33
 
03.03.09
18:02
(8) надо загружать в цикле несколько страничек...загрузив одну надо считать с нее данные в 1с, и перейти на другую. При переходе загрузка может не пойти поэтому надо проверять каждый раз загуржена ли страничка...
12 serega33
 
03.03.09
18:03
(10) странички то в инете, чужие сайты
13 73
 
03.03.09
18:03
Не проще ли те опрераторы обработки вызывать из ДокументСформирован?
14 vde69
 
03.03.09
18:04
(11) тогда ищи </body></html> правда они не всегда есть
15 Sarius
 
03.03.09
18:09
писал в 7.7 одну вещицу - кусок кода такой

objIE = СоздатьОбъект("InternetExplorer.Application");
 objIE.Visible = IE; // Если не показывать окно - может ругаться антивирь, но удобнее работать.
 objIE.Silent = 0;    
 Адрес = "http://bank.gov.ua/Fin_ryn/OF_KURS/Currency/FindByDate.aspx";
 objIE.Navigate(Адрес);                                              
 
 Пока objIE.readyState<4 Цикл // Ждем пока она загрузится
 КонецЦикла;    

Собственно, "readyState<4" и есть признак того, что еще не загрузилась.
Переведи на 8 и все.
16 serega33
 
03.03.09
18:09
у меня щас структур такая

ПеремГлоб;
Процедура А();

Ссылка = "уа.ru";
ЭлементыФормы.Обозреватель.Перейти(Ссылка);  
Перем = ПеремГлоб;

КонецПроцедуры;

ОбозревательДокументСформирован(Элемент);
    Процедура В();
КонецПроцедуры;

Процедура В();
    //считает какие-то данные, которые нужны в Процедуре А

   ПеремГлоб = 1;

КонецПроцедуры;
17 serega33
 
03.03.09
18:10
(16)+ не знаю как проверить что после первого перехода страничка загрузилась?
18 serega33
 
03.03.09
18:13
(15) это круто, видел, но у меня ПолеХТМЛ + каким оператором можно получить полный ХТМЛ код?
19 73
 
03.03.09
18:15
(18) Свойство Документ - это ComОбъект и имеет ото усе.
Но в принципе все можно организовать в 1С.
Тот же цикл по глобПерем я ж тебе предлагал.
20 Sarius
 
03.03.09
18:17
В общем вот ссылка всей обработки
http://infostart.ru/projects/3333/
За основу брал книжку Михайлова по системному программированию в 1С - там и по 7.7  и по 8 есть варианты кода.
В принципе, через СОМ работать с хтмл удобнее, имхо.

http://www.kodges.ru/12858-1s-predprijatie-7.78.0-sistemnoe-programmirovanie.html
21 serega33
 
03.03.09
18:27
(19) никак не догоню как с глобальными...помоги если можешь
22 73
 
03.03.09
18:35
(21) Что то типа:

 Флаг = Ложь;
 ЭлементыФормы.Обозреватель.Перейти(Ссылка);  
 Пока Истина Цикл
   Если Флаг Тогда Прервать;
 КонецЦикла;


В обработчике ДокументСформирован()
 Флаг = Истина;
23 73
 
03.03.09
18:35
(22) КонецЕсли забыл
24 73
 
03.03.09
18:38
(22)+ опять же можно и повеситься, так что надо бы какой-то резервный выход из
цикла предусмотреть
25 serega33
 
03.03.09
18:50
(24)все равно какя то фигня
Флаг = Ложь;
 Ссылка = Строка("http://yandex.ru");
 ЭлементыФормы.Обозреватель.Перейти(Ссылка);  
 Пока Истина Цикл
     Если Флаг Тогда
         Прервать;
     КонецЕсли
     
 КонецЦикла;
 Сообщить("123");
Процедура ОбозревательДокументСформирован(Элемент)
 Флаг = Истина;
Проверка();

КонецПроцедуры

Процедура Проверка();

Сообщить("Ура!");

КонецПроцедуры

на выходе =
Ура!
123
Ура!

а должно быть Ура, Ура, 123
26 73
 
03.03.09
18:55
Ну так все правильно. Ведь это только ты знаешь, что страница дважды должна
перейти. Ну тогда так и пиши:

Флаг = 0;
 Ссылка = Строка("http://yandex.ru");

 ЭлементыФормы.Обозреватель.Перейти(Ссылка);  
 Пока Истина Цикл
     Если Флаг=2 Тогда
         Прервать;
     КонецЕсли
     
 КонецЦикла;
 Сообщить("123");
Процедура ОбозревательДокументСформирован(Элемент)
 Флаг = Флаг+1;
Проверка();

КонецПроцедуры
27 73
 
03.03.09
18:58
(26)+ но вообще как-то коряво.
Может как то определить, добрались ли до нужного URL?
28 73
 
03.03.09
19:02
(27)+
По идее
ЭлементыФормы.Обозреватель.Документ.URL - должен вернуть
29 serega33
 
03.03.09
19:17
28)т.е. проверить после Перейти(Ссылка) будет ли Ссылка = ЭлементыФормы.Обозреватель.Документ.URL ?
30 serega33
 
03.03.09
19:18
(28)(29)урл наверно сразу присваивается а не после загрузнки...
31 73
 
03.03.09
19:20
(30) можно проверять в обработчике ДокументСформирован
Если ЭлементыФормы.Обозреватель.Документ.URL = НужнаяСсылка...
и если там где надо: Флаг=Истина.
Только проверь, что он там возвращает (ЭлементыФормы.Обозреватель.Документ.URL)
32 serega33
 
03.03.09
19:30
(31) смори а если коннект пропадет...ссылка то присвоится для ЭлементыФормы.Обозреватель.Документ.URL все равно...но страничка то будет с сообщение что инета нет

что за х...
33 73
 
03.03.09
19:33
(32) Если коннект пропадет, то по идее событие ДокументСформирован не возникнет.
Потому и проверять там надо.
Но нужно пробовать.

Дерзай, я через 5мин домой.
34 serega33
 
03.03.09
23:15
(33)...нь какая то...задача упрощаетя - надо вернуться из ДокументСформирован в начало цикла. Т.е. надо перезапустить выполнение операторов для текущего элемента в процедуре А
35 Новичок
 
03.03.09
23:24
Может поможет:
я делал так:
Функция        ДождатьсяЗагрузкиДокумента(IE,ВСостояние = "Загрузка страницы...",Таймаут = 20)
   
   // ИЕ.Busy                   Ложь
   // ИЕ.ReadyState           1-4
   // ИЕ.Document.readyState  loading/complete    
   
   ДатаПоТаймауту = ТекущаяДата() + 20;
   Пока НЕ IE.Document.readyState = "complete" Цикл
       Состояние(ВСостояние); ОбработкаПрерыванияПользователя();
       Если ДатаПоТаймауту <= ТекущаяДата() Тогда Прервать; КонецЕсли;
   КонецЦикла;
   
   ДокументЗагружен = (IE.Document.readyState = "complete");
   Возврат ДокументЗагружен;
   
КонецФункции

только ИЕ это был ComОбъект
т.е. IE.Document вроде тоже что и обозреватель.Документ в Вашем случае.
36 serega33
 
03.03.09
23:34
(35) спасибо щас попробую, т.е. ЭлементыФормы.Обозреватель.Документ.readyState тоже что и IE.Document.readyState
или надо ЭлементФормы.Обозреватель.readyState?
37 serega33
 
03.03.09
23:41
(36)а блин туплю...
38 Новичок
 
03.03.09
23:42
(36) ЭлементыФормы.Обозреватель.Документ.readyState
правда сам не пробовал. Проверил бы сейчас, но под рукой нет 1С-ки.
39 serega33
 
03.03.09
23:51
(37) правильно тестирую?:
Функция        ДождатьсяЗагрузкиДокумента()
   
   // ИЕ.Busy                    Ложь
   // ИЕ.ReadyState            1-4
   // ИЕ.Document.readyState  loading/complete    
   
   Таймаут = 20;
   ВСостояние = "Загрузка страницы...";
   ДатаПоТаймауту = ТекущаяДата() + 20;
   Пока НЕ ЭлементыФормы.Обозреватель.Документ.readyState = "complete" Цикл
       Состояние(ВСостояние); ОбработкаПрерыванияПользователя();
       Сообщить("ждем...");
       Если ДатаПоТаймауту <= ТекущаяДата() Тогда Прервать; КонецЕсли;
   КонецЦикла;
   
   ДокументЗагружен = (ЭлементыФормы.Обозреватель.Документ.readyState = "complete");
   Возврат ДокументЗагружен;
   
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Рез = Ложь;
   Ссылка = Строка("http://yandex.ru");
   ЭлементыФормы.Обозреватель.Перейти(Ссылка);
   Рез = ДождатьсяЗагрузкиДокумента();
   
   Если Рез = Истина Тогда
       Сообщить("123");
   КонецЕсли;
   
   
   
КонецПроцедуры

123 вылетает сразу...страничка не до конца загрузилось когда еще
40 serega33
 
03.03.09
23:56
блин видимо надо будет все на КОМ переводить...
41 serega33
 
04.03.09
00:07
(39) хотя в отладчике ЭлементыФормы.Обозреватель.Документ.readyState реально "complete", только почему то всегда...мне же надо понять что страничка ya.ru загрузилась а не html - Эта программа не может отобразить эту веб-страницу
42 vde69
 
04.03.09
00:28
readyState работает только для простого HTML для всяких flash и других наворотов - нет, та-же миста думаю не будет работать (так-как есть автоподгрузка).
43 serega33
 
04.03.09
00:35
(42)ну я просто хтмл и получаю...
44 Новичок
 
04.03.09
06:55
(39) Да, не получится. Ибо обработчик надо отпустить после ПолеХТМЛ.Перейти(), что б ПолеХТМЛ начало загрузку страницы.
45 Новичок
 
04.03.09
06:58
(44) +

Перем ИЕ;

Процедура       ПриОткрытии()
   ИЕ = Новый COMОбъект("InternetExplorer.Application");
       ИЕ.Visible = Ложь;
КонецПроцедуры

Функция        ДождатьсяЗагрузкиДокумента(IE,ВСостояние = "Загрузка страницы...",Таймаут = 20)
   
   ДатаПоТаймауту = ТекущаяДата() + 20;
   Пока НЕ IE.Document.readyState = "complete" Цикл
       Состояние(" " + (ДатаПоТаймауту - ТекущаяДата()) + " " + ВСостояние); ОбработкаПрерыванияПользователя();
       Если ДатаПоТаймауту <= ТекущаяДата() Тогда Прервать; КонецЕсли;
   КонецЦикла;

   Возврат (IE.Document.readyState = "complete");
   
КонецФункции

Функция        ПолеХТМЛПерейти(ПолеХТМЛ,URL)

   ИЕ.Navigate(URL);
   Загружен = ДождатьсяЗагрузкиДокумента(ИЕ);    
   Если Загружен Тогда ПолеХТМЛ.УстановитьТекст(ИЕ.Document.documentElement.outerHTML); КонецЕсли;
   
КонецФункции


Процедура       КнопкаВыполнитьНажатие(Кнопка)
    Сообщить(ТекущаяДата());
    ПолеХТМЛПерейти(ЭлементыФормы.ПолеHTML,"http://yandex.ru");
    Сообщить("" + ТекущаяДата() + " загружен");
КонецПроцедуры
46 Новичок
 
04.03.09
07:01
(44) +

Сообщает:
 04.03.2009 6:54:24
 04.03.2009 6:54:26 загружен


Еще есть особенность использования InternetExplorer.Application в Висте.
Т.к. там эксплорер с закладками, то при Navigate и определенных настройках (по умолчанию) он откроет новую вкладку, и при обращении к ИЕ.Document вылетет с ошибкой.
47 Новичок
 
04.03.09
07:13
(44) +

Еще вариант

Процедура    ПолеХТМЛПерейти(ПолеHTML,УРЛ)    
  Сообщить(ТекущаяДата());
  ГетЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
  ГетЗапрос.Option(9,80);
  ГетЗапрос.Open("GET",УРЛ,0);
  // ГетЗапрос.setRequestHeader("Content-Type","text/xml; charset=Windows-1251");
  ГетЗапрос.Send();
  ПолеHTML.УстановитьТекст(ГетЗапрос.Responsetext);
  ГетЗапрос = Неопределено;
  Сообщить("" + ТекущаяДата() + " загружен");
КонецПроцедуры

в этом варианте нет дождаться загрузки
48 Новиков
 
04.03.09
09:08
Вопрос с тестилки проф. по платформе 8.1.:

Для отслеживания момента полной загрузки HTML документа в элементе управления "Поле HTML документа" можно использовать:
1. Проверку свойства "URL" данного элемента управление на равенство заданному адресу ресурса
2. Проверку свойства "Значение" данного элемента управление на равенство "Null"
3. Проверку свойства "Значение" данного элемента управление на равенство "Неопределенно"
4. Флаг модифицированности формы
5. Обработчик события "Документ сформирован" данного элемента управления, в котором при этом производится проверка свойства URL на равенство заданному адресу ресурса

Правильный ответ: 5. Г-ну 73 пятерка :)
49 Новичок
 
04.03.09
09:23
(48) и сколько гемора что б написать пошаговый код:
1. Переход на нужный урл
2. Получение ХТМЛ кода
3. Обработка ХТМЛ кода.

после первого шага обработчик надо отпустить, значит остальные шаги будут висеть на ДокументСформирован - некрасиво будет.

поэтому и в (41) после Перейти() весит "complete" от старой страницы.
50 73
 
04.03.09
10:01
(48) Спасибо, не ожидал :)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан