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