Управляемые формы: Поле HTML Документа и веб-клиент. Управляемые формы: Поле HTML Документа и веб-клиент 1с поле html документа передать параметры

Платформа 1С представляет собой достаточно мощный инструмент, предназначенный для решения широкого круга задач. В этой статье мы хотим рассказать об одном типе объекта, с помощью которого можно:

  • Работать с компонентами ActiveX;
  • Вызывать Javascript;
  • Создавать и использовать ссылки на различные объекты базы данных.

Этот объект называется в 1С полеHTMLдокумента.

Элемент управления ПолеHTMLДокумента имеет одно существенное ограничение в использовании – его нельзя использовать для расположенных в таблице полей.

Создание собственного браузера в 1С

Давайте попробуем с помощью этого поля создать обработку, открывающую ссылку на ресурс в интернете:

Проверим, как это работает.. Получим картинку (Рис.4)
Рис.4.

Проанализируем, что мы видим:

  • Открылось поисковое окно, со ссылкой на сайт, при этом поиск осуществляется с помощью поисковой системы, назначенной по умолчанию;
  • Обработка работает, интернет страницы открываются, переходы по ссылкам осуществляются;
  • При вызове ресурса произошла ошибка сценария.
  • С чем связана ошибка? С тем, что ПолеHTMLДокумента – это фактически типовой Internet Explorer, причем не самой последней версии, который не поддерживает большинство современных ресурсов. Так что сайты, не поддерживающие режим совместимости, будут открываться с ошибками в сценарии.

    Для удобства пользователя можно на форме создать навигационные команды «Вперед» и «Назад», которые будут описывать соответствующие перемещения.

    Создание ссылки на объект базы данных

    Задача состоит в следующем:

    • Создать список каких-либо объектов, допустим элементы справочника «Сотрудники»;
    • Получить ссылку на каждый из них;
    • Открывать их непосредственным нажатием на соответствующую ссылку.

    Создадим нашу обработку и форму на ней.


    Подробнее рассмотрим, что мы сделали:

  • Создали текстовый документ, который содержит «тело» нашего сайта;
  • Начало и окончание документа, а так же тело нашего ХТМЛ документа мы описали с помощью соответствующих тегов;
  • Записали в него каждого сотрудника;
  • В записях сотрудников у нас содержится информация, которая нам понадобится позже, когда мы будем открывать элементы кликая на ФИО сотрудников;
  • Установили нашему полю текст, который описывает структуру.
  • Попробовав сейчас активировать любую из имеющихся гиперссылок мы столкнемся с тем, что «Такая страница не найдена»(Рис.8)
    Рис.8

    Продолжим описывать обработчик.

    Создадим процедуру, которая обрабатывает клик мышки по гиперссылке на элемент справочника (Рис.9).

    Рис.9

    Рассмотрим её подробнее:

  • Прежде всего отключим стандартную обработку щелчка по гиперссылке;
  • Получим строку, характеризующую наш элемент, для этого в ДанныеСобытия получим значение параметра Element.id;
  • Разделим полученную строку в соответствии с правилами, по которым мы её формировали (название справочника и уникальный идентификатор, разделенные между собой тире);
  • Получаем ссылку на элемент, используя функцию ВозвратСсылки;
  • Открываем элемент по полученной ссылке.
  • Протестируем выполнение созданного кода.

    Так как в настройках нашей программы запрещено использование модальных окон, выполнение выше приведенного кода завершилось ошибкой (Рис.10). В противном случае все бы отработало нормально.

    Рис.10

    Зайдем в конфигураторе в меню Текст->Рефакторинг->Нерекомендуемые синхронные вызовы->Преобразовать вызовы модуля. По прошествии некоторого времени текст нашего модуля будет выглядеть как на Рис.11

    Рис.11

    Опробовав обработку еще раз можно убедиться, что все работает нормально и при щелчке на ссылку открывается соответствующий элемент справочника.

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

    Пара слов о Javascript

    Вызовы функций JS в ранних версиях программы осуществлялись через параметр поля document.parentWindow.MyFunk(), однако в современных браузерах эта возможность была утрачена. Не срабатывают так же вызовы через eval().

    Выход состоит в использовании специальной функции fireEvent, которая является универсальным механизмом обмена данными между 1С и Javascript.

    Работа с альтернативным интерфейсом на управляемых формах 1С доступна через HTML. Альтернативный интерфейс может понадобиться, если стандартных элементов управления 1С недостаточно, но хочется чего-то большего. В данной статье перечислены некоторые секреты работы с веб-интерфейсом на управляемых формах 8.2.Показ Html-страницы на управляемой форме 1С Для показа Html-страницы необходимо на форму вставить Поле Html Документа и в источник данных поместить html-код. Нужно иметь ввиду следующее: тонкий и веб-клиент на Internet Explorer работают по-особенному. В двух этих случаях используется Internet Explorer в режиме совместимости с IE 7.
    Первый секрет заключается в том, что тонкий клиент можно перевести в режим совместимости с более старшей версией IE. Для этого нужно использовать meta X-UA-Compatible. Так на Windows 7 после добавления


    можно использовать SVG-объекты, например:

    Перевести веб-клиент IE на более современную версию совместимости можно, поместив веб-клиент 1С в IFrame и задав в родительском html meta-тэг совместимости. Пример, как это можно сделать показан здесь:
    Но при этом не гарантируется нормальная работа и отображение веб-клиента, поскольку 1С изначально проектировала веб-клиент из расчета совместимости с IE6/7.
    Второй секрет заключается в том, что верстка html-макетов в режиме текста без визуального редактора 1С портится после закрытия макета в конфигураторе. Например, если вы вставите svg-определения на html-макете, то после переоткрытия конфигуратора увидите испорченный html (обратите внимание на head-заголовок).

    Поэтому, если ваша верстка сложнее, чем показ рисунка, то советую сохранить html-код еще и в другом месте.

    Хранение всего подряд в общих картинках Современная веб-страница не ограничена одним только html. К ней в дополнение идут картинки, js/css-файлы. Традиционный подход допускает хранение и обращение к картинкам, помещенным в общие картинки конфигурации, но с js/css 1С-разработчикам приходится исхитряться. Текстовые файлы или записывают в архив и распаковывают перед показом страницы или целиком помещают в html. Такой подход не задействует встроенный практически в каждый браузер кэш для get-запросов.
    Мой опыт состоял в том, чтобы поместить в общие картинки java-скрипт. Этот опыт частично удался, т.е. все браузеры и тонкий клиент запустили jQuery, кроме IE. Если кто-нибудь знает секрет и сможет заставить работать этот способ на IE, прошу, отписаться. Действия необходимо делать следующие:
    1. Создать общую картинку и поместить в нее любую картинку
    2. На html-макете в режиме редактирования выделить любой текст и через меню Элементы-Ссылка выбрать общую картинку
    3. Текст из ссылки вставить в блок script
    4. Заменить общую картинку на JavaScript-содержимоеВстроенный фреймворк 1С для веб-клиента Мало кто знает, что веб-клиент 1С включает в себя фреймворк, упрощающий работу с элементами форм. Фреймворк работает на JavaScript. Обращение к нему возможно через parent.WebUI. функции его требуют дополнительных исследований, но свойства выглядят следующим образом:


    В теории этот фреймворк можно задействовать для вызова серверных процедур 1С. В этом случае произойдет полная интеграция html-поля с другими элементами управляемой формы, что повлечет платформенную независимость. Сейчас обратная связь достигается за счет WebBrowser Control, который привязан к Windows.Ключевое слово __STYLE__ Долго ломал голову, что же означает ключевое слово __STYLE__, которое 1С автоматически подставляет в шаблон пустого html-макета. Но исследования запросов показало, что __STYLE__ ничем не заменяется, и на этот запрос сервер возвращает 500 ошибку: Internal Server Error.

    28
    При интеграции 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С, для дальнейшей обработки.

    Пример реализации в

    Вопрос: Не отображается код HTML в Поле HTML Документа 1С управляемые формы


    Доброго времени суток! Подскажите кто нибудь, создаю внешнюю обработку, создал форму, в форме создал Поле, в форме создал Реквизит (Тип: Строка не ограниченная), путь к данным: Реквизит (Вид: Поле HTML Документа), в Модуле прописал программно:

    &НаКлиенте
    Процедура Поле1ДокументСформирован(Элемент)
    ЭтотОбъект.Реквизит = "Wellcome"; КонецПроцедуры В итоге в Поле HTML Документа ничего не отображается (Пусто), хотя по идее должно отображаться Wellcome, как я понимаю по прочитанному на форуме.

    Что я сделал не так?

    Ответ: Кому нужна данная идея, забирайте, готовая рабочая и стабильная цепочка, проверено в 1С: Розница 8/2.2 управляемые формы!!!

    Вопрос: Поле HTML документа ЭлементыФормы.ИЕ.Документ.getElementsByClassName()


    История такая ЭлементыФормы.ИЕ.Документ.getElementsByClassName("loginform__input-border") нормально возвращает нужный элемент а вот
    ЭлементыФормы.ИЕ.Документ.getElementsByClassName("loginform__input-field ng-dirty ng-valid ng-touched") ни как не находит

    т.е. не работает когда в имени есть пробелы...

    почему?

    Ответ: () А форм много на странице? Если нет, то получи массив форм и выбери нужную.

    Вопрос: очищается реквизит формы (поле html-документа)


    Генерю страницу с полем html-документа. Пользователь кликает погиперсслыкам, которые открываются в сгенеренных страницах с полями html-документов.
    Потом пользователь закрывает (программно) исходную страницу, она благополучно закрывается, но почему-то все поля html-документов в производных страницах очищаются (сбрасываются), то есть становятся пустыми.
    Никто не подскажет, может быть, из-за чего? Как избежать

    Ответ:

    Вот это действительно идея!

    Вопрос: Как работать с Поле HTML Документа?


    Подскажите как можно реализовать следующие действия или дайте ссылочку на материал.
    Есть необходимость программно заполнить поля на форме сайта, авторизироваться и проводить программно следующее заполнение полей на сайте.
    ???

    Добавлено через 5 часов 9 минут
    Нужно программно заполнить input"ы и нажать кнопку..

    Добавлено через 16 часов 29 минут
    Как заполнить поля разобрался. Есть идеи как по кнопке кликнуть?

    Добавлено через 1 час 17 минут
    Во всем разобрался. Тему можно закрыть/удалить)

    Ответ: Через ком. Сейчас времени нет. Во второй половине дня или вечером отпишусь.

    Вопрос: Поле HTML-документа (не опять, а снова)


    Всем привет.
    Управляемые формы. Самописная конфа. Достали "ошибки сценариев" при отображении интернет-страницы в поле HTML-документа. Нет, я не пытаюсь сделать внутри 1С полноценный браузер (отсылка к общей форме "Обозреватель" в типовых), но какие-то элементарные формы, например форму авторизации на гугле, надо выводить. И выводить хотелось бы по-человечески, чтобы юзер не удивлялся ругательствам по поводу скриптов.

    Что предпринималось:
    Настраивался IE в винде, дабы игнорировал скрипты. Помогло. Но не прошло согласование ввиду неудобства настройки каждого клиентского компа.
    Выкидывались скрипты из содержимого полученной по адресу страницы при наступлении события Документсформирован. Не помогло. Ругательства успевают выскочить перед носом офигевающего юзера до того, как скрипты выкинуты.
    Документ отправлялся формироваться на сервере. Затем HTML-код очищался от скриптов и отправлялся на клиенте в поле HTML-документа. Помогло. Но нажатие кнопок и другая работа с формой на клиенте бывали затруднены - многие действия требуют контекста, который остался на сервере (куки). И даже если оставить скрипты для нужных кнопок и перетащить куки с сервера на клиент, нереально отследить все возможные переходы и варианты содержимого "чужих" страниц, и всевозможных редиректов, которые могут возникать. Потенциальная халтура детектед.
    Ковырялись типовые на предмет реализации вывода чужого HTML. Не помогло. Либо не всё еще "проковыряно", либо разрабы вендора не связываются с неизвестным HTML, либо пресекают вывод в веб-клиенте, а оставшиеся проблемы со скриптами игнорируют.

    Помогите....

    Ответ: () ценная информация, спасибо

    Вопрос: Помогите открыть сайт через поле HTML документа


    Добрый день. Есть сайт
    Который не поддерживает старые браузеры.

    Его нужно открыть в поле HTML документа.
    Пробовал делать режим совместимости:

    Сайт = "



     

    Пожалуйста, поделитесь этим материалом в социальных сетях, если он оказался полезен!