Как запустить работу Google Maps в поле HTML формы 1С?

26.09.18

Интеграция - WEB-интеграция

Как справиться с передачей события в поле HTML, если надо передать данные. Переход на новую версию Google Maps.

Как запустить работу Google Maps в поле HTML формы 1С?

При изменении версии на новую Google Maps перестала работать обработка 1С, которая отображала карту через HTML поле в InternetExplorer 9.

Как программисту  на JavaScript и 1C эта работа досталась мне.

Как положено в новых браузерах, сделал код вызова события

window.sendEvent = function(eventName, eventData)
{
    var e = document.createEvent('Event');
    e.initEvent('onhelp', false, true); 
    e. eventName = eventName;
    e. eventData= eventData;
    document.dispatchEvent(e);
    return e;
}

 Но этот код никак не хотел выдавать событие onHelp в 1С.

Даже добавил в реестре HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION вызов 11 версии IE.  Этот способ меняет настройки встроенного браузера. Никакого результата. 

Тогда переключил режим браузера в IE10,

<meta http-equiv=""X-UA-Compatible"" content=""IE=10"">

И тогда старый код стал выдавать событие, и заработала карта.

Но надо было решить задачу передачи данных через поля объекта в 1С. Эти поля упорно не передавались. Они просто обрезались при передаче.

Тогда обратил внимание на стандартное поле data , и о радость, data  передавалось в событие onHelp  и вылавливалось обработчиком событий 1С.

Но data было строковым, а мне требовался объект. Посмотрев еще, обнаружил что кроме data в событие передавалось поле dataFld. И оно тоже было строковым. 

Я решил использовать сериализацию, то есть превращение объекта в строку, а потом строки в объект  и  передал таким образом объект  в обработчик события.

Полученный код:

Вначале, в теге <title> надо переключить браузер в режим IE 10 (В IE 9 режиме не работает карта, в IE 11 режиме не работают события):

|<meta http-equiv=""X-UA-Compatible"" content=""IE=10"">

Вызов события с передачей данных из поля HTML в обработчик 1С.  

|window.sendEvent = function(eventName, eventData)
|{
|             var e = document.createEventObject();
|             //var e = document.createEvent('Event');
|             //e.initEvent('onhelp', false, true);
|             e.data = eventName;
|             e.dataFld = JSON.stringify(eventData);
|             //document.dispatchEvent(e);
|             document.body.fireEvent('onhelp', e);
|             return e;
|}

Код обработчика onHelp

Процедура ПолеHTMLДокonhelp(Элемент, e)
    if (e.data="map.ready") then
        Сообщить("Карта готова");
        КартаГотова();
    endif;
   
    if (e.data="message") then
        Сообщить(e.dataFld);
    endif;               

    if (e.data="info.open") then
        eventData=jsonПрочитатьПлатформой(e.dataFld);
        ОписаниеАдресатовДляДома = ПолучитьОписаниеАдресатовПоАдресуДому(eventData.Получить("address"));
        ОписаниеАдресатовДляДома = eventData.Получить("address") + "<br>"+ОписаниеАдресатовДляДома;
        ЭлементыФормы.ПолеHTMLДок.Документ.parentWindow.setInfoWindowContent(ОписаниеАдресатовДляДома);
    endif;
КонецПроцедуры

 

Сервисные функции для обработки JSON на 1С,( взято отсюда //infostart.ru/public/551972/) :

Функция jsonПрочитатьПлатформой(Значение)

    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Значение);   

    Результат = Неопределено;
    СформироватьДерево(ЧтениеJSON, Результат);
    ЧтениеJSON.Закрыть(); 

    Возврат Результат;
КонецФункции


