Почему не работает JavaScript в HTML-поле 1С и как это исправить

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

При работе с управляемыми формами в «1С:Предприятие» программисты часто сталкиваются с необходимостью интеграции веб-технологий. Однако, начиная с версии платформы 8.3.14 и особенно в 8.3.20+, механизмы взаимодействия 1С с HTML-полем претерпели значительные изменения. Это связано с переходом со старого движка Internet Explorer (Trident) на современный Chromium (в Windows) и WebKit (в других ОС). Рассмотрим подробнее, почему ваши скрипты могут не запускаться и как заставить их реагировать на действия пользователя.

Анализируем смену движка: от IE к Chromium

Первое, что мы должны проанализировать, — это текущая версия платформы. В старых версиях 1С HTML-поле базировалось на компонентах Internet Explorer. Это позволяло использовать специфические объекты вроде window.external для прямой связи с кодом 1С. В современных версиях (например, 8.3.20.1914, как у автора вопроса) используется встроенный движок на базе Chromium.

Проанализируем ситуацию: если ваш скрипт написан с расчетом на старые стандарты или вы пытаетесь обратиться к Документ.parentWindow, он гарантированно не будет работать. В новом движке для доступа к глобальному контексту используется defaultView. Однако и здесь есть нюанс: если вызвать скрипт слишком рано, объект еще не будет инициализирован.

Обеспечиваем правильную инициализацию скрипта

Часто проблема «скрипт не работает при открытии» связана с тем, что код 1С пытается выполнить JS-команду в тот момент, когда DOM-дерево страницы еще не построено, а движок Chromium не инициализировал контекст выполнения. Разберем по шагам, как гарантировать выполнение кода:

  1. Используйте событие «ПриЗавершенииПерехода»: Не пытайтесь запускать скрипты в процедуре ПриОткрытии или сразу после УстановитьТекст(). Дождитесь, пока платформа сообщит, что страница полностью загружена.
  2. Проверка через Alert: Чтобы быстро выяснить, работает ли скрипт в принципе, вставьте простую команду alert('Test');. В современных версиях 1С это вызовет модальное окно, подтверждающее активность движка.
  3. Использование таймеров: Как было отмечено в обсуждении, иногда требуется небольшая задержка для завершения внутренних процессов отрисовки.

Посмотрим на пример правильной организации очистки полей через таймер в JavaScript:


function clearInputValue() {
    let inputs = document.getElementsByTagName('input');
    for (let input of inputs) {
        input.value = '';
    }
}

// Запуск очистки через 7 секунд после вызова функции
setTimeout(clearInputValue, 7000);

Решаем проблему обработки клавиши Enter

Ситуация, когда «HTML-поле не знает, как реагировать на Enter», типична для 1С. Платформа стремится перехватить нажатие этой клавиши, чтобы активировать «Кнопку по умолчанию» на форме. Чтобы ваш скрипт внутри HTML-поля мог обработать нажатие Enter (например, для запуска поиска по веб-сервису), необходимо реализовать перехват события и предотвратить его дальнейшее распространение в оболочку 1С.

Рассмотрим пример кода на стороне JS, который нужно добавить в ваш HTML-документ:


document.addEventListener('keydown', function(event) {
    if (event.key === 'Enter') {
        // Останавливаем передачу события платформе 1С
        event.preventDefault();
        event.stopPropagation();
        
        // Выполняем вашу логику поиска
        runSearchService();
    }
});

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

Взаимодействие с веб-сервисами и политика CORS

Если ваш скрипт (как в сообщении 3) обращается к внешнему веб-сервису для получения данных, вы можете столкнуться с блокировкой запроса. Современные движки строго соблюдают политику Same-Origin Policy. Если вы загрузили текст HTML программно через УстановитьТекст(), у страницы нет «происхождения» (origin), и браузер может заблокировать fetch или XMLHttpRequest к внешнему домену.

Выясним причину возможной неудачи. Проанализируем консоль ошибок. Но как это сделать в 1С? В новых версиях платформы реализован механизм отладки:

Используйте метод ПоказатьИнструментыРазработчика() для объекта HTML-поля. Это откроет знакомую веб-разработчикам консоль (DevTools), где во вкладке Console вы увидите все ошибки JavaScript и отказы в доступе к сетевым ресурсам.


// Код на стороне 1С для вызова отладчика
Элементы.ПолеHTML.ПоказатьИнструментыРазработчика();

Передача данных между JS и 1С

Когда данные от веб-сервиса получены и обработаны в JS, их нужно вернуть в переменные 1С. Поскольку старые методы взаимодействия могут быть ограничены, рекомендуется использовать событие ПриНажатии в 1С. Для этого в JS можно программно имитировать клик по ссылке с определенным href или изменять window.location.

Разберем пример передачи данных через изменение URL:


// JS-код: отправляем данные в 1С
function sendTo1C(data) {
    window.location.href = "v8action://search_result?value=" + encodeURIComponent(data);
}

На стороне 1С в обработчике события ПриНажатии (или аналогичных событиях навигации) вы сможете перехватить этот адрес, разобрать параметры и записать их в реквизиты формы. Не забудьте установить параметр СтандартнаяОбработка = Ложь, чтобы платформа не пыталась реально перейти по этому адресу.

Резюме по решению проблемы

Подведем итоги нашего анализа. Если ваш скрипт в HTML-поле 1С 8.3.20 не работает:

  1. Проверьте, не используете ли вы устаревшие методы доступа к DOM, специфичные для Internet Explorer. Переходите на стандарты DOM Level 3.
  2. Убедитесь, что обращение к defaultView происходит после полной загрузки документа (событие ПриЗавершенииПерехода).
  3. Для обработки клавиш (Enter) обязательно используйте event.preventDefault(), чтобы изолировать событие от горячих клавиш самой формы 1С.
  4. Используйте встроенные инструменты разработчика (DevTools) для поиска синтаксических ошибок в вашем JS-коде.
  5. Для выполнения отложенных действий (очистка полей) применяйте setTimeout, но помните, что при потере фокуса формой таймеры в Chromium могут замедляться.

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

← На главную