При интеграции внешних картографических сервисов, таких как Google Maps API, во встроенные формы 1С программисты часто сталкиваются с неприятной ошибкой: Метод объекта не обнаружен (eval) или Метод объекта не обнаружен (exec). Эта проблема возникает в момент попытки передать данные из кода 1С в среду JavaScript внутри ПоляHTMLДокумента. Рассмотрим детально, почему это происходит и как настроить стабильное взаимодействие между 1С и браузерным движком.
Первым делом проанализируем ситуацию. В 1С ПолеHTMLДокумента использует движок Internet Explorer. Даже если у вас установлена Windows 10 или 11 с последними обновлениями, встроенный компонент WebBrowser по умолчанию может работать в режиме совместимости с IE7. Когда мы добавляем в HTML-документ тег meta http-equiv="X-UA-Compatible" content="IE=11", мы указываем браузеру использовать современный рендеринг, но это не всегда исправляет поведение COM-интерфейса, через который 1С общается с объектом parentWindow.
Как выяснилось в ходе обсуждения, ошибка часто проявляется именно в тот момент, когда в коде страницы присутствует строка подключения внешнего скрипта Google API:
<SCRIPT type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=ВАШ_КЛЮЧ"></SCRIPT>
Выясним причину: при загрузке тяжелого внешнего скрипта Google Maps API объектная модель документа (DOM) может перестраиваться. В этот момент прямой доступ к методам eval или пользовательским функциям через parentWindow блокируется системой безопасности или особенностями реализации COM-объекта в старых версиях платформы 8.3. 1С просто «теряет» видимость методов внутри окна браузера.
Проанализируем самый эффективный системный метод. Чтобы ПолеHTMLДокумента работало корректно и видело все методы JavaScript, необходимо заставить Windows использовать движок IE11 для процессов 1С. Для этого нам потребуется внести изменения в реестр.
Выполним следующие шаги:
regedit).HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION.1cv8.exe (для толстого клиента) или 1cv8c.exe (для тонкого клиента).11001 в десятичной системе (или 2AF9 в шестнадцатеричной).Это действие гарантирует, что COM-объект Document будет предоставлять полноценный доступ к своим методам, включая eval, без ошибок совместимости.
Вместо того чтобы вызывать стандартный метод eval напрямую из 1С, который часто блокируется, создадим собственную «прослойку» в HTML-макете. Посмотрим на пример реализации функции exec внутри тега script в вашем макете:
function exec(script) {
try {
eval(script);
} catch (e) {
alert("Ошибка исполнения JS: " + e.message);
}
}
Теперь в коде 1С мы будем обращаться не к системному методу, а к нашей функции. Однако здесь кроется важный нюанс: обращение к parentWindow может не работать. Проанализируем альтернативный путь через defaultView.
В коде 1С (для обычных форм) это будет выглядеть так:
Процедура ПолеHTMLДокумента1ДокументСформирован(Элемент)
// Формируем параметры
ШиротаЧисло = 49.431177;
ДолготаЧисло = 32.068009;
// Важно: для JavaScript десятичный разделитель всегда точка!
СтрШирота = Формат(ШиротаЧисло, "ЧРД=.; ЧГ=0");
СтрДолгота = Формат(ДолготаЧисло, "ЧРД=.; ЧГ=0");
ТекстСкрипта = "setLetLng(" + СтрШирота + "," + СтрДолгота + ",'Новая точка','Описание')";
// Используем попытку, так как COM-объект может быть капризным
Попытка
// Попробуем через defaultView, если parentWindow недоступен
ДокументHTML = ЭлементыФормы.ПолеHTMLДокумента1.Документ;
ОкноСкриптов = ДокументHTML.defaultView;
// Если defaultView пусто, откатываемся на parentWindow
Если ОкноСкриптов = Неопределено Тогда
ОкноСкриптов = ДокументHTML.parentWindow;
КонецЕсли;
ОкноСкриптов.exec(ТекстСкрипта);
Исключение
Сообщить("Не удалось вызвать JavaScript: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если работа через COM-интерфейс (объекты parentWindow / defaultView) все равно вызывает ошибку «Метод объекта не обнаружен», рассмотрим «хитрый» способ, который работает практически всегда. Мы можем запустить выполнение кода JavaScript через метод Перейти() (или Navigate), используя протокол javascript:.
Разберем, как это реализовать в 1С:
Процедура ВыполнитьJSНаКарте(КомандаСкрипта)
// КомандаСкрипта - это строка вида "setLetLng(49.43, 32.06, 'Имя', 'Инфо')"
ЭлементыФормы.ПолеHTMLДокумента1.Перейти("javascript:" + КомандаСкрипта + ";");
КонецПроцедуры
Этот метод хорош тем, что он не требует прямого обращения к внутренним методам COM-объекта окна. Браузер воспринимает это как команду в адресной строке и исполняет её в контексте текущей страницы. Это позволяет обойти проблему отсутствия метода eval в объекте parentWindow.
Проанализируем ситуацию с поддержкой браузеров. Компания Google официально прекратила поддержку IE11 для Maps JavaScript API. Это означает, что даже если вы решите проблему с методом eval, сама карта может отображаться некорректно или выдавать предупреждение о том, что ваш браузер не поддерживается.
Чтобы минимизировать проблемы, придерживайтесь следующих правил при составлении HTML-макета:
GoogleIsReady в вашем коде), которую устанавливайте в true только в функции initialize().ДокументСформирован.eval приведет к тому, что 1С выдаст общую ошибку «Метод не обнаружен», хотя на самом деле это будет синтаксическая ошибка внутри самого JavaScript.Используя комбинацию из правки реестра и безопасного вызова через defaultView или javascript:navigate, вы сможете добиться стабильной работы Google Карт в старых интерфейсах 1С.