При интеграции современных инструментов разработки, таких как Monaco Editor (движок, на котором построен VS Code), в экосистему 1С, разработчики часто сталкиваются с проблемами производительности. Особенно остро это проявляется в обычных формах, где нагрузка на одно ядро процессора может достигать 100% сразу после закрытия стандартной панели поиска. В этой статье мы подробно разберем, почему это происходит, как движки отображения влияют на работу скриптов и какие шаги необходимо предпринять для стабилизации системы.
Для начала проанализируем фундаментальную разницу в работе 1С с HTML-контентом. В управляемых формах платформа (начиная с версии 8.3.14) использует современный движок WebKit/Chromium, который отлично справляется с тяжелыми JavaScript-библиотеками. Однако в обычных формах поле HTML-документа всегда инициализируется через системный компонент Internet Explorer (движок MSHTML).
Выясним причину конфликта: Monaco Editor, начиная с версии 0.20.0, ориентирован на современные стандарты. В среде MSHTML механизм requestAnimationFrame, отвечающий за отрисовку интерфейса, может некорректно обрабатывать скрытые элементы. Когда мы закрываем панель поиска, скрипт редактора может войти в бесконечный цикл пересчета координат или анимации, который IE11 продолжает выполнять даже для невидимого объекта.
Одной из скрытых причин низкой производительности является то, что по умолчанию процесс 1cv8.exe может запускать поле HTML в режиме совместимости с IE7. Это фатально для Monaco Editor. Разберем по шагам, как принудительно включить режим IE11 для платформы 1С:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION.DWORD (32 бита) с именем 1cv8.exe.11001 (в десятичной системе) или 2AF9 (в шестнадцатеричной).Это заставит движок MSHTML использовать стандарты IE11, что значительно снизит накладные расходы на выполнение JavaScript.
Проанализируем ситуацию с панелью поиска. В старых версиях адаптации 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), []);
Серьезная проблема обычных форм — невозможность вызвать консоль отладки по 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С, содержит ряд известных утечек памяти в виджете поиска. Попробуем рассмотреть варианты стабилизации:
0.21.x или 0.23.0. В них исправлены многие проблемы с производительностью в IE11.display: none, а не просто opacity: 0. Это заставит IE полностью исключить блок из цикла перерисовки.Подводя итог, можно сказать, что основная нагрузка вызвана «зависанием» обработчиков событий в устаревшем движке MSHTML. Комбинация настройки реестра, принудительного возврата фокуса в JavaScript и очистки декораций позволяет снизить нагрузку на процессор до нормальных значений даже в условиях работы в обычном приложении 1С.