Почему HTML-редактор Monaco грузит процессор в обычных формах 1С и как это исправить?

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

При интеграции современных инструментов разработки, таких как Monaco Editor (движок, на котором построен VS Code), в экосистему 1С, разработчики часто сталкиваются с проблемами производительности. Особенно остро это проявляется в обычных формах, где нагрузка на одно ядро процессора может достигать 100% сразу после закрытия стандартной панели поиска. В этой статье мы подробно разберем, почему это происходит, как движки отображения влияют на работу скриптов и какие шаги необходимо предпринять для стабилизации системы.

Причина 1: Различие движков отображения (MSHTML vs Chromium)

Для начала проанализируем фундаментальную разницу в работе 1С с HTML-контентом. В управляемых формах платформа (начиная с версии 8.3.14) использует современный движок WebKit/Chromium, который отлично справляется с тяжелыми JavaScript-библиотеками. Однако в обычных формах поле HTML-документа всегда инициализируется через системный компонент Internet Explorer (движок MSHTML).

Выясним причину конфликта: Monaco Editor, начиная с версии 0.20.0, ориентирован на современные стандарты. В среде MSHTML механизм requestAnimationFrame, отвечающий за отрисовку интерфейса, может некорректно обрабатывать скрытые элементы. Когда мы закрываем панель поиска, скрипт редактора может войти в бесконечный цикл пересчета координат или анимации, который IE11 продолжает выполнять даже для невидимого объекта.

Причина 2: Настройка эмуляции браузера в реестре

Одной из скрытых причин низкой производительности является то, что по умолчанию процесс 1cv8.exe может запускать поле HTML в режиме совместимости с IE7. Это фатально для Monaco Editor. Разберем по шагам, как принудительно включить режим IE11 для платформы 1С:

  1. Откроем редактор реестра (regedit).
  2. Перейдем в ветку HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION.
  3. Создадим новый параметр DWORD (32 бита) с именем 1cv8.exe.
  4. Установим значение 11001 (в десятичной системе) или 2AF9 (в шестнадцатеричной).

Это заставит движок MSHTML использовать стандарты IE11, что значительно снизит накладные расходы на выполнение JavaScript.

Причина 3: Ошибка фокуса и «зацикливание» поиска

Проанализируем ситуацию с панелью поиска. В старых версиях адаптации Monaco (например, 0.20.0) существует проблема: при закрытии виджета поиска фокус не возвращается в основную область редактора корректно. В условиях обычного приложения 1С, которое жестко перехватывает события клавиатуры, событие onBlur или onHide может просто не дойти до JavaScript-контроллера.

В результате поисковый движок внутри Monaco продолжает считать, что пользователь активно взаимодействует с результатами поиска, и постоянно обновляет «декорации» (подсветку найденных слов). Рассмотрим пример кода, который необходимо внедрить в JavaScript-часть вашей интеграции для принудительной очистки ресурсов при закрытии поиска:


// Принудительное закрытие виджета поиска и очистка фокуса
editor.trigger('keyboard', 'closeFindWidget');
// Возвращаем фокус программно, чтобы остановить фоновые процессы поиска
editor.focus();
// Очищаем все декорации (подсветку текста), если они зависли
var decorations = editor.getModel().getAllDecorations();
editor.deltaDecorations(decorations.map(d => d.id), []);

Методы отладки в условиях отсутствия DevTools

Серьезная проблема обычных форм — невозможность вызвать консоль отладки по CTRL+SHIFT+ALT+F12, так как эта комбинация работает только для WebKit. Выясним, как «отловить» ошибку в таких условиях:


window.onerror = function(message, source, lineno, colno, error) {
    // Передаем сообщение об ошибке обратно в 1С через изменение заголовка или URL
    window.location.hash = "error:" + message + " at " + lineno;
    return true;
};

Рекомендации по обновлению и оптимизации

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

  1. Обновление версии: Если ваша конфигурация позволяет использовать ESM-модули (или вы используете сборку через Webpack), обновите Monaco до версии 0.21.x или 0.23.0. В них исправлены многие проблемы с производительностью в IE11.
  2. Отключение аппаратного ускорения: В некоторых случаях движок IE конфликтует с драйверами видеокарты при отрисовке прозрачных слоев (каким является панель поиска). Попробуйте отключить аппаратное ускорение в свойствах обозревателя Windows (вкладка «Дополнительно» -> «Использовать программную отрисовку вместо графического процессора»).
  3. CSS-оптимизация: Иногда помогает принудительное скрытие контейнера через CSS. Если панель поиска закрыта, убедитесь, что её родительский контейнер получил display: none, а не просто opacity: 0. Это заставит IE полностью исключить блок из цикла перерисовки.

Подводя итог, можно сказать, что основная нагрузка вызвана «зависанием» обработчиков событий в устаревшем движке MSHTML. Комбинация настройки реестра, принудительного возврата фокуса в JavaScript и очистки декораций позволяет снизить нагрузку на процессор до нормальных значений даже в условиях работы в обычном приложении 1С.

← На главную