Имя: Пароль:
1C
1С v8
Как прочесть HTML страницу из 1С
, ,
0 Капитан Зубровка
 
19.08.15
16:15
Прошу отнестись с понимаем, раньше писал неплохо, но 3 года вне игры. последнее что видел 8.2.
А в 8.3 я даже полеHTMLдокумента не пойму куда вставить.
Искал по разным форумам, но для 8.3 примеров что-то совсем мало.

В двух словах задача, на HTML странице выкладывают регулярно обновляемые несколько строк текста.
Мне бы их считать и Записать в таблицу значений, я даже считать не могу html.
Вопрос как подключится по вебадресу и считать.

Спасибо!
1 Asmody
 
19.08.15
16:18
(0) HTTPСоединение
2 Капитан Зубровка
 
19.08.15
16:44
Спасибо!
Отпишусь как что-то получится.
А как теперь поле формы называется куда это можно визуально вывести?
3 Serginio1
 
19.08.15
16:54
4 Капитан Зубровка
 
19.08.15
17:24
Как на форму вставить поле в которое можно ввести html страницу?
В 8.2 это было полеHTMLдокумента...кажется.
Что-то я совсем туплю.
5 Kain_wrath
 
19.08.15
17:26
6 Serginio1
 
19.08.15
17:33
7 Капитан Зубровка
 
19.08.15
17:44
Кладем на страницу "СамСайт" ПолеHTMLДокумента и обзываем его к примеру "Сайт".

Вот как это в 8.3 реализуется?
Ужас, стыдно, но честно не понимаю.
8 Serginio1
 
19.08.15
17:52
Делаешь реквизит Поле, добавляешь реквизит строка
Добавляешь для поля путь к данным этот реквизит
выбираешь вид

Поле HTML документа
9 Капитан Зубровка
 
20.08.15
08:29
Вот такое написал.

Процедура ПриОткрытии()
    ЭтаФорма.элементы.Сайт.Перейти("http://yandex.ru";);
    Запарсить();
    КонецПроцедуры

Процедура Запарсить()
    Для Каждого Стр из ЭтаФорма.элементы.Сайт.Документ.body.all Цикл  
        Сообщить(Стр.tagName);
    КонецЦикла;    
КонецПроцедуры

Но в поле Сайт ничего не появляется...Что может быть не так?
10 asady
 
20.08.15
08:33
(9) сунь запарсить в обработчик события документсформирован
11 Капитан Зубровка
 
20.08.15
08:40
Он тут пишет после

ЭтаФорма.элементы.Сайт.Перейти("http://yandex.ru";;);

7. Проверяем работу нашей обработки. У меня появился сайт связного. А у Вас?

А у меня вот ничего не появляется..

Код теперь вот так вот выглядит. СайтДокументаСформирован() не запускается.

Процедура ПриОткрытии()
    ЭтаФорма.элементы.Сайт.Перейти("http://yandex.ru";);    
КонецПроцедуры

Процедура Запарсить()
    Для Каждого Стр из ЭтаФорма.элементы.Сайт.Документ.body.all Цикл  
        Сообщить(Стр.tagName);
    КонецЦикла;    
КонецПроцедуры

Процедура СайтДокументСформирован(Элемент)
    // Вставить содержимое обработчика.
    Запарсить();
КонецПроцедуры
12 Котокот
 
20.08.15
08:44
(0) Обновляемые строки текста в каком-то контейнере находятся (div, например)? ID у контейнера есть? Пример нужен, одним словом.
13 asady
 
20.08.15
09:01
&НаКлиенте
Процедура ПриОткрытии()
    ЭтаФорма.элементы.Сайт.Вперед();    
КонецПроцедуры

&НаКлиенте
Процедура Запарсить()
    Для Каждого Стр из ЭтаФорма.элементы.Сайт.Документ.body.all Цикл  
        Сообщить(Стр.tagName);
    КонецЦикла;    
КонецПроцедуры

&НаКлиенте
Процедура СайтДокументСформирован(Элемент)
    Запарсить();
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Сайт = "http://yandex.ru";
КонецПроцедуры

