Как запустить работу 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.ТекущееЗначение);
            КонецЕсли;
        Иначе
            Возврат;
        КонецЕсли;
    КонецЦикла;   

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

 

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

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

36000 руб.

03.08.2020    15899    12    18    

12

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17835    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25849    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88872    162    216    

318

Интеграция с сервисом vetmanager

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

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

12000 руб.

02.02.2021    16461    42    49    

23
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 3318 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 3318 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 213 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
Оставьте свое сообщение