В процессе разработки интеграций с внешними картографическими сервисами программисты 1С часто сталкиваются с ситуацией, когда привычная обработка с Яндекс Картами внезапно перестает работать. Помимо Яндекса, часто требуется и интеграция 1С и 2ГИС для вывода маркеров по координатам. Вместо ожидаемой карты в поле HTML-документа отображается абсолютно белое окно, хотя элементы управления, написанные на JavaScript, могут продолжать функционировать. Разберем детально, почему это происходит и как вернуть работоспособность вашим картам.
Первым делом нам необходимо понять, что именно происходит внутри встроенного браузера 1С. Начиная с современных версий платформы (8.3.14 и выше), 1С использует движок на базе Chromium. Проанализируем состояние страницы с помощью встроенной консоли разработчика. Для этого в тонком клиенте нажмем комбинацию клавиш Ctrl + Shift + Alt + F12.
В открывшемся окне перейдем на вкладку Console. Если мы видим ошибку SecurityError: The operation is insecure, это верный признак того, что механизмы безопасности браузера блокируют выполнение скриптов. Чаще всего это происходит при попытке скрипта обратиться к localStorage или IndexedDB. Разберемся, почему это становится проблемой именно в 1С.
Рассмотрим ситуацию: когда мы используем метод УстановитьТекст() для заполнения поля HTML-документа, браузер воспринимает эту страницу как документ с «пустым» источником (Origin: null). По правилам безопасности современных движков Chromium, доступ к локальному хранилищу (localStorage) для таких страниц запрещен. Подобные ограничения часто приходится обходить, когда создается универсальный ввод на WEB клиенте с использованием возможностей поля HTML-документа.
Чтобы решить эту проблему, нам нужно предоставить странице корректный контекст безопасности. Попробуем вместо передачи текста напрямую сохранить HTML во временный файл и открыть его. Проанализируем следующий алгоритм действий:
Перейти() поля HTML-документа, указав путь к файлу.Посмотрим на пример кода, реализующего этот подход:
ПутьКФайлу = КаталогВременныхФайлов() + "yandex_maps_page.html";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстHTML);
ТекстовыйДокумент.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
Элементы.КартаПолеHTML.Перейти("file:///" + СтрЗаменить(ПутьКФайлу, "\", "/"));
Этот метод позволяет браузеру определить источник страницы через протокол file://, что во многих случаях снимает часть ограничений безопасности.
Иногда «белое окно» является следствием не программной ошибки в JS, а конфликта между движком рендеринга Chromium и драйверами видеокарты. Особенно часто это встречается на платформе 8.3.27 и выше. Выясним, является ли это причиной в нашем случае.
Для проверки попробуем запустить тонкий клиент 1С с параметром командной строки /DisableGPUAcceleration. Если после запуска с этим ключом карта отобразилась корректно, значит, проблема в отрисовке аппаратным ускорением. В этом случае рекомендуется обновить драйверы видеокарты или оставить данный ключ в параметрах запуска ярлыка для проблемных рабочих станций.
Проанализируем ситуацию, когда JS-панель загружается, а сами тайлы (фрагменты карты) — нет. Встроенный браузер 1С использует системные настройки прокси-сервера, но иногда может игнорировать их.
Проверим вкладку Network в консоли (Ctrl+Shift+Alt+F12). Если мы видим запросы к доменам maps.yandex.net со статусом Pending или 403 Forbidden, выполним следующие действия:
inetcfg.xml в каталоге conf платформы 1С. Если там жестко прописан прокси, который не умеет работать с современными протоколами Яндекс Карт, его стоит временно отключить для теста.Если ошибка The operation is insecure сохраняется, нам придется модифицировать сам JavaScript-код, который мы внедряем в карту. Поскольку 1С ограничивает доступ к localStorage, мы можем заменить хранение истории или настроек во встроенном браузере на хранение данных в самой базе 1С.
Вместо использования localStorage.setItem(), мы будем передавать данные в 1С через механизм внешних событий. Разберем по шагам, как это реализовать:
В JavaScript заменим обращение к хранилищу на вызов функции 1С:
// Вместо localStorage.setItem('route', data);
window.external.ExternalEvent('YandexMap', 'SaveRoute', JSON.stringify(data));
В модуле формы 1С обработаем это событие:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "YandexMap" И Событие = "SaveRoute" Тогда
// Сохраняем данные в реквизит формы или константу
СохраненныйМаршрут = Данные;
КонецЕсли;
КонецПроцедуры
При повторном открытии карты мы просто пробросим эти данные обратно в HTML через метод Документ.parentWindow.ВыполнитьФункцию() или аналогичные механизмы взаимодействия.
Напоследок важно проверить версию API Яндекса. Версия 3.0 требует поддержки современных стандартов ES6. Если ваша конфигурация находится в режиме совместимости с очень старыми версиями (например, 8.3.10), платформа может ограничивать возможности движка Chromium.
Убедитесь, что в заголовках вашего HTML-документа прописан актуальный doctype:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
...
Использование тега IE=edge заставляет встроенный компонент использовать максимально доступный режим рендеринга, что часто исправляет проблемы с инициализацией современных JS-библиотек.