При разработке интерфейсов в 1С:Предприятие часто возникает необходимость интеграции интерактивных карт. Однако при переходе на новые версии платформы, начиная с 8.3.14, многие разработчики столкнулись с неприятным эффектом: в ПолеHTMLДокумента перестало работать перемещение карты мышью (drag-and-drop). Карта отображается, кнопки нажимаются, но «схватить» и передвинуть её невозможно. В этой статье мы подробно разберем, почему это происходит, какие версии платформы затронуты и как решить проблему программными средствами или обновлением.
Проанализируем техническую подоплеку. Начиная с версии 8.3.14, компания 1С начала отказываться от использования движка Internet Explorer (MSHTML) внутри толстого и тонкого клиентов под Windows в пользу WebKit. Это позволило использовать современные стандарты HTML5 и CSS3, однако привнесло специфические ошибки самого движка WebKit.
Суть проблемы заключается в некорректной интерпретации событий мыши. Когда пользователь зажимает левую кнопку мыши на карте и пытается её сдвинуть, WebKit внутри платформы 1С ошибочно полагает, что пользователь хочет выделить текст или перетащить объект как картинку, а не взаимодействовать с JavaScript-кодом карты. Это происходит из-за конфликта между обработчиками mousedown и mousemove. В результате стандартный функционал Яндекс.Карт блокируется программным слоем платформы.
Проблема носит массовый характер и подтверждена официально (ошибка 000051584 на Bugboard 1C). Проанализируем список затронутых версий:
Если вы используете версию 8.3.13, ошибки не будет, так как там используется старый движок. Но как только вы обновляетесь до 8.3.14 или первых релизов 8.3.15/16, функционал карт ломается.
Существует два основных пути решения: административный (обновление) и программный (код-«костыль», если обновиться прямо сейчас невозможно).
Самый правильный и надежный метод — установка релиза, в котором ошибка WebKit была исправлена силами разработчиков 1С. Рассмотрим рекомендуемые версии:
Если по какой-то причине вы вынуждены оставаться на «проблемном» релизе, попробуем исправить поведение движка через внедрение стилей в HTML-код страницы. Посмотрим на пример кода, который нужно добавить в секцию style вашей HTML-страницы:
/* Отключаем стандартное поведение touch и drag для контейнера карты */
#map {
width: 100%;
height: 100%;
touch-action: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
Разберем, что делают эти свойства. Свойство touch-action: none является ключевым: оно указывает браузеру (WebKit), что обработку всех жестов и движений мыши берет на себя JavaScript, и браузеру не нужно пытаться прокручивать страницу или выделять элементы. Свойство user-select: none предотвращает случайное выделение невидимых элементов карты, которое часто мешает корректному срабатыванию события drag.
Проанализируем ситуацию с инициализацией самой карты. Иногда помогает явное указание опций при создании объекта карты. Посмотрим на пример JavaScript-кода:
var myMap = new ymaps.Map("map", {
center: [55.76, 37.64],
zoom: 10,
controls: []
}, {
// Явно разрешаем перетаскивание и отключаем задержки
dragEvents: true,
yandexMapDisableAddressPopup: true
});
Дополнительно убедимся, что мы используем актуальную версию API. В заголовке страницы должен быть указан правильный скрипт. Посмотрим на строку подключения:
script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"
Важно понимать, что в последних версиях платформы (начиная с 8.3.20) 1С сделала еще один важный шаг — переход на движок Chromium Embedded Framework (CEF) для Windows. Это практически полностью снимает проблемы совместимости, так как CEF работает аналогично современному браузеру Google Chrome.
Если вы планируете долгосрочную поддержку решения с Яндекс.Картами, рекомендуем ориентироваться на использование Платформа 8.3.20+. В этом случае вы сможете использовать даже третью версию API Яндекс.Карт (v3.0), которая требует современных JS-возможностей, недоступных в старом WebKit.
Подведем итоги нашего исследования:
1С:Предприятие. Если она попадает в диапазон 8.3.14 — 8.3.15.1746, причина именно в платформе.touch-action: none и user-select: none.vrs-cache в локальном профиле пользователя, так как WebKit иногда сохраняет старые некорректные скрипты.Следуя этим шагам, мы сможем обеспечить стабильную работу картографических сервисов в любых прикладных решениях на базе 1С.