Как вызвать функцию JavaScript из кода 1С в поле HTML-документа?

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

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

Рассмотрим подробно способы вызова клиентских скриптов из 1С, проанализируем примеры кода и выясним, из-за чего могут возникать ошибки при попытке обращения к методам JavaScript.

Вызов функций JavaScript через объект DOM

Для взаимодействия с загруженным HTML-документом в 1С используется COM-объект DOM (Document Object Model). Доступ к окну браузера и глобальным переменным скрипта осуществляется через свойство parentWindow (или defaultView) документа.

Разберем по шагам базовый принцип вызова функции:

  1. В коде HTML-страницы объявляем глобальную функцию JavaScript.
  2. В 1С дожидаемся полного формирования документа (событие ДокументСформирован или проверка состояния загрузки).
  3. Получаем объект DOM через свойство элемента формы ЭлементыФормы.ПолеHTML.Документ (или Элементы.ПолеHTML.Документ).
  4. Обращаемся к объявленной в JS функции через parentWindow.ИмяФункции(Параметры).

Пример формирования HTML и вызова функции с передачей данных из 1С

Посмотрим на практический пример. Сначала формируем текст 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.МояФункция() возникает ошибка о том, что метод не обнаружен, разберем основные причины этого поведения:

  1. Вызов до окончания загрузки страницы. Если обратиться к parentWindow до того, как сработает событие ДокументСформирован или пока readyState не станет равен "complete", дерево элементов и скрипты еще не будут инициализированы в памяти.
  2. Область видимости функции JavaScript. Функция должна быть объявлена в глобальном контексте (как свойство объекта window). Если функция создана внутри локального блока (например, внутри window.onload = function() { ... }), она не будет доступна напрямую через parentWindow.ИмяФункции.
  3. Настройки безопасности Internet Explorer. В операционной системе встроенный движок IE может блокировать исполнение активных сценариев и взаимодействие с COM-объектами.

Настройка параметров безопасности Windows / Internet Explorer

В случаях, когда код написан верно, но 1С выдает ошибку отсутствия метода при работе через движок Internet Explorer, необходимо проверить настройки браузера в системе:

  1. Откройте Панель управления -> Свойства браузера (или inetcpl.cpl через окно «Выполнить»).
  2. Перейдите на вкладку Безопасность.
  3. Выберите зону Надежные сайты или Локальная сеть (в зависимости от источника загружаемого контента).
  4. Нажмите кнопку Другой... (Custom level).
  5. Убедитесь, что разрешены параметры:
    • Активные сценарии (Active scripting) — Включить.
    • Выполнение сценариев приложений встроенных ActiveX — Включить.
  6. Сохраните изменения и перезапустите 1С:Предприятие.

Особенности работы в современных версиях платформы 1С

Важно учитывать технологические изменения платформы 1С:Предприятие:

  1. Смена браузерного движка: Начиная с версии 8.3.14 платформа перешла с компонента Internet Explorer на движок Chromium (WebKit). Прямое обращение через COM-объект parentWindow на новых версиях не поддерживается или может вести себя нестабильно.
  2. Передача сложных данных: Вместо прямой передачи объектов 1С (таких как Структура или Массив) рекомендуется сериализовать данные в формат JSON на стороне 1С (с помощью ЗаписатьJSON) и передавать строку в JS, где выполнять JSON.parse().
  3. Альтернативные способы вызова в новых версиях: Для передачи данных из 1С в JavaScript на новых версиях платформы часто применяют динамическое внедрение тега <script> через Документ.createElement("script") или отслеживание изменений атрибутов элементов через MutationObserver. Для обратной передачи данных из JS в 1С используется переход по спец-ссылкам (например, window.location.href = "1c:myEvent?data=" + encodeURIComponent(data)), который обрабатывается событием поля ПриОкончанииПерехода.
← На главную