При создании интерактивных интерфейсов в 1С:Предприятие часто используется элемент формы Поле HTML документа. С его помощью можно выводить динамические графики, интерфейсные компоненты или обрабатывать визуальные данные. Однако у разработчиков часто возникает вопрос: каким образом из кода 1С передать параметры и запустить функцию JavaScript, объявленную внутри загруженной HTML-страницы?
Рассмотрим подробно способы вызова клиентских скриптов из 1С, проанализируем примеры кода и выясним, из-за чего могут возникать ошибки при попытке обращения к методам JavaScript.
Для взаимодействия с загруженным HTML-документом в 1С используется COM-объект DOM (Document Object Model). Доступ к окну браузера и глобальным переменным скрипта осуществляется через свойство parentWindow (или defaultView) документа.
Разберем по шагам базовый принцип вызова функции:
ДокументСформирован или проверка состояния загрузки).ЭлементыФормы.ПолеHTML.Документ (или Элементы.ПолеHTML.Документ).parentWindow.ИмяФункции(Параметры).Посмотрим на практический пример. Сначала формируем текст HTML-страницы с пользовательским скриптом и загружаем его в элемент формы.
Код загрузки HTML-страницы в форму:
Функция ПолучитьТекстHTML()
Текст = "
|<html>
|<head>
|<meta http-equiv=""X-UA-Compatible"" content=""IE=11"" />
|<script type=""text/javascript"">
| // Глобальная функция для вызова из 1С
| function createButtons(buttonsArray) {
| var buttonsCount = buttonsArray.Количество(); // Обращение к методу массива 1С
| for(var i = 0; i < buttonsCount; i++) {
| var ПараметрыКнопки = buttonsArray.Получить(i);
| var btn = document.createElement('div');
| btn.id = ПараметрыКнопки.ИмяКоманды;
| btn.innerText = ПараметрыКнопки.Заголовок;
| btn.style.fontSize = ПараметрыКнопки.РазмерТекста + 'px';
| btn.style.padding = '10px';
| btn.style.margin = '5px';
| btn.style.background = '#eee';
| document.body.appendChild(btn);
| }
| };
|</script>
|</head>
|<body style='background-color:#FCFAEB'>
|</body>
|</html>";
Возврат Текст;
КонецФункции
Процедура ПриОткрытии()
ЭтаФорма.ЭлементыФормы.ПолеHTMLДокумента.УстановитьТекст(ПолучитьТекстHTML());
КонецПроцедуры
Теперь проанализируем процедуру вызова функции JavaScript createButtons из 1С после загрузки документа:
Процедура СоздатьКнопкиВHTML()
МассивКнопок = Новый Массив;
Для Сч = 1 По 2 Цикл
СтруктураКнопки = Новый Структура;
СтруктураКнопки.Вставить("Заголовок", "Кнопка " + Сч);
СтруктураКнопки.Вставить("ИмяКоманды", "Кнопка" + Сч);
СтруктураКнопки.Вставить("РазмерТекста", 14);
МассивКнопок.Добавить(СтруктураКнопки);
КонецЦикла;
// Получаем DOM-объект документа
ДокументHTML = ЭтаФорма.ЭлементыФормы.ПолеHTMLДокумента.Документ;
// Вызываем JS-функцию и передаем в нее массив 1С
ДокументHTML.parentWindow.createButtons(МассивКнопок);
КонецПроцедуры
Процедура ПолеHTMLДокументаДокументСформирован(Элемент)
// Обязательно вызываем методы JS только после полной загрузки DOM
СоздатьКнопкиВHTML();
КонецПроцедуры
Если при попытке обращения к Документ.parentWindow.МояФункция() возникает ошибка о том, что метод не обнаружен, разберем основные причины этого поведения:
parentWindow до того, как сработает событие ДокументСформирован или пока readyState не станет равен "complete", дерево элементов и скрипты еще не будут инициализированы в памяти.window). Если функция создана внутри локального блока (например, внутри window.onload = function() { ... }), она не будет доступна напрямую через parentWindow.ИмяФункции.В случаях, когда код написан верно, но 1С выдает ошибку отсутствия метода при работе через движок Internet Explorer, необходимо проверить настройки браузера в системе:
inetcpl.cpl через окно «Выполнить»).Важно учитывать технологические изменения платформы 1С:Предприятие:
parentWindow на новых версиях не поддерживается или может вести себя нестабильно.Структура или Массив) рекомендуется сериализовать данные в формат JSON на стороне 1С (с помощью ЗаписатьJSON) и передавать строку в JS, где выполнять JSON.parse().<script> через Документ.createElement("script") или отслеживание изменений атрибутов элементов через MutationObserver. Для обратной передачи данных из JS в 1С используется переход по спец-ссылкам (например, window.location.href = "1c:myEvent?data=" + encodeURIComponent(data)), который обрабатывается событием поля ПриОкончанииПерехода.