Процедура СформироватьДерево(ЧтениеJSON, Дерево)   

    ИмяСвойства = Неопределено;   

    Пока ЧтениеJSON.Прочитать() Цикл
        TипJSON = ЧтениеJSON.ТипТекущегоЗначения;        

        Если TипJSON = ТипЗначенияJSON.НачалоОбъекта
        ИЛИ TипJSON = ТипЗначенияJSON.НачалоМассива Тогда
            НовыйОбъект = ?(TипJSON = ТипЗначенияJSON.НачалоОбъекта, Новый Соответствие, Новый Массив);        

            Если ТипЗнч(Дерево) = Тип("Массив") Тогда
                Дерево.Добавить(НовыйОбъект);
            ИначеЕсли ТипЗнч(Дерево) = Тип("Соответствие") И ЗначениеЗаполнено(ИмяСвойства) Тогда
                Дерево.Вставить(ИмяСвойства, НовыйОбъект);
            КонецЕсли;          

            СформироватьДерево(ЧтениеJSON, НовыйОбъект);           

            Если Дерево = Неопределено Тогда
                Дерево = НовыйОбъект;
            КонецЕсли;
        ИначеЕсли TипJSON = ТипЗначенияJSON.ИмяСвойства Тогда
            ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
        ИначеЕсли TипJSON = ТипЗначенияJSON.Число
        ИЛИ TипJSON = ТипЗначенияJSON.Строка
        ИЛИ TипJSON = ТипЗначенияJSON.Булево
        ИЛИ TипJSON = ТипЗначенияJSON.Null Тогда
            Если ТипЗнч(Дерево) = Тип("Массив") Тогда
                Дерево.Добавить(ЧтениеJSON.ТекущееЗначение);
            ИначеЕсли ТипЗнч(Дерево) = Тип("Соответствие") Тогда
                Дерево.Вставить(ИмяСвойства, ЧтениеJSON.ТекущееЗначение);
            КонецЕсли;
        Иначе
            Возврат;
        КонецЕсли;
    КонецЦикла;   

КонецПроцедуры

 

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    2977    5    0    

11

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    35057    69    45    

28

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    2712    2    3    

5

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1043    7    2    

9

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    4657    4    2    

5

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19272    23    22    

20

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    19032    54    50    

