Интернет Windows Android

Разбор 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 параметра:

  • Элемент у которого произошло событие(само ПолеHTMLДокумента)
  • Объект событие
  • Признак выполнения стандартного поведения
  • Чтобы вызвать событие при нажатии понадобиться выполнить следующий 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 " ) ; Строка = ТекстовыйДокумент. ПолучитьТекст() ; Возврат СокрЛП(Строка ) ; КонецФункции