При разработке сложных интерфейсов в 1С, таких как интерактивные карты или поэтажные планы зданий, программисты часто используют Поле HTML-документа. Однако после перехода платформы на современный движок WebKit (Chromium) многие решения, стабильно работавшие годами, начали выдавать ошибку Метод объекта не обнаружен. В этой статье мы подробно разберем, почему 1С перестает видеть функции JavaScript, как на это влияет политика безопасности и какими инструментами можно восстановить работоспособность системы.
Раньше 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.
Посмотрим на пример кода внутри HTML-файла. Если ваш программист изменил объявление функции на современный лад, это могло стать причиной поломки:
// ТАК РАБОТАТЬ НЕ БУДЕТ для вызова из 1С:
const searchOnPlan = function() { ... };
// ТАК БУДЕТ РАБОТАТЬ:
function searchOnPlan() { ... }
// или явно:
window.searchOnPlan = function() { ... };
Важный момент: если в JS-коде до объявления функции допущена синтаксическая ошибка, движок WebKit может прекратить выполнение всего блока script, и функция просто не будет зарегистрирована.
Выясним истинную причину блокировки или ошибки с помощью встроенного отладчика. В платформе 1С для Поля HTML-документа можно вызвать инструменты разработчика Chromium. Для этого выделите поле мышкой и нажмите комбинацию клавиш Ctrl + Alt + Shift + F12.
В открывшемся окне нас интересуют две вкладки:
ReferenceError или Security Error, значит, движок заблокировал выполнение скрипта.Современные браузеры ограничивают доступ к локальным файлам (протокол file://). Если ваша страница пытается подгрузить данные из соседнего файла через XMLHttpRequest или fetch, WebKit может это заблокировать. Рассмотрим решение: старайтесь упаковывать все необходимые данные (координаты помещений, скрипты) внутрь одного HTML-файла или используйте механизм Макетов в 1С.
Также проанализируем ситуацию с кодировкой. WebKit чувствителен к наличию метки BOM (Byte Order Mark) в файлах UTF-8. Если вы сохранили HTML-план в обычном Блокноте с кодировкой UTF-8 с BOM, 1С может некорректно интерпретировать начало файла, что приведет к сбою инициализации скриптов.
Часто проблема кроется в таймингах. Мы пытаемся вызвать searchOnPlan() в тот момент, когда DOM-дерево уже создано, но скрипты еще не проинициализированы. Разберем правильный подход к инициализации взаимодействия:
window.external.event для передачи сигнала в 1С.Пример кода на стороне HTML:
window.onload = function() {
// Сообщаем 1С, что страница готова
window.external.event('PageLoaded', 'Ready');
};
В 1С мы перехватываем это событие в обработчике ПриНажатии (или специализированном событии расширения):
&НаКлиенте
Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Если ДанныеСобытия.Event = "PageLoaded" Тогда
// Теперь мы точно знаем, что JS-функции доступны
Элемент.Документ.defaultView.searchOnPlan();
КонецЕсли;
КонецПроцедуры
Проанализируем еще одну скрытую проблему: 1С часто кэширует содержимое HTML-полей во временных папках пользователя. Если вы изменили файл плана, но в оболочке 1С он не обновился (или работает некорректно только на одном компьютере), выполните следующие действия:
%temp%).Подводя итог, можно утверждать: никакой магической «политики безопасности 1С», которую нельзя настроить, не существует. Все ограничения накладываются движком Chromium. Используя DevTools и соблюдая правила объявления глобальных функций, мы можем создавать надежные и быстрые интерактивные интерфейсы прямо внутри типовых конфигураций, таких как Бухгалтерия предприятия 3.0.