Как вызвать JavaScript функцию из 1С и получить результат?

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

В процессе разработки интеграций 1С с веб-сервисами, такими как Яндекс.Карты или кастомные HTML-интерфейсы, программисты часто сталкиваются с проблемой «невидимости» функций JavaScript или невозможностью вовремя получить результат вычислений. Рассмотрим подробно, как правильно организовать двусторонний обмен данными между 1С и полем HTML-документа, разберем типичные ошибки и современные подходы.

Анализ механизма вызова JavaScript из 1С

Традиционно в 1С (особенно в обычных формах) взаимодействие строилось на имитации действий пользователя: записи значения в скрытое поле HTML-формы и программном нажатии на невидимую кнопку. Проанализируем пример кода из сообщения, где автор пытается запустить функцию Sweet:


// Код в 1С
Процедура ВыполнитьСкрипт(Команда) Экспорт
    // Передаем команду в скрытое поле
    ЭлементыФормы.HTMLДок.document.getElementById("WebClientOperation").value = Команда;
    // Эмулируем клик для срабатывания обработчика в JS
    ЭлементыФормы.HTMLДок.document.getElementById("WebClient").click();
КонецПроцедуры

В самом JavaScript на стороне HTML-страницы обычно создается «диспетчер», который ловит этот клик и через функцию eval() исполняет содержимое текстового поля. Посмотрим на этот механизм подробнее:


function WebClientClick() {
    var WebClientOperation = document.getElementById("WebClientOperation").value;
    switch (WebClientOperation) {
        case "0": 
            break;
        default:
            // Исполнение произвольного кода
            eval(WebClientOperation);
    }
}

Важный момент: если вы передаете параметры в функцию, например, Sweet(Москва, Питер), JavaScript воспримет «Москва» как переменную, а не как строку. Для корректной работы необходимо передавать строки в кавычках: Sweet('Москва', 'Питер').

Прямой вызов функций через объектную модель (DOM)

Более надежным и производительным способом является прямое обращение к функциям скрипта через объект document. В зависимости от используемого движка браузера (Internet Explorer или WebKit/Chromium) в 1С обращение будет выглядеть по-разному. Разберем эти варианты:

  1. Для Internet Explorer (старые версии платформы или специальные настройки): используется свойство parentWindow.
    
    Результат = ЭлементыФормы.HTMLДок.document.parentWindow.Sweet("Москва", "Питер");
    
  2. Для современных движков (WebKit/Chromium) и определенных версий IE: используется defaultView. Результат = ЭлементыФормы.HTMLДок.document.defaultView.Sweet("Москва", "Питер");

Проанализируем ситуацию, когда parentWindow выдает ошибку. Это часто происходит в версиях Internet Explorer 9 и выше, если в HTML-документе не указан режим совместимости. Для исправления ситуации обязательно добавьте в head вашего HTML-макета следующий мета-тег:

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

Проблема асинхронности (на примере Яндекс.Карт)

Одной из главных причин получения «пустого результата» является асинхронная природа многих JavaScript-библиотек. Рассмотрим функцию геокодирования из обсуждения:


function Sweet(point1, point2) {
    ymaps.geocode(point1).then(function (res) {
        var coords = res.geoObjects.get(0).geometry.getCoordinates();
        // В этот момент 1С уже закончила выполнение своей процедуры
        document.getElementById('Znach').value = coords;
    });
}

Когда вы вызываете Sweet из 1С, метод geocode отправляет запрос на сервер Яндекса и немедленно возвращает управление. 1С переходит к следующей строке кода (чтению результата), но ответ от сервера еще не пришел, и поле Znach остается пустым.

Решение задачи: Вместо того чтобы ждать результат в 1С сразу после вызова, необходимо реализовать «обратный вызов». Когда JavaScript закончит вычисления, он должен сам оповестить 1С. В управляемых формах это делается через механизм window.external.Message или window.external.OnEvent.

Отладка JavaScript кода внутри 1С

Выясним причину, почему скрипт может не выполняться. Часто ошибки синтаксиса в JS «проглатываются» полем HTML-документа 1С. Выясним, как эффективно проводить отладку:

Итоговые рекомендации по организации взаимодействия

Рассмотрим по шагам правильную структуру интеграции:

  1. Подготовка HTML: Объявляйте функции в глобальной области видимости (вне других функций). Используйте современные стандарты и мета-теги совместимости.
  2. Вызов из 1С: Используйте метод ИсполнитьСкрипт() (для управляемых форм) или прямое обращение к defaultView/parentWindow.
  3. Передача данных: Всегда проверяйте типы данных. Массивы и структуры из 1С лучше передавать, предварительно преобразовав их в формат JSON.
  4. Получение результата: Если работаете с картами или внешними API, используйте событийную модель (JS меняет заголовок окна или вызывает специальное событие, которое ловит 1С).

Таким образом, успех интеграции зависит от правильного учета движка рендеринга и понимания асинхронной модели выполнения JavaScript.

← На главную