В процессе разработки интеграций 1С с веб-сервисами, такими как Яндекс.Карты или кастомные HTML-интерфейсы, программисты часто сталкиваются с проблемой «невидимости» функций JavaScript или невозможностью вовремя получить результат вычислений. Рассмотрим подробно, как правильно организовать двусторонний обмен данными между 1С и полем HTML-документа, разберем типичные ошибки и современные подходы.
Традиционно в 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('Москва', 'Питер').
Более надежным и производительным способом является прямое обращение к функциям скрипта через объект document. В зависимости от используемого движка браузера (Internet Explorer или WebKit/Chromium) в 1С обращение будет выглядеть по-разному. Разберем эти варианты:
parentWindow.
Результат = ЭлементыФормы.HTMLДок.document.parentWindow.Sweet("Москва", "Питер");
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.
Выясним причину, почему скрипт может не выполняться. Часто ошибки синтаксиса в JS «проглатываются» полем HTML-документа 1С. Выясним, как эффективно проводить отладку:
.html и откройте его в обычном браузере (Chrome или Edge). Нажмите F12, перейдите во вкладку Console. Здесь вы увидите все ошибки: пропущенные скобки, неопределенные переменные или ошибки API.alert("Старт функции") внутри JS, чтобы понять, доходит ли выполнение до нужного участка кода.Рассмотрим по шагам правильную структуру интеграции:
ИсполнитьСкрипт() (для управляемых форм) или прямое обращение к defaultView/parentWindow.Таким образом, успех интеграции зависит от правильного учета движка рендеринга и понимания асинхронной модели выполнения JavaScript.