Сайт - реквизит формы - тип строка
ЭлементФормы - Сайт - путь к данным реквизит "Сайт"
Вид элемента формы - поле html документа
14 Капитан Зубровка
 
20.08.15
09:02
Такое вот написал

&НаКлиенте
Процедура СайтПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    // Вставить содержимое обработчика.
    ЭтаФорма.элементы.Сайт.Перейти("http://yandex.ru";);
    
КонецПроцедуры

вываливается с ошибкой

{Форма.Форма.Форма(24)}: Метод объекта не обнаружен (Перейти)
    ЭтаФорма.элементы.Сайт.Перейти("http://yandex.ru";);

Я совсем тупой видимо.

Вот этот синтаксис же не совсем точен? В модуле формы нельзя с таким синтаксисом обратится к "ЭлементыФормы"?

ЭлементыФормы.Сайт.Перейти("http://www.svyaznoy.ru/catalog/phone/224";);
15 asady
 
20.08.15
09:06
(14) ты реально из Манилы?

в (13) работающий код
16 Капитан Зубровка
 
20.08.15
09:13
Я горе фринлансер, когда-то перешел с 1С на свои проекты по вебмастерингу.

Это нечто. Я первый в жизни себя таким ослом ощущаю.
Сделал все до запятой как в (13).
Обход элементов не начинается.

1С в локале стоит, файловая БД.
Ну что еще может быть не так. Реквизиты те же.

Отладчик выдает вот тут выдает нули

    Для Каждого Стр из ЭтаФорма.элементы.Сайт.Документ.body.all Цикл  

        Сообщить(Стр.tagName);

    КонецЦикла;  


и нет обхода, визуально сайта тоже нет
17 Капитан Зубровка
 
20.08.15
09:13
И да, живу в Маниле
18 asady
 
20.08.15
09:16
(17) скорее всего у тебя обработчики не ассоциированы с процедурами обработки - в свойствах формы глянь - события
и прощелкай мышью  чтобы связать код с обработчиками
19 Капитан Зубровка
 
20.08.15
09:21
Ассоциированы.
ПриОткрытииии срабатывает по отладчкиу да и остальное тоже.

Все таки, как выглядит оператор перехода на сайт.

    ЭтаФорма.элементы.Сайт.Перейти("http://yandex.ru";);

дает ошибку

{Форма.Форма.Форма(4)}: Метод объекта не обнаружен (Перейти)
    ЭтаФорма.элементы.Сайт.Перейти("http://yandex.ru";);

сам сайт в окне ПолеHTMLДокумента не открывается по прежнему
20 asady
 
20.08.15
09:27
(19) ты код в (13) видел?
21 asady
 
20.08.15
09:28
(19) в (13) нет кода:
ЭтаФорма.элементы.Сайт.Перейти("http://yandex.ru";);
22 Капитан Зубровка
 
20.08.15
09:31
я скопировал 13-е дословно.
прошел отладчиком все процедуры.
сайт не открывается обход не начинается.

на обходе сразу уходит в конец цикла, визуально сайта тоже нет.
23 asady
 
20.08.15
09:35
(22) метод вперед() срабатывает?
какие ошибки выдаются сейчас?
24 Капитан Зубровка
 
20.08.15
09:38
Ошибок нет, но обхода боди.алл тоже нет, там пусто.

ЭтаФорма.элементы.Сайт.Вперед()    {(1)}: Обращение к процедуре объекта как к функции (Вперед)    

но ошибка не выскакивает.
это вот что отладчик пишет.
25 asady
 
20.08.15
09:41
(24) у элемента формы "Сайт" в свойствах что написано?

путь к данным?
Вид элемента?
26 Капитан Зубровка
 
20.08.15
09:41
И я извиняюсь, но Вперед() судя по описанию это обход, а где мы перешли на то, что надо обойти?
С
трочка

Сайт = "----" явно не указала на это.
27 Капитан Зубровка
 
20.08.15
09:42
Вид

Поле HTML документа

Путь к данным

Реквизит1

Реквизит1 Строка неогр длины
28 asady
 
20.08.15
09:43
(27) переименуй реквизит1 в "Сайт"
29 Капитан Зубровка
 
