Как настроить взаимодействие 1С и JavaScript в поле HTML-документа после перехода на WebKit (8.3.14)?

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

Начиная с версии платформы 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: Использование простых типов и JSON-сериализации

Так как передавать сложные объекты напрямую больше нельзя, рассмотрим новый стандарт взаимодействия. Теперь из 1С в JS можно передавать только примитивные типы данных: строки, числа, даты. Если нужно передать массив или сложную структуру, используем JSON.

  1. На стороне 1С сериализуем структуру или массив в строку формата JSON.
  2. Передаем эту строку в JavaScript-функцию.
  3. На стороне JS используем встроенный метод для парсинга.

Для вызова функции внутри WebKit из 1С обращаемся к контексту окна через defaultView:


// Пример вызова JS-функции из 1С
СтрокаJSON = "{""Ключ"": ""Значение""}";
Элементы.ПолеHTMLДокумента.Документ.defaultView.MyJSFunction(СтрокаJSON);

А в самом JavaScript-коде обрабатываем эти данные:


function MyJSFunction(jsonData) {
    let data = JSON.parse(jsonData);
    console.log(data.Ключ); // Выведет "Значение"
}

Решение 2: Передача данных из JavaScript в 1С через программный клик

Если вам нужно передать данные обратно из 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().

Решение 3: Альтернативные методы связи (HTTP-сервисы)

Если проект требует интенсивного и сложного двустороннего обмена данными, метод с кликами может оказаться неудобным. Рассмотрим более продвинутый архитектурный подход.

Современный WebKit поддерживает встроенный API fetch. Вы можете поднять на стороне 1С собственные HTTP-сервисы. В этом случае скрипт внутри HTML-документа будет делать асинхронные запросы напрямую к базе 1С, передавая или запрашивая нужный JSON. Это позволяет организовать стабильное взаимодействие клиентской и серверной частей без эмуляции пользовательских действий.

Применяйте описанные подходы в зависимости от сложности вашей задачи: используйте сериализацию и клики для простых интеграций в интерфейс, и HTTP-запросы для сложных веб-приложений внутри 1С.

← На главную