При разработке сложных интерфейсов в 1С, таких как интерактивные карты, графики или кастомные элементы управления, часто возникает необходимость передать данные из JavaScript обратно в платформу. В этой статье мы подробно разберем, как получить значение глобальной переменной, определенной в HTML-контенте, используя встроенные средства 1С.
Рассмотрим ситуацию, когда в ПолеHTMLДокумента загружена страница с JS-скриптом (например, карта Leaflet). Пользователь взаимодействует с объектом на странице, JS-переменная обновляется, и нам нужно «вытянуть» это значение в код 1С.
Для того чтобы 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 = ... гарантирует доступность данных.
Это классический метод, который лучше всего работает в тонком клиенте на 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);
КонецПопытки;
КонецПроцедуры
Метод «вытягивания» данных по кнопке не всегда удобен. Часто нам нужно, чтобы 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Документа есть событие ПриНажатии (или ПриИзменении в зависимости от контекста). Однако самый надежный способ для современных версий платформы — использование метода ДокументСформирован для инициализации обратной связи.
Проанализируем причины, по которым код может не сработать:
Документ.parentWindow сразу после установки текста HTML приведет к ошибке, так как страница еще не отрендерена. Всегда используйте событие ДокументСформирован.cdnjs.cloudflare.com), браузер может ограничить доступ к некоторым свойствам объекта window из соображений безопасности.parentWindow может быть ограничено. В этом случае рекомендуется использовать метод ВыполнитьScript().Если вы не хотите полагаться на прямые ссылки в памяти, мы можем попросить браузер «вычислить» нам значение переменной и вернуть его. Разберем по шагам:
&НаКлиенте
Асинхронная Процедура ПолучитьЗначениеЧерезСкрипт()
// Метод ВыполнитьScript позволяет запустить любой JS код и получить результат
// Доступно в новых версиях платформы (8.3.15+)
Результат = Ждать Элементы.ИмяВашегоПоляHTML.ВыполнитьScript("return Room;");
Сообщить("Результат выполнения скрипта: " + Результат);
КонецПроцедуры
Этот метод считается более современным и безопасным, так как он корректно работает в веб-клиенте и не зависит от специфических свойств COM-объектов типа parentWindow.
Подведем итог: для получения значения переменной из HTML документа в 1С 8.3 наиболее простым и надежным способом является обращение к Элементы.ПолеHTML.Документ.defaultView.ВашаПеременная или использование асинхронного метода ВыполнитьScript. Выбор метода зависит от версии вашей платформы и используемого режима работы клиента.