При работе с управляемыми формами в «1С:Предприятие» программисты часто сталкиваются с необходимостью интеграции веб-технологий. Однако, начиная с версии платформы 8.3.14 и особенно в 8.3.20+, механизмы взаимодействия 1С с HTML-полем претерпели значительные изменения. Это связано с переходом со старого движка Internet Explorer (Trident) на современный Chromium (в Windows) и WebKit (в других ОС). Рассмотрим подробнее, почему ваши скрипты могут не запускаться и как заставить их реагировать на действия пользователя.
Первое, что мы должны проанализировать, — это текущая версия платформы. В старых версиях 1С HTML-поле базировалось на компонентах Internet Explorer. Это позволяло использовать специфические объекты вроде window.external для прямой связи с кодом 1С. В современных версиях (например, 8.3.20.1914, как у автора вопроса) используется встроенный движок на базе Chromium.
Проанализируем ситуацию: если ваш скрипт написан с расчетом на старые стандарты или вы пытаетесь обратиться к Документ.parentWindow, он гарантированно не будет работать. В новом движке для доступа к глобальному контексту используется defaultView. Однако и здесь есть нюанс: если вызвать скрипт слишком рано, объект еще не будет инициализирован.
Часто проблема «скрипт не работает при открытии» связана с тем, что код 1С пытается выполнить JS-команду в тот момент, когда DOM-дерево страницы еще не построено, а движок Chromium не инициализировал контекст выполнения. Разберем по шагам, как гарантировать выполнение кода:
ПриОткрытии или сразу после УстановитьТекст(). Дождитесь, пока платформа сообщит, что страница полностью загружена.alert('Test');. В современных версиях 1С это вызовет модальное окно, подтверждающее активность движка.Посмотрим на пример правильной организации очистки полей через таймер в JavaScript:
function clearInputValue() {
let inputs = document.getElementsByTagName('input');
for (let input of inputs) {
input.value = '';
}
}
// Запуск очистки через 7 секунд после вызова функции
setTimeout(clearInputValue, 7000);
Ситуация, когда «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-событие не возникнет.
Если ваш скрипт (как в сообщении 3) обращается к внешнему веб-сервису для получения данных, вы можете столкнуться с блокировкой запроса. Современные движки строго соблюдают политику Same-Origin Policy. Если вы загрузили текст HTML программно через УстановитьТекст(), у страницы нет «происхождения» (origin), и браузер может заблокировать fetch или XMLHttpRequest к внешнему домену.
Выясним причину возможной неудачи. Проанализируем консоль ошибок. Но как это сделать в 1С? В новых версиях платформы реализован механизм отладки:
Используйте метод ПоказатьИнструментыРазработчика() для объекта HTML-поля. Это откроет знакомую веб-разработчикам консоль (DevTools), где во вкладке Console вы увидите все ошибки JavaScript и отказы в доступе к сетевым ресурсам.
// Код на стороне 1С для вызова отладчика
Элементы.ПолеHTML.ПоказатьИнструментыРазработчика();
Когда данные от веб-сервиса получены и обработаны в 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 не работает:
defaultView происходит после полной загрузки документа (событие ПриЗавершенииПерехода).event.preventDefault(), чтобы изолировать событие от горячих клавиш самой формы 1С.setTimeout, но помните, что при потере фокуса формой таймеры в Chromium могут замедляться.Следуя этим рекомендациям, вы сможете построить надежное взаимодействие между бизнес-логикой на языке 1С и динамическим интерфейсом на JavaScript.