Перевод клиентских приложений «1С:Предприятие» для Windows на использование движка WebKit (начиная с релиза платформы 8.3.14.1565) стал одним из самых ожидаемых и революционных изменений для разработчиков. До этого момента поле HTML-документа на операционной системе Windows базировалось на устаревшем движке MSHTML (Internet Explorer). Это накладывало жесткие ограничения на использование современных веб-стандартов, не позволяло полноценно задействовать библиотеки интерактивной визуализации и усложняло кроссплатформенную разработку.
В этой статье мы подробно разберем, почему переход на WebKit стал технологическим прорывом, как изменилась архитектура взаимодействия платформы и веб-страниц, с какими трудностями и ошибками можно столкнуться при миграции старого кода и как использовать новые инструменты для создания потрясающих интерактивных интерфейсов прямо внутри 1С.
При подготовке этого масштабного перехода разработчики фирмы «1С» детально анализировали альтернативные варианты, в частности — популярный движок Chromium (Blink). Однако выбор был сделан в пользу WebKit по ряду веских причин:
Самое важное изменение, которое напрямую затронуло существенные наработки программистов 1С, — это смена типов объектов при обращении к HTML-документу. Обратите внимание: если раньше свойство Документ у элемента формы ПолеHTMLДокумента на Windows возвращало стандартный COMОбъект библиотеки MSHTML, то теперь оно возвращает кроссплатформенный ВнешнийОбъект.
Давайте проанализируем, к чему это привело на практике. Весь старый код, который напрямую управлял свойствами Internet Explorer, перестал работать. Рассмотрим типичный пример кода, который часто использовался для динамического изменения содержимого страницы или включения режима редактирования:
// Старый нерабочий метод (вызывал ошибку после перехода на WebKit)
Документ = Элементы.ПолеБраузера.Document;
Документ.designMode = "On";
Документ.write(ТекстМакета);
Документ.designMode = "Off";
В новой парадигме прямое обращение к методам COM-объекта невозможно. Теперь для взаимодействия со страницей необходимо использовать штатные методы работы с объектной моделью документа (DOM) или выполнять JavaScript-код непосредственно внутри контекста страницы.
Чтобы выполнить произвольный JS-код или передать данные из 1С в WebKit, мы должны использовать метод ВыполнитьСкрипт(). Давайте посмотрим, как теперь выглядит правильная инициализация и передача данных:
&НаКлиенте
Процедура ИнициализироватьКарту(ТекстHTML)
// Устанавливаем текст HTML-документа напрямую в реквизит, связанный с полем
Объект.ПолеHTML = ТекстHTML;
КонецПроцедуры
&НаКлиенте
Процедура ПередатьДанныеВJS(ИмяФункции, ПараметрыЗапроса)
// Выполняем скрипт внутри контекста WebKit
ВыражениеJS = ИмяФункции + "(" + ПараметрыЗапроса + ");";
Элементы.ПолеHTML.ВыполнитьСкрипт(ВыражениеJS);
КонецПроцедуры
Отказ от Internet Explorer открыл разработчикам 1С доступ к передовым технологиям веб-разработки. Теперь внутри формы 1С можно без проблем запускать сложные реактивные интерфейсы на React или Vue.js, строить интерактивные трехмерные графики с помощью D3.js или выводить карты высокой четкости.
Выясним, как организовать архитектуру обмена данными между формой 1С и веб-страницей. Существует два основных подхода:
ПоляHTMLДокумента будет стандартным методом fetch() обращаться к этому адресу, получать актуальные данные и перерисовывать интерфейс (например, диаграмму Ганта или интерактивную карту склада) на лету без перезагрузки всей страницы.ПриНажатии или специализированными обработчиками событий поля.Рассмотрим пример реализации обмена. Мы можем передать массив данных из 1С в JS, предварительно преобразовав его в строку JSON:
&НаКлиенте
Процедура ОбновитьДиаграммуНаФорме()
ДанныеДляГрафика = ПолучитьДанныеДляВизуализации(); // Возвращает Массив Структур
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляГрафика);
СтрокаДанных = ЗаписьJSON.Закрыть();
// Вызываем JS-функцию обновления графика, передавая JSON-строку
Скрипт = "updateChart(" + СтрокаДанных + ");";
Элементы.ПолеHTMLДиаграммы.ВыполнитьСкрипт(Скрипт);
КонецПроцедуры
Одним из самых больших кошмаров разработчиков при работе со старым движком IE была отладка скриптов. Ошибки сценария часто приводили к неинформативным окнам предупреждений платформы, а найти место сбоя в JS-коде было практически невозможно.
С переходом на WebKit у нас появилась полноценная панель инструментов разработчика — WebInspector (аналог Chrome DevTools). Рассмотрим, как ей воспользоваться:
ПолеHTMLДокумента.Этот инструмент позволяет существенно сократить время на разработку сложных визуальных интерфейсов, позволяя ставить точки останова (breakpoints) прямо в коде JavaScript внутри 1С.
Несмотря на колоссальный прогресс, интеграция стороннего движка WebKit в платформу 1С принесла новые специфические проблемы, о которых важно знать каждому разработчику.
Многие разработчики столкнулись с неприятным эффектом при интеграции Яндекс.Карт или Google Maps: интерактивная карта отлично отрисовывается, реагирует на кнопки масштабирования и колесико мыши, но при этом ее невозможно передвигать (перетаскивать) зажатой левой кнопкой мыши. Карта ведет себя как статичная картинка.
Выясним причину этого поведения. Платформа 1С перехватывает системные события мыши для управления собственными элементами формы. При зажатии мыши на поле HTML-документа событие «перетаскивания» не транслируется корректно внутрь контейнера WebKit.
Решение проблемы: Для обхода этого ограничения необходимо явно инициализировать карту с поддержкой сенсорных событий или принудительно обрабатывать события мыши на уровне JavaScript самой страницы, переопределяя поведение по умолчанию (preventDefault) для событий mousedown, mousemove и mouseup, чтобы платформа не блокировала стандартное поведение браузера.
Если вы встраиваете в форму 1С сложные визуальные текстовые редакторы, работающие через элементы iframe, вы можете столкнуться с тем, что стандартные сочетания клавиш копирования и вставки (Ctrl+C / Ctrl+V) перестают работать внутри редактора.
Это связано с тем, что WebKit теряет фокус ввода 1С при переходе фокуса внутрь фрейма. Платформа считает, что активным остается другой элемент формы 1С, и перехватывает нажатия горячих клавиш. Чтобы решить эту проблему, рекомендуется перехватывать события нажатия клавиш непосредственно в JavaScript внутри фрейма и программно передавать текстовое содержимое в системный буфер обмена или генерировать соответствующие события фокуса для родительского окна.
В некоторых релизах платформы (особенно на ранних этапах внедрения WebKit) наблюдался баг, при котором внешние JS-файлы загружались без проблем, а вот внешние файлы стилей через тег <link rel="stylesheet" href="..."> полностью игнорировались движком.
Решение проблемы: Чтобы обойти этот баг и гарантировать корректное отображение интерфейса на любых релизах платформы, внедряйте CSS-стили непосредственно в тело HTML-документа с помощью тега <style> или динамически считывайте файлы стилей в 1С и передавайте их в виде текста страницы.
Подводя итог, сформулируем основные правила работы с новым движком WebKit в 1С:
Документ. Ваш код должен быть ориентирован на кроссплатформенный тип ВнешнийОбъект.ВыполнитьСкрипт().