Как исправить ошибку Метод объекта не обнаружен (eval) при работе с Google Картами в 1С?

Программист 1С v8.3 (Обычные формы)
← На главную

При интеграции внешних картографических сервисов, таких как 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С просто «теряет» видимость методов внутри окна браузера.

Решение 1: Принудительная эмуляция браузера через реестр

Проанализируем самый эффективный системный метод. Чтобы ПолеHTMLДокумента работало корректно и видело все методы JavaScript, необходимо заставить Windows использовать движок IE11 для процессов 1С. Для этого нам потребуется внести изменения в реестр.

Выполним следующие шаги:

  1. Откройте редактор реестра (regedit).
  2. Перейдите в ветку: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION.
  3. Создайте новый параметр типа DWORD (32 бита).
  4. Имя параметра должно соответствовать имени исполняемого файла 1С, например, 1cv8.exe (для толстого клиента) или 1cv8c.exe (для тонкого клиента).
  5. Установите значение 11001 в десятичной системе (или 2AF9 в шестнадцатеричной).

Это действие гарантирует, что COM-объект Document будет предоставлять полноценный доступ к своим методам, включая eval, без ошибок совместимости.

Решение 2: Использование функции-обертки внутри HTML

Вместо того чтобы вызывать стандартный метод 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: " + ОписаниеОшибки());
    КонецПопытки;

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

Решение 3: Обход через навигацию (самый стабильный метод)

Если работа через COM-интерфейс (объекты parentWindow / defaultView) все равно вызывает ошибку «Метод объекта не обнаружен», рассмотрим «хитрый» способ, который работает практически всегда. Мы можем запустить выполнение кода JavaScript через метод Перейти() (или Navigate), используя протокол javascript:.

Разберем, как это реализовать в 1С:


Процедура ВыполнитьJSНаКарте(КомандаСкрипта)
    // КомандаСкрипта - это строка вида "setLetLng(49.43, 32.06, 'Имя', 'Инфо')"
    ЭлементыФормы.ПолеHTMLДокумента1.Перейти("javascript:" + КомандаСкрипта + ";");
КонецПроцедуры

Этот метод хорош тем, что он не требует прямого обращения к внутренним методам COM-объекта окна. Браузер воспринимает это как команду в адресной строке и исполняет её в контексте текущей страницы. Это позволяет обойти проблему отсутствия метода eval в объекте parentWindow.

Важные замечания по Google Maps API

Проанализируем ситуацию с поддержкой браузеров. Компания Google официально прекратила поддержку IE11 для Maps JavaScript API. Это означает, что даже если вы решите проблему с методом eval, сама карта может отображаться некорректно или выдавать предупреждение о том, что ваш браузер не поддерживается.

Чтобы минимизировать проблемы, придерживайтесь следующих правил при составлении HTML-макета:

  1. Всегда проверяйте готовность API. Используйте переменную-флаг (например, GoogleIsReady в вашем коде), которую устанавливайте в true только в функции initialize().
  2. Передавайте данные в 1С только тогда, когда документ полностью загружен. В 1С это событие ДокументСформирован.
  3. Если карта не отображается, проверьте ключ API. С 2018 года Google требует обязательной привязки платежного аккаунта, даже если вы не превышаете бесплатные лимиты.
  4. Внимательно следите за кавычками при формировании строки скрипта в 1С. Ошибка в одной кавычке внутри eval приведет к тому, что 1С выдаст общую ошибку «Метод не обнаружен», хотя на самом деле это будет синтаксическая ошибка внутри самого JavaScript.

Используя комбинацию из правки реестра и безопасного вызова через defaultView или javascript:navigate, вы сможете добиться стабильной работы Google Карт в старых интерфейсах 1С.

← На главную