20.08.15
09:49
Переименовал, ничего не изменилось.

Я правильно понимаю, что Сайт, это реквизит формы, а не самой внешней обработки?
30 asady
 
20.08.15
09:50
(29) именно - реквизит формы сайт - тип строка - это написано  в (13)
31 Капитан Зубровка
 
20.08.15
09:50
перепроверяю просто.
тогда все правильно.
32 Капитан Зубровка
 
20.08.15
09:51
с ума сейчас сойду. спасибо за терпение)
33 Капитан Зубровка
 
20.08.15
09:56
34 asady
 
20.08.15
09:58
(33) покажи закладку свойства формы события
35 Капитан Зубровка
 
20.08.15
10:16
36 asady
 
20.08.15
10:22
(35) при создании на сервере нет - а должно.
37 Капитан Зубровка
 
20.08.15
10:24
Ты гений!!!!!!!!! Спасибо!!!

теперь вот это.

{Форма.Форма.Форма(15)}: Поле объекта не обнаружено (all)
    Для Каждого Стр из ЭтаФорма.элементы.Сайт.Документ.body.all Цикл  

ну это я сейчас сам тоже покопаюсь :)
38 Serginio1
 
20.08.15
10:32
(37) Скачай для примера конфигурацию "Управляемое приложение" там есть обработка "Путеводитель"
39 Капитан Зубровка
 
20.08.15
11:39
http://time-2-win.com/index.php/api/livegames/?key=98j3-94j8-948g

вообще ничего открыть не могу.
пусто.
чувствую не по зубьям задачка, но надо бы как то сделать.
40 Капитан Зубровка
 
20.08.15
11:42
ЭтаФорма.элементы.Сайт.Документ.body.all    COMОбъект    COMОбъект
ie8_length    0    Число
length    0    Число

Если смотреть просто что есть в Body, то там увидеть можно

clientHeight    228    Число
clientWidth    1 235    Число

какой-то метод нужен...
41 Котокот
 
20.08.15
11:42
(39) У тебя тут JSON. В 8.3.6 он уже реализован на уровне платформы, читай его стандартными методами.
42 Котокот
 
20.08.15
11:43
(40) Ты можешь показать страницу, с которой тебе надо выдернуть данные, и сказать, какие именно данные нужно выдернуть?
43 Котокот
 
20.08.15
11:48
+(41) Конкретно - это массив из двух элементов, каждый элемент - структура.
44 Капитан Зубровка
 
20.08.15
11:51
(40) выше была ссылка.
(39) разработчик утверждал что тут должен быть ХМЛ вообще-то ). он с 8.3.6? Я что такое Json только слышал )

эта страница результат сводного очень объемного парсинга с 10ка сайтов, на которых вживую идет спортивная статистика.

стоит задача собирать эту инфу и потом анализировать.
Так как я когда-то неплохо знал УПП и писал море отчетов, то взялся это делать.

Но много конечно сложностей.
Вечером когда футбола будет больше там будет до 40 50 строк одновременно.
45 Котокот
 
20.08.15
12:12
(44) JSON суть тот же XML - структурированный набор данных. Просто он легче XMLя, поэтому используется более широко при обмене данными в интернете.
46 badboychik
 
20.08.15
12:36
(45) Зачем тебе визуальное поле HTML документа если тебе надо просто HTTPСоединение ?
47 badboychik
 
20.08.15
12:36
(46) т.е. к (44)
48 badboychik
 
20.08.15
12:38
(44) зачем в 1С это пихать? Напиши на JS. Или еще хуже с ним чем с 1С ?
49 Serginio1
 
20.08.15
13:10
(40) body.innerHTML
50 Serginio1
 
20.08.15
13:26
51 Serginio1
 
20.08.15
13:27
Только без файла можно обойтись

ЧтениеJSON=new ЧтениеJSON();
    стр=ТекущийДокумент.body.innerHTML;
    ЧтениеJSON.УстановитьСтроку(стр);
52 Serginio1
 
20.08.15
13:40
структ=ПрочитатьJSON(ЧтениеJSON,истина);
53 Капитан Зубровка
 
