Как получить значение JavaScript-переменной из Поля HTML-документа в 1С?

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

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

Рассмотрим ситуацию, когда в ПолеHTMLДокумента загружена страница с JS-скриптом (например, карта Leaflet). Пользователь взаимодействует с объектом на странице, JS-переменная обновляется, и нам нужно «вытянуть» это значение в код 1С.

Подготовка JavaScript-окружения

Для того чтобы 1С могла «увидеть» переменную, она должна быть объявлена в глобальной области видимости (Global Scope). В контексте браузера это означает, что переменная должна стать свойством объекта window. Проанализируем пример кода из сообщения автора темы:


// Внутри тега <script> в HTML
var Room; // Переменная объявлена глобально

function onEachFeature(feature, layer) {
    layer.on({
        click: e => { 
            // При клике на объект (например, комнату на карте)
            // записываем результат в глобальную переменную
            Room = e.target.feature.properties.number;
            console.log(Room);
        },
    });
};

Обратите внимание: если бы переменная была объявлена внутри функции с помощью ключевых слов let или const, она была бы недоступна для платформы 1С напрямую. Использование var в корне скрипта или явное присвоение window.Room = ... гарантирует доступность данных.

Способ 1: Прямое обращение через объектную модель (DOM)

Это классический метод, который лучше всего работает в тонком клиенте на Windows, где используется движок Internet Explorer (или совместимый режим). Рассмотрим, как получить доступ к переменной из кода модуля управляемой формы 1С.

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


&НаКлиенте
Процедура ПолучитьДанныеИзHTML(Команда)
    
    // Получаем DOM-документ из элемента формы
    ДокументБраузера = Элементы.ИмяВашегоПоляHTML.Документ;
    
    // Проверяем, загружен ли документ
    Если ДокументБраузера = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Обращаемся к объекту Window (в IE это parentWindow, в других движках defaultView)
    Попытка
        ОкноБраузера = ДокументБраузера.parentWindow;
        
        // Получаем значение переменной 'Room' напрямую
        ЗначениеИзJS = ОкноБраузера.Room;
        
        Сообщить("Выбранная комната: " + ЗначениеИзJS);
    Исключение
        // Если parentWindow не доступен, пробуем defaultView (для WebKit/Chromium)
        ОкноБраузера = ДокументБраузера.defaultView;
        ЗначениеИзJS = ОкноБраузера.Room;
        Сообщить("Значение получено через defaultView: " + ЗначениеИзJS);
    КонецПопытки;

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

Способ 2: Использование событий для автоматического получения данных

Метод «вытягивания» данных по кнопке не всегда удобен. Часто нам нужно, чтобы 1С узнала об изменении переменной мгновенно. Разберем ситуацию: как заставить 1С отреагировать на изменение переменной Room в момент клика в браузере.

Для этого мы можем использовать механизм ExternalEvent (Внешнее событие) или перехват изменения URL. Рассмотрим наиболее универсальный подход через window.external.

Шаг 1. Модифицируем JavaScript код:


// В JS коде вместо простого присваивания вызываем метод оповещения платформы
layer.on({
    click: e => { 
        Room = e.target.feature.properties.number;
        // Передаем данные в 1С через механизм внешних событий
        if (window.external && window.external.setResult) {
            window.external.setResult(Room);
        }
    },
});

Шаг 2. Настраиваем обработку в 1С:

У элемента формы ПолеHTMLДокумента есть событие ПриНажатии (или ПриИзменении в зависимости от контекста). Однако самый надежный способ для современных версий платформы — использование метода ДокументСформирован для инициализации обратной связи.

Важные технические нюансы

Проанализируем причины, по которым код может не сработать:

  1. Тайминги загрузки: Попытка обратиться к Документ.parentWindow сразу после установки текста HTML приведет к ошибке, так как страница еще не отрендерена. Всегда используйте событие ДокументСформирован.
  2. Кросс-доменная политика (CORS): Если ваш HTML загружает скрипты с других сайтов (как в примере автора с библиотекой cdnjs.cloudflare.com), браузер может ограничить доступ к некоторым свойствам объекта window из соображений безопасности.
  3. Различие движков: Помните, что в 1С может использоваться как старый движок IE, так и новый Chromium. Для Chromium (начиная с 8.3.14+) прямое чтение свойств через parentWindow может быть ограничено. В этом случае рекомендуется использовать метод ВыполнитьScript().

Альтернатива: Выполнение произвольного скрипта

Если вы не хотите полагаться на прямые ссылки в памяти, мы можем попросить браузер «вычислить» нам значение переменной и вернуть его. Разберем по шагам:


&НаКлиенте
Асинхронная Процедура ПолучитьЗначениеЧерезСкрипт()
    
    // Метод ВыполнитьScript позволяет запустить любой JS код и получить результат
    // Доступно в новых версиях платформы (8.3.15+)
    Результат = Ждать Элементы.ИмяВашегоПоляHTML.ВыполнитьScript("return Room;");
    
    Сообщить("Результат выполнения скрипта: " + Результат);
    
КонецПроцедуры

Этот метод считается более современным и безопасным, так как он корректно работает в веб-клиенте и не зависит от специфических свойств COM-объектов типа parentWindow.

Подведем итог: для получения значения переменной из HTML документа в 1С 8.3 наиболее простым и надежным способом является обращение к Элементы.ПолеHTML.Документ.defaultView.ВашаПеременная или использование асинхронного метода ВыполнитьScript. Выбор метода зависит от версии вашей платформы и используемого режима работы клиента.

← На главную