Имя: Пароль:
1C
1C 7.7
v7: Получение данных ВСД через веб интерфейс Меркурий
,
0 avgsr
 
12.08.18
08:27
Хочу печатную форму ВСД по УИД но не умею парсить хтмл.
Так пойдет?
Предложения/пожелания/критика/тестирование приветствуется.

Функция Норм(с)
    с1=СтрЗаменить(с,""","""");
    с1=СтрЗаменить(с," "," ");
    с1=СтрЗаменить(с1,"</br/>",РазделительСтрок);
    с1=СтрЗаменить(с1,"<br/>",РазделительСтрок);
    с1=СтрЗаменить(с1,"<br>",РазделительСтрок);
    с1=СтрЗаменить(с1,"<span class="""">","");
    с1=СтрЗаменить(с1,"<span class=""label label-warning"">","");
    с1=СтрЗаменить(с1,"</span>","");
    с1=СтрЗаменить(с1,"<span>","");
    //юникод
    Пока Рез="" Цикл
        п=Найти(с1,"&#");
        Если п=0 Тогда Прервать;КонецЕсли;
        п2=Найти(с1,";");
        с2=Сред(с1,п+2,п2-п-2);
        ч2=Число(с2);
        Если ч2=0 Тогда Сообщить(с2);с1=СтрЗаменить(с1,"&#"+с2+";","");КонецЕсли;
        с3=?(ч2=8470,"№",с2);
        с3=?((ч2>31)и(ч2<127),Симв(ч2),с3);//" "-~
        с3=?((ч2>1039)и(ч2<1104),Симв(ч2-848),с3);//А-я
        с1=СтрЗаменить(с1,"&#"+с2+";",с3);
    КонецЦикла;
    Возврат СокрЛП(с1);
КонецФункции

Функция УИД2сз(уид)                              
    сз = СоздатьОбъект("СписокЗначений");
    хттп.open("POST","http://mercury.vetrf.ru/pub/operatorui?_language=ru&_action=showVetDocumentFormByUuid&uuid="+уид, 0);
    Попытка
        хттп.send();
    Исключение  
        Сообщить(ОписаниеОшибки(),"!!!");
    КонецПопытки;
    Если сокрлп(хттп.status)<>"200" Тогда Сообщить(хттп.StatusText); Возврат сз;КонецЕсли;
    ис = хттп.responseText;
    Пока 1=1 Цикл
        ш="profile-info-name";//17
        п=Найти(ис,ш);
        Если п=0 Тогда Прервать; КонецЕсли;
        ис=Сред(ис,п+19);
        ш="</div>";
        п1=Найти(ис,ш);
        н=Лев(ис,п1-1);
        ш="profile-info-value";
        п1=Найти(ис,ш);
        ис=Сред(ис,п1+20);
        ш="</div>";
        п1=Найти(ис,ш);
        з=Лев(ис,п1-1);
        сз.ДобавитьЗначение(Норм(з),н);
    КонецЦикла;
    Возврат сз;
КонецФункции
1 big
 
12.08.18
17:50
а если просто получить ВСД через API Меркурия? Собссно, в штатном режиме получите всю информацию
2 spectre1978
 
12.08.18
18:03
(0) если у вас есть UUID ветеринарки, вы можете просто показать в браузере ее печатную форму, вызвав на исполнение URL вида
"http://mercury.vetrf.ru/pub/operatorui?_language=ru&_action=printVetDocumentByUuid&uuid="; + UUID
3 spectre1978
 
12.08.18
18:03
точка с запятой после закрывающей " лишняя, забыл удалить
4 spectre1978
 
12.08.18
18:04
(1) почти всю. Не будет человекочитаемого номера.
5 kupec
 
12.08.18
18:47
А как этот файл через 1С 7.7 сохранить на жесткий диск компьютера? Может через curl? Что нужно прописать?
Пробовал вот так
"curl.exe  "+Строчка+" -O "+СокрЛП("C:\123.pdf");
вместо строчки адрес, в браузере открывается нормально, а вот курл молчит
6 kupec
 
12.08.18
18:50
+(5) получилось....
"curl.exe   -o C:\123.pdf "+Строчка
7 spectre1978
 
12.08.18
19:24
(6) хм... А вот это полезное знание. Может пригодиться.
8 avgsr
 
13.08.18
03:05
(1) нету Ветис API в условиях задачи. Геморно это через апи все данные для печати вытаскивать, а тут в публичном доступе и всего почти одной строчкой кода...
(2) не хочу полную печатную форму, хочу свою укороченную, одна накладная = один лист с ВСД

А вообще, интересовало мнение по поводу того как лучше распарсить.
Тут пришла мысль что надо пройтись ещё по группам, сделать ирархию.
Пока не придумал как лучше списки , вложенные списки и таблицы парсить :(
9 spectre1978
 
13.08.18
06:30
(8) парсить дело неблагодарное. Поменяют HTML и отвалится полностью или частично ваш разбор, а вы даже и знать об этом не будете, пока не попробуете.
10 big
 
13.08.18
06:58
(9) парсинг в задачу не входит, а значит всё будет хорошо ;)
11 avgsr
 
13.08.18
08:23
(9) (10) а вообще зачем им было заморачиваться на QR коды и пихать туда ссылку на сайт?
Что бы любой мог получить информацию о ВСД?
Так я это и пытаюсь реализовать, получить информацию о ВСД предложенными им методами, т.е. парсить хтмл.
12 spectre1978
 
13.08.18
09:14
(11) ссылка может остаться неизменной. А вот HTML по этой ссылке на моей памяти менялся как минимум один раз.
13 avgsr
 
13.08.18
09:29
(12) я понял.
на моей памяти в ветис каждый день какие-то изменения...
лечь и умереть и ничего не делать....

один раз для себя сделать алгоритм разбора, дальше проще будет его поменять.

лучше бы пример дали рекурсивной функции разбора.
14 spectre1978
 
13.08.18
10:34
(13) изменения есть, но они худо-бедно документируются, а серьезных, которые требуют изменения кода, не так много и о них обычно объявляют сильно заранее. Та же версия 2.0 апи была в состоянии беты очень долго, и никто не мешал при этом пользоваться предыдущей версией. И даже сейчас можно. А страницы сайта могут меняться совершенно спонтанно по желанию левой пятки разработчиков, и уведомлять об этом они никого не обязаны. Вы просто утром можете запустить свою утилиту, а она не будет работать, и все.
15 big
 
13.08.18
11:31
(13) Версия API и версия WEB - это разные вещи. Согласен, что получить страницу в html, это вполне рабочий вариант, но оставлять его основным ИМХО неверно. Кстати, распарсить ответ API совершенно не сложно, а скорее даже проще.
Из минусов варианта API это то, что запрос может тянуть довольно большой объем данных. 20 строк накладной весят около 1,5 Мб электронного ВСД
16 avgsr
 
13.08.18
17:46
https://avatars.mds.yandex.net/get-pdb/1050037/72b0af25-a790-4816-8cb3-08a216e12bbe/s1200

кактотак, результат на 70% устраивает, тему можно закрывать.