20.08.15
14:13
44, да с ним еще хуже, питон знаю только кроме 1С и тоже слабо.
Я брался задачу по формам отчетов делать.
Запись этой инфы в регистры рассматривал как подзадачу не очееь серьезную и н4 слишком объемную.
Ошибся сильно.

В общем сходимся на том, что практичнее 8.3.6 и использовать встроенный механизм работы с Json через Httpсоединение?
54 Капитан Зубровка
 
20.08.15
14:16
Визуальное отражение страницы требование заказчика, в лбом случае. Так что по хорошему чтобы два раза не читать одно и то же, использовать бы лучше уже полученное.
Интересно насколько эта ерунда будет лагать, чтение и запись обновлений раз в 30 секунд.
55 Serginio1
 
20.08.15
15:22
(54) А зачем ему отображать JSON?

Сервер="time-2-win.com";
Ури="/index.php/api/livegames/?key=98j3-94j8-948g";

    Соединение=Новый HTTPСоединение(Сервер);
    Запрос=Новый HTTPЗапрос(Ури);
ответ=Соединение.Получить(Запрос);
показатьпредупреждение(,Ответ.ПолучитьТелоКакСтроку());
56 badboychik
 
20.08.15
15:24
&НаКлиенте
Процедура Считать(Команда)
    
    Перем Массив, ОбъектДанных;
    
    Запрос = Новый HTTPЗапрос("/index.php/api/livegames/?key=98j3-94j8-948g");
    Времфайл = ПолучитьИмяВременногоФайла("TXT");
    Соединение = Новый HTTPСоединение("time-2-win.com");
    Попытка
        Ответ = Соединение.Получить(Запрос, Времфайл);
    Исключение
        Сообщить("Ошибка соединения: "+ОписаниеОшибки());
    КонецПопытки;
    
    Если Ответ.КодСостояния = 404 Тогда
        Сообщить("Не найдена страница");
        Возврат;
    КонецЕсли;     
        
    жсон = Новый ЧтениеJSON;
    жсон.ОткрытьФайл(Времфайл);
    Пока жсон.Прочитать() Цикл
        Если жсон.ТипТекущегоЗначения=ТипЗначенияJSON.НачалоМассива ТОгда
            Массив = Новый Массив;
            Продолжить;
        КонецЕсли;
        Если жсон.ТипТекущегоЗначения=ТипЗначенияJSON.НачалоОбъекта Тогда
            ОбъектДанных = Новый Структура;
            Продолжить;
        КонецЕсли;
        Если жсон.ТипТекущегоЗначения=ТипЗначенияJSON.ИмяСвойства Тогда
            СвойствоОбъекта = жсон.ТекущееЗначение;
            жсон.Прочитать();
            ОбъектДанных.Вставить(СвойствоОбъекта, жсон.ТекущееЗначение);
            Продолжить;
        КонецЕсли;
        Если жсон.ТипТекущегоЗначения=ТипЗначенияJSON.КонецОбъекта Тогда
            Массив.Добавить(ОбъектДанных);
            Продолжить;
        КонецЕсли;
        Если жсон.ТипТекущегоЗначения=ТипЗначенияJSON.КонецМассива ТОгда
            Продолжить;
        КонецЕсли;
        Сообщить(жсон.ТекущееЗначение);
    КонецЦикла;
    ЗаполнитьДанныеНаСервере(Массив);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДанныеНаСервере(Массив)
    Для каждого ОбъектДанных Из Массив Цикл
    
        СтрокаДанных = Объект.ТабЧасть.Добавить();
        ЗаполнитьЗначенияСвойств(СтрокаДанных, ОбъектДанных);
    
    КонецЦикла;
КонецПроцедуры
57 badboychik
 
20.08.15
15:25
отрабатывает меньше чем за секунду
58 Serginio1
 
20.08.15
15:36
59 Котокот
 
20.08.15
21:05
Так на сайте что, просто чистый JSON возвращается? Если да, то можно даже без HTTPСоединение обойтись, а сразу делать

ЧтениеJSON= Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьФайл(URLСтраницы);

