Почему в 1С блокируется JavaScript на страницах и как восстановить работу интерактивных планов зданий?

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

При разработке сложных интерфейсов в 1С, таких как интерактивные карты или поэтажные планы зданий, программисты часто используют Поле HTML-документа. Однако после перехода платформы на современный движок WebKit (Chromium) многие решения, стабильно работавшие годами, начали выдавать ошибку Метод объекта не обнаружен. В этой статье мы подробно разберем, почему 1С перестает видеть функции JavaScript, как на это влияет политика безопасности и какими инструментами можно восстановить работоспособность системы.

Выясняем причину: переход с Internet Explorer на WebKit

Раньше 1С использовала движок MSHTML (Internet Explorer), который был крайне снисходителен к синтаксическим ошибкам и особенностям объявления переменных. С переходом на WebKit (начиная с версий платформы 8.3.14+) правила игры изменились. Современный движок Chromium гораздо строже относится к безопасности и стандартам кодирования. Если ваш интерактивный план перестал работать после редактирования файла, скорее всего, произошло одно из следующих событий: либо скрипт не загрузился из-за политики CORS, либо функция не попала в глобальную область видимости window.

Анализируем ошибку «Метод объекта не обнаружен»

Когда мы пытаемся вызвать JS-функцию из кода 1С, мы обычно обращаемся к объекту defaultView, который представляет собой глобальное окно браузера. Рассмотрим типичный пример вызова, который может приводить к ошибке:


&НаКлиенте
Процедура ВызватьПоискНаПлане()
    ДокументСтраница = Элементы.СтраницаПоэтажногоПлана.Документ;
    ОкноБраузера = ДокументСтраница.defaultView;
    // Ошибка происходит здесь, если функция не найдена в window
    ОкноБраузера.searchOnPlan(); 
КонецПроцедуры

Если 1С сообщает, что метод не обнаружен, это означает, что объект ОкноБраузера не содержит свойства searchOnPlan. Проанализируем ситуацию: почему функция может «исчезнуть»? В современном JavaScript использование ключевых слов let или const для объявления функций внутри скрипта не создает привязки к глобальному объекту window. Чтобы функция была доступна для 1С, она должна быть объявлена через var или явно назначена объекту window.

Разбираем по шагам: исправление области видимости (Scope)

Посмотрим на пример кода внутри HTML-файла. Если ваш программист изменил объявление функции на современный лад, это могло стать причиной поломки:


// ТАК РАБОТАТЬ НЕ БУДЕТ для вызова из 1С:
const searchOnPlan = function() { ... };

// ТАК БУДЕТ РАБОТАТЬ:
function searchOnPlan() { ... }
// или явно:
window.searchOnPlan = function() { ... };

Важный момент: если в JS-коде до объявления функции допущена синтаксическая ошибка, движок WebKit может прекратить выполнение всего блока script, и функция просто не будет зарегистрирована.

Используем инструменты отладки (DevTools)

Выясним истинную причину блокировки или ошибки с помощью встроенного отладчика. В платформе 1С для Поля HTML-документа можно вызвать инструменты разработчика Chromium. Для этого выделите поле мышкой и нажмите комбинацию клавиш Ctrl + Alt + Shift + F12.

В открывшемся окне нас интересуют две вкладки:

  1. Console: здесь будут отображены все ошибки выполнения JavaScript. Если вы видите красные сообщения ReferenceError или Security Error, значит, движок заблокировал выполнение скрипта.
  2. Network: здесь можно проверить, загрузился ли ваш файл этажа и все связанные с ним ресурсы (картинки, внешние скрипты). Если статус файла отличается от 200 (OK), возможно, путь к файлу стал неверным после правок.

Проверяем влияние политики безопасности и CORS

Современные браузеры ограничивают доступ к локальным файлам (протокол file://). Если ваша страница пытается подгрузить данные из соседнего файла через XMLHttpRequest или fetch, WebKit может это заблокировать. Рассмотрим решение: старайтесь упаковывать все необходимые данные (координаты помещений, скрипты) внутрь одного HTML-файла или используйте механизм Макетов в 1С.

Также проанализируем ситуацию с кодировкой. WebKit чувствителен к наличию метки BOM (Byte Order Mark) в файлах UTF-8. Если вы сохранили HTML-план в обычном Блокноте с кодировкой UTF-8 с BOM, 1С может некорректно интерпретировать начало файла, что приведет к сбою инициализации скриптов.

Синхронизация загрузки: ДокументСформирован

Часто проблема кроется в таймингах. Мы пытаемся вызвать searchOnPlan() в тот момент, когда DOM-дерево уже создано, но скрипты еще не проинициализированы. Разберем правильный подход к инициализации взаимодействия:

  1. Вместо того чтобы 1С «дергала» JS, пусть JS сам сообщит 1С о готовности.
  2. Используйте событие window.external.event для передачи сигнала в 1С.

Пример кода на стороне HTML:


window.onload = function() {
    // Сообщаем 1С, что страница готова
    window.external.event('PageLoaded', 'Ready');
};

В 1С мы перехватываем это событие в обработчике ПриНажатии (или специализированном событии расширения):


&НаКлиенте
Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    Если ДанныеСобытия.Event = "PageLoaded" Тогда
        // Теперь мы точно знаем, что JS-функции доступны
        Элемент.Документ.defaultView.searchOnPlan();
    КонецЕсли;
КонецПроцедуры

Практические советы по работе с кэшем и временными файлами

Проанализируем еще одну скрытую проблему: 1С часто кэширует содержимое HTML-полей во временных папках пользователя. Если вы изменили файл плана, но в оболочке 1С он не обновился (или работает некорректно только на одном компьютере), выполните следующие действия:

Подводя итог, можно утверждать: никакой магической «политики безопасности 1С», которую нельзя настроить, не существует. Все ограничения накладываются движком Chromium. Используя DevTools и соблюдая правила объявления глобальных функций, мы можем создавать надежные и быстрые интерактивные интерфейсы прямо внутри типовых конфигураций, таких как Бухгалтерия предприятия 3.0.

← На главную