31
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 3812 27.09.18 08:52 Сейчас в теме
ХМ странно... Вы выложили ссылку на статью (https://infostart.ru/public/551972/) в которой в комментариях написано, что стандартный метод ПрочитатьJSON в разы быстрее работает метода из статьи и автор статьи в комментариях это подтверждает...
Но выбрали все равно более медленный и более громоздкий способ...

//Всего 3 строчки кода
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(e.dataFld);

eventData= ПрочитатьJSON(ЧтениеJSON);
3. Green2 29 27.09.18 11:40 Сейчас в теме
(1)Спасибо за замечание, оказывается эти функции реализуются простой функцией ПрочитатьJSON()
Примененная функция хороша только в одном случае, когда передаются переменные типа Дата. И стандартным способом десерилизацию провести нельзя. Хотя и даже для Дата можно сделать простым способом. Если типы простые, то все решается одной функцией.

Я первый раз делал такую задачу, и заодно изучал работу JSON.
Из за распространенности данного формата в веб приложениях, я думаю, это будет одна из самых востребованных функций.
Например, я сейчас делаю модуль обмена специфической конфигурации 1С с Битрикс 24, и обмен в формате JSON.
4. dsdred 3812 27.09.18 14:30 Сейчас в теме
(3)
Спасибо за замечание, оказывается эти функции реализуются простой функцией ПрочитатьJSON()

Не за что. Я просто удивился, что та статья вышла позже моей на 4 дня https://infostart.ru/public/551045/
При этом у меня в примере ПрочитатьJSON()

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

для даты обычно использую типовую функцию из розницы брал

//Получаем дату из входных параметров
Функция ПолучитьДатуВремяИзСтроки(ДатаВремя) Экспорт
	
	Результат = Неопределено;
	ДатаВремя = СтрЗаменить(ДатаВремя, "-", "");
	ДатаВремя = СтрЗаменить(ДатаВремя, ":", "");
	Если СтрДлина(ДатаВремя) - Найти(ДатаВремя, " ") = 5 Тогда // время в формате Ч:ММ:СС
		ДатаВремя = СтрЗаменить(ДатаВремя, " ", "0");
	ИначеЕсли Найти(ДатаВремя, "T") > 0 Тогда //время в формате ГГГГММДДTЧЧММСС
		ДатаВремя = СтрЗаменить(ДатаВремя, "T", "");
	Иначе // время в формате ЧЧ:ММ:СС
		ДатаВремя = СтрЗаменить(ДатаВремя, " ", "");
	КонецЕсли;
	
	ОписаниеТипа = Новый ОписаниеТипов("Дата");
	Результат = ОписаниеТипа.ПривестиЗначение(ДатаВремя);  // дата и время в виде "ГГГГММДДЧЧММСС"
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Результат = ОписаниеТипа.ПривестиЗначение(Лев(ДатаВремя, 8));  // только дата "ГГГГММДД"
	КонецЕсли;

	Возврат Результат;
	
КонецФункции
Показать


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


Это хорошо, что сами пробуете и делаете. А JSON не только в веб приложениях распространен.
С JSON работаю с 2015, в тот год пришлось много API использовать и в платформе как раз нарисовали поддержку. А так на работе приходится сейчас часто http-сервисы рисовать для вебера, он сам в JSONе просит данные.


П.С. А ниже Вам правильно написали про WebKIT Перевод клиентских приложений для Windows на использование WebKit (оптимизация отображения HTML)
2. azhilichev 214 27.09.18 10:58 Сейчас в теме
Потерпите чуть-чуть, и перейдем на WebKit. Должно быть в разы лучше.
5. gubanoff 63 27.09.18 17:04 Сейчас в теме
(0) может знаете решение проблемы не по теме: в управляемом приложении в ПолеHTML 1С не переходит по ссылкам на якори.
|<P><A name=НачалоДокумента>Якорь</A></P>
	|<P></P>
	|<P></P>
	|<P></P>
	|<P>Перейти к якорю</P>

Может есть какое-то решение на javascript?
Прикрепленные файлы:
ТестПереходаПоЯкорюВHTMLДокументе.epf
6. as 03.10.18 09:38 Сейчас в теме
Непонятно почему вы решили, что IE11 не работает.
Я делаю так:
<head>
  <met a http-equiv="X-UA-Compatible" content="IE=11" />
</head>
<body>
  <button id="SentDataButton1c" style="display: none"></button>
 </body>



 function sentData(message) {
    errStr = "";
    success = false;
	try {
		if (parentForm == undefined) {
			SentDataButton1cData = message;
			SentDataButton1c.click();
			success = true;
		}
	}
		catch(e) {
		errStr += e.message;	
	};
    try {
      if (!success) parentForm.sentData(message);
    } catch (e) {
      errStr += e.message;
      alert(errStr);
    };
  };
Показать


При это этот код работает под всеми платформами: win,linux, mac и web(проверял только Chrome).
Из 1С после обработки события доступны переменные объекта ПолеХТМЛ через ВнешнийОбъект

&НаКлиенте
Функция ПолучитьВнешнийОбъектХТМЛ(ПолеХТМЛ) Экспорт

	СисИнфо = Новый СистемнаяИнформация;
	Если Найти(СисИнфо.ТипПлатформы,"Windows") = 0 Тогда
		Возврат ПолеХТМЛ.Документ.defaultView;
	Иначе	
	#Если не ВебКлиент Тогда
		Возврат ПолеХТМЛ.Документ.parentWindow;
	#КонецЕсли
	КонецЕсли;
	Попытка
		Если Найти(СисИнфо.ИнформацияПрограммыПросмотра, "MSIE") = 0 Тогда
			Возврат ПолеХТМЛ.Документ.defaultView;
		Иначе
			Возврат ПолеХТМЛ.Документ.parentWindow;
		КонецЕсли;
	Исключение
		Возврат Неопределено;
	КонецПопытки;

КонецФункции
Показать


Что важно, код продолжит работать после появления WebKit под Windows.
7. Green2 29 03.10.18 12:00 Сейчас в теме
(6)
parentForm

(6)
SentDataButton1cData

Я проанализировал код и не понял, что это за переменные, как они объявляются.
Предположу, что parentForm это document.body?
А SentDataButton1cData это просто определение переменной через var?
8. as 03.10.18 17:50 Сейчас в теме
(7) parentForm это ссылка на форму 1с внутри JS, а SentDataButton1cData просто переменная с данными.
Я заполняю их так:
  var initialized, parentForm;
  var SentDataButton1cData;
  function initialize(thisForm) {
    parentForm = thisForm;
    initialized = true;
  };

initialize вызывается из 1С для инициализации.
9. Sheff 27.11.18 14:38 Сейчас в теме
(8) IE=11 не работает и у меня.

Делаю вот так

<ht ml>
<head>
<met a http-equiv="X-UA-Compatible" content="IE=11">
<st yle type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<sc ript async defer src="https://maps.googleapis.com/maps/api/js?key=<ключ>&callback=initMap" type="text/javascript"></sc ript>
<далее скрипт>

<body on load="initMap()">
<div id="map" style="width:100%; height:100%"></div>
<input type="hidden" id="CoordX" name="CoordX" value="0"></input>
<input type="hidden" id="CoordY" name="CoordY" value="0"></input>
<input type="hidden" id="RouteInfo" name="RouteInfo" value=""></input>
<input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0"></input>
<input type="hidden" id="WebClient" name="WebClient" on click="WebClientClick();"></input>
</body>
</html>

Всё. Вот это вот не работает.
На форме 1С просто белое поле и всё.
10. as 27.11.18 19:02 Сейчас в теме
А вы для начала попробуйте без 1C в IE это открыть. Скорее всего у вас ошибки в html
Оставьте свое сообщение