Я не проверял, но с ЧтениеXML это прокатывает и работает корректно:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(URLСтраницы);
60 Serginio1
 
21.08.15
10:49
(59) Да работает
URLСтраницы="http://time-2-win.com/index.php/api/livegames/?key=98j3-94j8-948g";;

    ЧтениеJSON= Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьФайл(URLСтраницы);
структ=ПрочитатьJSON(ЧтениеJSON);
61 Котокот
 
21.08.15
11:36
(60) Ну вот и всё решение проблемы )
62 Serginio1
 
21.08.15
11:41
(61) Да помню такой трюк, только на форуме встречал и поломку.
63 Serginio1
 
21.08.15
11:49
64 Капитан Зубровка
 
21.08.15
11:52
Все работает!
какой релиз 8.3.6 постабильней?
199 пишут не очень.
65 Капитан Зубровка
 
21.08.15
11:55
Спасибо всем огромное!!!
66 Котокот
 
21.08.15
12:36
(0) Мы сидим на 8.3.6.2152, файловая база - все ок.
67 Капитан Зубровка
 
29.08.15
12:02
Json повержен!

Но задача растет, так как программист который до этого парсил, родил (на ладно ладно, родила) и ей не до того, то надо теперь запарсить вот это.

http://scoreboards.williamhill.com/football/?ver=2a6a24504069fbb7532ab5f6af09077e2015-08-29#8102263/ru-ru/timezoneOffset=7

У нас там живет DIV

и вот так вот

    Для Каждого Стр из ЭтаФорма.элементы.Сайт.Документ.body.all Цикл  

        Сообщить(Стр.tagName);

    КонецЦикла;  

Дальше самого слова DIV я не пролез

и так вот тоже не вышло

    ЧтениеHTML     = Новый ЧтениеHTML;
    ЧтениеHTML.ОткрытьФайл("http://scoreboards.williamhill.com/football/?ver=2a6a24504069fbb7532ab5f6af09077e2015-08-29#8067668/ru-ru/timezoneOffset=7","windows-1251";);
    
    
    ПостроительDOM = Новый ПостроительDOM;
    ДокументHTML   = ПостроительDOM.Прочитать(ЧтениеHTML);
    
    ЭлементыDOM    =  ДокументHTML.ПолучитьЭлементыПоИмени("DIV");
    
    

    Для Каждого ЭлементDOM Из ЭлементыDOM Цикл
        Если ЭлементDOM.ИмяКласса = "content-wrap" Тогда
            Сообщить("ЭлементDOM");
            ПолучитьСсылку(ЭлементDOM);
        КонецЕсли;
    КонецЦикла;


нужна вкладка статистика.
68 Котокот
 
29.08.15
19:56
(67) Сейчас жену в кино свожу, потом разберемся.
69 Serginio1
 
29.08.15
20:04
(67) Тебе лучше работать с Полем HTML ибо
onload="loadScript()
70 Serginio1
 
29.08.15
20:05
Странца может формироваться динамически.
71 Serginio1
 
29.08.15
20:05
Смотри 3,6
72 Котокот
 
29.08.15
20:26
Пока жена собирается, я там обнаружил фрейм:
<iframe src="http://scoreboards.williamhill.com:/football/api/&quot; frameborder="0" scrolling="no" id="diffusionAPI" name="diffusionAPI" style="position: absolute; left: -10000px"></iframe>

Полагаю, твой div находится в документе, размещенном внутри фрейма, поэтому ты его перебором и не находишь.
73 Капитан Зубровка
 
31.08.15
10:55
Дам денег за голову суслика. От этого зависит остальная часть заказа.
Надо распарсить эту хрень любой ценой.
Я даже не буду описывать что делал последние 13 часов. Наверняка я прошел часть того пути что уже прошли уважаемые пользователи этого ресурса и отписавшиеся тут. Но подвисает весь заказ. Так как то первый источник данных, что вы мне помогли запарсить первым недостаточен, нужен

А. Дублер
Б. По второй ссылке инфы больше.

Распарсить не обязательно средствами 1С, можно чем угодно и писать например в текстовый файл. Ну вы поняли.

