Интеграция картографических сервисов в среду 1С:Предприятие — это востребованная задача для логистических систем, сервисов доставки и CRM-решений. Однако при реализации стандартного примера из документации Яндекс Карт в поле HTML-документа 1С разработчики часто сталкиваются с критическими ошибками, такими как console — определение отсутствует, ymaps — определение отсутствует или Stack overflow at line 2. Рассмотрим подробно причины возникновения этих проблем и разберем по шагам современные способы их решения.
Основная причина нестабильной работы JavaScript в среде 1С заключается в том, что по умолчанию поле HTML-документа в тонком и толстом клиентах на Windows использует движок Internet Explorer. В зависимости от версии платформы и настроек системы, это может быть режим совместимости с крайне устаревшими версиями (IE7 или IE8), которые не поддерживают современные стандарты JS и объекты, необходимые для работы API Яндекс Карт.
Выясним, что означают конкретные ошибки:
console.log() для отладки. В старых версиях IE объект console не инициализирован, что приводит к прерыванию выполнения всего скрипта.ymaps.ready().Разберем, как должен выглядеть правильный код HTML-страницы для отображения карты. Во-первых, необходимо использовать актуальную версию API (на данный момент это 2.1). Во-вторых, крайне важно добавить «заглушку» для объекта console, чтобы избежать ошибок в старых движках.
Рассмотрим пример исправленного кода:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Принудительно используем последний доступный режим IE -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script type="text/javascript">
// Решаем проблему "console - определение отсутствует"
if (!window.console) console = {log: function() {}, error: function() {}};
</script>
<!-- Подключаем API 2.1 с вашим ключом (API-ключ теперь обязателен) -->
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=ВАШ_КЛЮЧ" type="text/javascript"></script>
<style>
html, body, #map {
width: 100%; height: 100%; padding: 0; margin: 0;
}
</style>
<script type="text/javascript">
var myMap;
ymaps.ready(init);
function init() {
try {
myMap = new ymaps.Map('map', {
center: [55.76, 37.64], // Москва
zoom: 10
});
} catch (e) {
alert("Ошибка при инициализации карты: " + e.message);
}
}
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
Начиная с версии платформы 8.3.14, разработчики 1С добавили возможность переключить движок поля HTML-документа с Internet Explorer на Webkit (Chromium). Это кардинально решает все проблемы с совместимостью JavaScript.
Проанализируем, как это настроить:
ПолеHTMLДокумента.РежимИспользованияHTMLДокумента в значение Webkit (или Chromium в более новых версиях).Если ваша версия платформы ниже 8.3.14, единственным выходом будет использование мета-тега IE=edge и тщательная проверка настроек безопасности Internet Explorer в ОС Windows. Помните, что 1С в режиме IE берет настройки из "Свойств браузера" системы. Попробуйте добавить домены Яндекса в зону "Надежные сайты".
Важно помнить, что Яндекс уже несколько лет требует обязательного наличия API-ключа для использования своих карт. Если ключ не указан в параметре apikey, скрипт загрузки может вернуть ошибку или работать нестабильно. Получить бесплатный ключ для разработчика можно в Кабинете разработчика Яндекса. Без него попытки вызвать ymaps.ready часто будут приводить к ошибке «определение отсутствует», так как сервер просто блокирует загрузку библиотеки.
Вместо того чтобы формировать огромную строку HTML прямо в коде модуля, проанализируем более профессиональный подход. Создадим Макет типа «Текстовый документ» и назовем его КартаШаблон. Вставьте туда ваш HTML-код. Это позволит избежать проблем с экранированием кавычек и спецсимволов.
Посмотрим на пример кода 1С для вывода карты на форму:
&процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем текст шаблона из макета
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("КартаШаблон");
ТекстHTML = Макет.ПолучитьТекст();
// Если нужно передать координаты динамически, используем СтрЗаменить
ТекстHTML = СтрЗаменить(ТекстHTML, "55.76", Формат(Широта, "ЧРД=.; ЧГ=0"));
ТекстHTML = СтрЗаменить(ТекстHTML, "37.64", Формат(Долгота, "ЧРД=.; ЧГ=0"));
// ПолеКарты - это имя реквизита формы с типом Строка,
// связанного с элементом Поле HTML документа
ПолеКарты = ТекстHTML;
КонецПроцедуры
Если карта все равно не отображается, попробуйте следующие шаги:
https://api-maps.yandex.ru непосредственно из браузера на том же компьютере, где запущен клиент 1С.window.external для передачи данных из JavaScript обратно в 1С (например, координат клика).Подводя итог, можно сказать, что стабильное отображение Яндекс Карт в 1С сегодня достигается сочетанием трех факторов: использованием движка Webkit/Chromium в свойствах формы, переходом на API 2.1 с ключом и обязательным внедрением заглушек для объекта console. Следуя этим рекомендациям, вы сможете избежать стандартных ошибок и обеспечить корректную работу картографии во всех типах клиентов 1С.