Разбор html документа в 1с. Создание ссылки на объект базы данных
27
При интеграции 1С с веб-сайтами всегда встает вопрос о передачи некоторых данных на веб-сервер. Будь то это передача параметров запроса для получения данных от веб-сервера в 1С или же передача данных из 1С, которые...
14
У разработчиков на платформе 1С иногда возникает задача по взаимодействию системы 1С: Предприятие с различными почтовыми программами и протоколами. 1С Предприятие 8.0 имеет довольно удобные средства для отправки...
9
При обмене данными с веб-сайтами зачастую используется формат JSON. К сожалению, в 1С нет стандартных процедур для работы с данным форматом. В процессе реализации одного из проектов мной был разработан ряд процедур и...
8
Формат JSON в 1С до версии 8.3.6 не реализован, но нижет я приведу примеры функций которые можно использовать для полноценной работы JSON в 1С предыдущий версий. JSON (JavaScript Object Notation) это текстовый формат обмена данными,...
5
В этой статье я постараюсь описать процесс парсинга сайтов средствами 1С с примером.
Это статья не является инструкцией к применению, а лишь демонстрирует возможности 1С.
Что мы имеем?
1. Сайт в интернете, на котором...
Во время реализации одного проекта, возникла необходимость выполнять javascript(далее JS) код под управление объекта ПолеHTMLДокумента, с получением результат в 1С. Приведённые примеры, в найденных статьях, показались не очень удобными в использовании (сугубо личное мнение). Было принято решение попробовать найти другое, более простое, решение, на поиски отводилось не более 1 дня.
ДИВ.setAttribute("onclick", "alert("Координаты");");
Выполним скрипт
ДИВ.click();
ТАДА. все работает
Процедура ВыполнитьСкрипт(ТекстСкрипт) ДИВ = Элементы.док.Документ.getElementById("TEST"); ДИВ.setAttribute("onclick", ТекстСкрипт); ДИВ.click(); КонецПроцедуры
Дополнение от 02.08.2016В комметариях был предложен еще один способ вызова JS (спасибо ), если у вас есть возможность менять код HTML документа, то можно прописать функцию в нем и затем ее вызывать. передавая в нее код на JS.
function exec(script) { eval(script); }
и затем в 1С:
Элементы.ПолеHTMLДокумента1.Документ.parentWindow.exec("alert("OK")");
Возврат результата JS в 1СДля передачи результата скрипта в 1С из объекта ПолеHTMLДокумента будем использовать событие. Привяжем к ПолеHTMLДокумента событие ПриНажатии которое получает на вход 3 параметра:
Чтобы вызвать событие при нажатии понадобиться выполнить следующий js код
Var evt = document.createEventObject(); // создадим пустой объект событие evt.propertyName = "функц1"; // в реквизит propertyName предлагаю помещать название результата (что-то вроде типа, или название функции от которой получили данные) evt.data = "156"; //в реквизит data будем передавать данные результата document.body.fireEvent("onclick", evt); // выполним событие при нажатии ПолеHTMLДокумента
Выполнив данный js код в процедуру при нажатии вторым параметром придет созданный нами объект событие. Который довольно удобно обрабатывать.
Пример разбора ответа.
&НаКлиенте // получаем имя и результат события Процедура ДокПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка) ИмяОперации = ДанныеСобытия.Event.propertyName; ДанныеОперации = ДанныеСобытия.Event.data; Если ИмяОперации = "" Тогда //не наше событие Возврат; КонецЕсли; Если ИмяОперации = "Функц1" Тогда // обработка результат ИначеЕсли ИмяОперации = "функц2" Тогда // обработка результат //...... КонецЕсли; КонецПроцедуры
Этот метод избавляет от использования обработчиков ожидания, и предоставляет удобный идентификатор события. По идентификатору мы точно знаем какие данные нам пришли, и как их разобрать.
Дополнения от 26.03.2016И в этом месте тоже произошли непонятки (ошитбка восптроизводится только на плаформе 8.3.5.1570, но дабы предупредить эти ситуации в далнейшем, приведу решение) Сама причина - при повторном запуске формы с Поле HTML документа в момент вызова процедуры при нажатии по полю HTML платформенный вызов залипал и валил весь COM объект (Произошла исключительная ситуация (htmlfile): Неопределенная ошибка). Решением стало отключение стндарного выполнения события click, и отключение режима всплывания события. Как же это сделать смотрим ниже.
// отключим всплывание события
Evt.cancelBubble = true;
// отключим стандартное поведение
Evt.returnValue = false;
В результате для передачи данных в 1с из JS мы получим функцию.
Function return1c(name,data){ var evt = document.createEventObject(); evt.propertyName = name; evt.data = data; evt.cancelBubble = true; evt.returnValue = false; document.fireEvent("onclick",evt); };
Вывод.Комбинируя эти методы, вы сможете довольно легко запускать необходимый вам js код, и получать данные в 1С, для дальнейшей обработки.
Пример реализации в
Иногда появляется необходимость отобразить какую-либо веб-страницу прямо на форме. Я рассмотрю эту возможность платформы 1С на примере вывода на форму страницы с поисковой системой yandex, причем с результатами поиска по слову, введённому в поле формы.
Т.е. вот этой страницы:
Рисунок 1
Для начала создадим внешнюю обработку, добавим реквизит «Адрес « с типом «Строка», неограниченной длины.
Рисунок 2
Создадим форму обработки. Реквизит «Адрес» перенесем на форму дважды. Один из элементов формы реквизита переименуем в «Страница», изменим Вид элемента на «Поле HTML документа».
Форма примет вид:
Рисунок 3
Запустим обработку в режиме «Предприятие» и введем адрес произвольного интернет ресурса. И получим результат:
Рисунок 4
Как же сделать так, чтобы в поле «Страница» выводилась страница Яндекса, но уже с результатами поиска по какому-нибудь слову?
Добавим реквизит формы: «КлючевоеСлово», перенесем на форму.
Если приглядеться к адресу, который появляется в адресной строке Яндекса после осуществления поиска по ключевому слову «1С» (а будет он таким: «http://yandex.ru/yandsearch?text=1%D1%81»), то можно увидеть, что введенное слово шифруется и передается в post-переменной text. Отсюда делаем вывод, что осталось лишь разобраться в том, как получить шифрованное значение запроса.
Если немного покопаться, то можно узнать, что для кодирования переменных в URL’ах можно использовать java-script функцию «encodeURIComponent». Можно, конечно, перебором подобрать код для каждого символа алфавита и самому написать кодировщик, а можно использовать возможности компоненты wscript, которую можно подключить из 1С.
Итак, что нам нужно:
А) Подключить wscript
Б) На основании ключевого слова собрать скрипт, который будет получать значение, возвращенное функцией «encodeURIComponent» при передаче в неё в качестве параметра нашего слова, а затем полученный результат будет записывать в текстовый файл с определенным заранее каталогом
В) Из 1С получать текстовый файл, созданный при помощи wscript и читать его.
Если говорить на встроенном языке, то звучит это так:
& НаКлиенте Процедура КлючевоеСловоПриИзменении(Элемент) Объект. Адрес = " http://yandex.ru/yandsearch?text=" + КонвертироватьКлючевоеСлово(); КонецПроцедуры & НаКлиенте Функция КонвертироватьКлючевоеСлово() ИмяФайлаВрем = ПолучитьИмяВременногоФайла( " js" ) ; КаталогСохранения = СтрЗаменить(КаталогВременныхФайлов() , " \" , " /" ) ; КаталогСохранения = СтрЗаменить(КаталогСохранения, " C:/" , " C://"); ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент. УстановитьТекст (" value = encodeURIComponent( " " " + КлючевоеСлово + " " " ) ; |FSO = WScript. CreateObject( " " Scripting. FileSystemObject " " ) ; |f = FSO. CreateTextFile( " " " + КаталогСохранения + " test. txt " + " " " , true ) ; |f. WriteLine(value) ; |f. Close() ; " ) ; ТекстовыйДокумент. Записать(ИмяФайлаВрем, КодировкаТекста. ANSI) ; WshShell = Новый COMОбъект(" WScript. Shell " ) ; WshShell. Run(" wscript. exe " " " + ИмяФайлаВрем+ " " " " , 0 , - 1 ) ; УдалитьФайлы(ИмяФайлаВрем) ; ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент. Прочитать(КаталогВременныхФайлов() + " test. txt " ) ; Строка = ТекстовыйДокумент. ПолучитьТекст() ; Возврат СокрЛП(Строка ) ; КонецФункции