Админам. Извините, если предложение мое тут неуместно. Но честно очень надо.
74 oleg_km
 
31.08.15
11:14
(73) Фиддлер запусти и посмотри, какой запрос дергает нужную тебе информация. Вроде сейчас уже в IE11 и других браузерах можно F12 нажать и посмотреть все HTTP-запросы, в том числе которые генерит JS
75 Котокот
 
31.08.15
11:26
(73) А ссылку актуальную можно? А то оно пишет, что матч уже закончился.
76 Капитан Зубровка
 
31.08.15
13:08
http://sports.williamhill.com/bet/ru/betlive/9

это список игр.

а вот верхняя из списка. Понятно что ссылки эти все время обновляются.

http://scoreboards.williamhill.com/football/?ver=2a6a24504069fbb7532ab5f6af09077e2015-08-31#8110356/ru-ru/timezoneOffset=7

нужны параметры вкладки статистика...угловые, удаления и тд. их там 8-9
77 Котокот
 
31.08.15
15:46
(76) Как я и говорил: основной документ, в нем фрейм. В параметрах фрейма указан путь ко вложенному документу, его также надо открывать и парсить. Все там нормально видно:
<table id="statsTable" cellspacing="0" cellpadding="0"><thead><tr><th><select id="periodDropDown"><option value="NORMAL">Основное время</option><option value="TOTAL">Всего</option><option value="H1">1-й тайм</option></select></th><th class="stat goalsStat" title="Голы"></th><th class="stat penaltiesStat" title="Пенальти"></th><th class="stat shotsOnTargetStat" title="В створ"></th><th class="stat shotsOffTargetStat" title="Мимо ворот"></th><th class="stat shotsOnWooworkStat" title="Штанги и перекладина"></th><th class="stat cornersStat" title="Угловые"></th><th class="stat freeKicksStat" title="Штрафные"></th><th class="stat throwInsStat" title="Взбрасывания"></th><th class="stat yellowCardsStat" title="Желтые карточки"></th><th class="stat redCardsStat" title="Красные Карточки"></th></tr></thead><tbody><tr><td id="homeTeamCell"><span id="homeTeamDiv" title="Мьянма Ю19">Мьянма Ю19</span></td><td id="home-goals" class="stat" title="">0</td><td id="home-penalties" class="stat" title="">0</td><td id="home-shots-on-target" class="stat" title="45+1'">1</td><td id="home-shots-off-target" class="stat" title="1'">1</td><td id="home-shots-on-woodwork" class="stat" title="">0</td><td id="home-corners" class="stat" title="4', 4', 6', 25'">4</td><td id="home-free-kicks" class="stat" title="3', 7', 10', 12', 28', 30', 32', 43'">8</td><td id="home-throw-ins" class="stat" title="6', 7', 8', 9', 9', 13', 23', 27', 32', 34', 35', 35', 38', 38', 39', 45'">16</td><td id="home-yellow-cards" class="stat" title="44'">1</td><td id="home-red-cards" class="stat" title="">0</td></tr><tr><td id="awayTeamCell"><span id="awayTeamDiv" title="Вьетнам Ю19">Вьетнам Ю19</span></td><td id="away-goals" class="stat" title="41'">1</td><td id="away-penalties" class="stat" title="">0</td><td id="away-shots-on-target" class="stat" title="34', 41'">2</td><td id="away-shots-off-target" class="stat" title="31'">1</td><td id="away-shots-on-woodwork" class="stat" title="">0</td><td id="away-corners" class="stat" title="18', 19'">2</td><td id="away-free-kicks" class="stat" title="10', 15', 16', 22', 24', 28', 31', 33', 34', 39', 40', 44'">12</td><td id="away-throw-ins" class="stat" title="5', 11', 11', 19', 28', 30', 33', 36', 36', 37', 38', 40', 41'">13</td><td id="away-yellow-cards" class="stat" title="">0</td><td id="away-red-cards" class="stat" title="">0</td></tr></tbody></table>
78 Котокот
 
31.08.15
15:47
(76) Если таки не разберешься - пиши на мыло, сторгуемся, сделаем.