Начиная с версии платформы 1С:Предприятие 8.3.14 разработчики столкнулись с существенным изменением: движок Internet Explorer (IE), который ранее отвечал за рендеринг поля HTML-документа, был заменен на современный WebKit. Это привело к тому, что привычные методы передачи данных между 1С и JavaScript перестали работать. Проанализируем эту ситуацию и разберем новые способы взаимодействия.
Раньше, при использовании движка IE, 1С позволяла напрямую передавать в JavaScript COM-объекты, в том числе сам объект формы (ЭтаФорма). Скрипты через COM-модель получали доступ к контексту 1С. После перехода на WebKit поддержка технологий COM, OLE и ActiveX внутри HTML-поля полностью исчезла. Теперь при попытке передать объект в JS разработчик видит лишь undefined.
Тем не менее, этот переход принес и большие плюсы: теперь в 1С можно полноценно использовать современный стандарт JavaScript (ES6+), включая стрелочные функции, классы и асинхронность.
Так как передавать сложные объекты напрямую больше нельзя, рассмотрим новый стандарт взаимодействия. Теперь из 1С в JS можно передавать только примитивные типы данных: строки, числа, даты. Если нужно передать массив или сложную структуру, используем JSON.
Для вызова функции внутри WebKit из 1С обращаемся к контексту окна через defaultView:
// Пример вызова JS-функции из 1С
СтрокаJSON = "{""Ключ"": ""Значение""}";
Элементы.ПолеHTMLДокумента.Документ.defaultView.MyJSFunction(СтрокаJSON);
А в самом JavaScript-коде обрабатываем эти данные:
function MyJSFunction(jsonData) {
let data = JSON.parse(jsonData);
console.log(data.Ключ); // Выведет "Значение"
}
Если вам нужно передать данные обратно из JavaScript в 1С, выясним, как это сделать с помощью стандартных событий формы. Самый надежный способ, работающий в WebKit — генерация программного клика по скрытому элементу DOM.
Посмотрим на пример реализации. Сначала подготовим HTML-разметку с элементом, в который мы будем записывать данные (например, через data-атрибуты):
Затем в JavaScript программно имитируем нажатие на этот элемент:
// Записываем данные в атрибут и кликаем
var testEl = document.getElementById('testEl');
testEl.setAttribute('data-testdata', 'Новые данные для 1С');
testEl.click();
В модуле формы 1С перехватываем это действие в обработчике события ПриНажатии для поля HTML-документа. Параметр ДанныеСобытия будет содержать информацию об элементе, по которому был совершен клик, включая его атрибуты:
&НаКлиенте
Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Если ДанныеСобытия.Element.id = "testEl" Тогда
СтандартнаяОбработка = Ложь; // Отменяем стандартное поведение браузера
// Получаем переданные данные
ПолученнаяСтрока = ДанныеСобытия.Element.getAttribute("data-testdata");
Сообщить("Получены данные из JS: " + ПолученнаяСтрока);
КонецЕсли;
КонецПроцедуры
Важное примечание: Если ваш JS-код выполняется слишком быстро, 1С может не успеть перехватить событие (событие "проглатывается"). В таких случаях используйте небольшую задержку с помощью setTimeout или асинхронные функции async/await перед вызовом метода click().
Если проект требует интенсивного и сложного двустороннего обмена данными, метод с кликами может оказаться неудобным. Рассмотрим более продвинутый архитектурный подход.
Современный WebKit поддерживает встроенный API fetch. Вы можете поднять на стороне 1С собственные HTTP-сервисы. В этом случае скрипт внутри HTML-документа будет делать асинхронные запросы напрямую к базе 1С, передавая или запрашивая нужный JSON. Это позволяет организовать стабильное взаимодействие клиентской и серверной частей без эмуляции пользовательских действий.
Применяйте описанные подходы в зависимости от сложности вашей задачи: используйте сериализацию и клики для простых интеграций в интерфейс, и HTTP-запросы для сложных веб-приложений внутри 1С.