Почему в 1С отображается белое окно вместо Яндекс Карт и как это исправить?

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

В процессе разработки интеграций с внешними картографическими сервисами программисты 1С часто сталкиваются с ситуацией, когда привычная обработка с Яндекс Картами внезапно перестает работать. Помимо Яндекса, часто требуется и интеграция 1С и 2ГИС для вывода маркеров по координатам. Вместо ожидаемой карты в поле HTML-документа отображается абсолютно белое окно, хотя элементы управления, написанные на JavaScript, могут продолжать функционировать. Разберем детально, почему это происходит и как вернуть работоспособность вашим картам.

Выясняем первопричину с помощью инструментов отладки

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

В открывшемся окне перейдем на вкладку Console. Если мы видим ошибку SecurityError: The operation is insecure, это верный признак того, что механизмы безопасности браузера блокируют выполнение скриптов. Чаще всего это происходит при попытке скрипта обратиться к localStorage или IndexedDB. Разберемся, почему это становится проблемой именно в 1С.

Решение 1: Изменение способа загрузки HTML-контента

Рассмотрим ситуацию: когда мы используем метод УстановитьТекст() для заполнения поля HTML-документа, браузер воспринимает эту страницу как документ с «пустым» источником (Origin: null). По правилам безопасности современных движков Chromium, доступ к локальному хранилищу (localStorage) для таких страниц запрещен. Подобные ограничения часто приходится обходить, когда создается универсальный ввод на WEB клиенте с использованием возможностей поля HTML-документа.

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

  1. Сформируем текст HTML-страницы со всеми необходимыми скриптами Яндекс Карт.
  2. Сохраним этот текст во временный файл во временном каталоге пользователя.
  3. Используем метод Перейти() поля HTML-документа, указав путь к файлу.

Посмотрим на пример кода, реализующего этот подход:


ПутьКФайлу = КаталогВременныхФайлов() + "yandex_maps_page.html";
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстHTML);
ТекстовыйДокумент.Записать(ПутьКФайлу, КодировкаТекста.UTF8);

Элементы.КартаПолеHTML.Перейти("file:///" + СтрЗаменить(ПутьКФайлу, "\", "/"));

Этот метод позволяет браузеру определить источник страницы через протокол file://, что во многих случаях снимает часть ограничений безопасности.

Решение 2: Отключение аппаратного ускорения (GPU)

Иногда «белое окно» является следствием не программной ошибки в JS, а конфликта между движком рендеринга Chromium и драйверами видеокарты. Особенно часто это встречается на платформе 8.3.27 и выше. Выясним, является ли это причиной в нашем случае.

Для проверки попробуем запустить тонкий клиент 1С с параметром командной строки /DisableGPUAcceleration. Если после запуска с этим ключом карта отобразилась корректно, значит, проблема в отрисовке аппаратным ускорением. В этом случае рекомендуется обновить драйверы видеокарты или оставить данный ключ в параметрах запуска ярлыка для проблемных рабочих станций.

Решение 3: Проверка настроек прокси-сервера и сети

Проанализируем ситуацию, когда JS-панель загружается, а сами тайлы (фрагменты карты) — нет. Встроенный браузер 1С использует системные настройки прокси-сервера, но иногда может игнорировать их.

Проверим вкладку Network в консоли (Ctrl+Shift+Alt+F12). Если мы видим запросы к доменам maps.yandex.net со статусом Pending или 403 Forbidden, выполним следующие действия:

Решение 4: Адаптация кода JavaScript под ограничения 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 Яндекс Карт

Напоследок важно проверить версию 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-библиотек.

← На главную