1с показать на карте
В этом посте я хочу показать пример того, как может быть использован сервис Google.Maps в конфигурациях 1с: Предприятие 8.2. Как вы все знаете, 1с прижилась (мягко сказать) практически во всех коммерческих структурах — вот и нас не обошла. Сфера применения картографических систем в 1с достаточно широка, например — возможность накладывания отчетности на карту, расчет стоимости маршрутов, и, конечно, поиск объектов на карте по географическим координатам, что вполне может использоваться операторами колл-центров при консультации клиентов.
О чем это я?
В основе повествования лежит Google Maps JavaScript API V3(все примеры работы с сервисом получены именно отсюда) и конечно платформа 1с: Предприятие 8.2. Компоненты 1с, используемые в примере, так же присутствуют в версии 8.1, так что с большой долей вероятности все нижеописанное будет работать и там.
Подробнее о Google.Maps
- Использование Javascript-библиотеки на клиентской стороне, так называемое «Client-Side Geocoding». Этот способ Google позиционирует как основной.
- Серверное использование, «Server-Side Geocoding». Этот способ предпочтителен для систем, где не происходит интерактивной работы с пользователем.
И немного про 1с
Мы будем использовать режим обычных форм, работающий в толстом клиенте 1с. К новомодному управляемому режиму работы с формами, появившемуся в версии 8.2 этот способ не подойдет без доработок.
Что конкретно мы сделаем:
- Создадим html-файл, содержащий javascript-функции для работы с картой
- Создадим внешнюю обработку для 1с, отображающую карту и имеющую контролы, позволяющие отображать метки, найденные по координатам или адресу
Итак, к делу:
1. Создаем файл html
Для работы с сервисом нам необходим файл, который будет содержать необходимые нам javascript-функции и будет открываться из 1с. Я не буду приводить его пример, поскольку за меня это сделали здесь: Здравствуй, мир!, а перейду к описанию.
Добавляем функции, которые при открытии html-документа получают координаты пункта «Москва» и инициализируют карту с автоматическим позиционированием на нем:
var map = null;
function initialize()
getLocation('Москва', function (results, status)
if (status == google.maps.GeocoderStatus.OK)
GoogleLocation = results[0].geometry.location;
initializeMap(GoogleLocation);
addMarkerForLocation(GoogleLocation.lat(), GoogleLocation.lng());//пример отображения метки по координатам
addMarkerForAddress('Москва Тушино');//пример отображения метки по адресу
> else alert('Координаты не определены');
>);
>
2. Создаем обработку в 1с
На форме обработки 1с добавляем контрол типа «ПолеHTMLДокумента»(назовем его «ПолеHTMLДок») — он будет отображать сформированный нами ранее файл html (назовем его google.html). На практике возможно использование так же ActiveX-объекта «Microsoft Web Browser», но, это по вкусу, особенно учитывая то, что использоваться будет в любом случае IE.
После того, как добавили поле HTML документа, нам необходимо сделать так, чтобы при открытии обработки автоматически открывалась карта. Для этого добавляем обработчик формы «ПриОткрытии», и добавляем в него: ЭлементыФормы.ПолеHTMLДок.Перейти(«c:\google\google.html»);
Этого достаточно, чтобы при запуске нашей внешней обработки в 1с автоматически открывался наш html-файл, в котором при загрузке страницы стартует функция Initialize(), заполняющая и центрирующая карту.
Если все ок, давайте добавим возможность добавления меток по событию в 1с:
Для этого добавим на форму текстовое поле ввода «Адрес», «Широта», «Долгота» и две кнопки — «Добавить метку по адресу» и «Добавить метку по координатам».
И конечно соответствующие кнопкам обработчики:
ЭлементыФормы.ПолеHTMLДок.Документ.parentWindow.eval("addMarkerForAddress('" + Адрес + "')");
ЭлементыФормы.ПолеHTMLДок.Документ.parentWindow.eval("addMarkerForLocation(" + Формат(Широта, "ЧГ=") + "," + Формат(Долгота, "ЧГ=") + ")");
Как вы уже поняли, оба обработчика при нажатии кнопок вызывают те функции Javascript, которые были заданы нами в html-файле и создают на карте отметки. Собственно, для первой версии этого уже более чем достаточно.
Несомненно, на практике этот способ можно улучшить — к примеру тем, что в 1с возможно вовсе обойтись без файла html, используя метод объекта ПолеHTMLДокумента.УстановитьТекст() — при этом код самой страницы возможно хранить в базе 1с в виде текста и не заморачиваться с поддержкой внешнего файла html.
Так же стоит подумать над тем, что Google ограничивает нас в количестве запросов на определение координат — 2500 запросов в сутки с одного ip. Логично было бы добавить хранение в базе наиболее используемых координат, что, кроме экономии запросов даст возможность дополнительного функционала в виде, к примеру, возможности отбирать и отображать нужные метки в пределах заданных географических координат относительно заданного центра.
Внимание! Перед использованием обработки следует ознакомиться с здесь почитайте комментарии), либо предлагают решение с получением ключа карт. Во многих публикациях для отображения карт используется "Поле HTML документа" на форме 1С. Этот объект уже давно устарел и не поддерживает возможности HTML 5. В итоге, чтобы отобразить страницу на форме 1С приходится долго "плясать с бубном".
Программист, которому впервые дали задание вывести на карту точку будет тратить лишнее время и СтартМани на поиски лучшего варианта, корректировать реестр Windows, как предложено здесь и в итоге столкнётся с тем, что стабильного рабочего варианта найти не удастся.
Мы предлагаем вариант решения, который будет работать везде и без специальных условий. Мы принципиально не используем объект WebBrowser Control, чтобы всё работало всегда и у всех.
Пример 1. Метка на карте
Для добавления метки на карте достаточно знать её координаты.
Результат нажатия на кнопку “Показать метку” будет таким:
Как это работает?
Для кнопки “Показать метку” назначена процедура:
Функция для получения текста HTML:
Все экспортные функции и процедуры обработки описаны вспомогательными комментариями, поэтому будет легко догадаться о назначении параметров.
Функция “ДобавитьМетку” добавляет на карту метку с описанием.
Если необходимо на одной карте показать сразу несколько меток, то функцию “ДобавитьМетку” нужно вызывать несколько раз.
Для отображения результата составленного текста HTML используется процедура “ПоказатьНаКартеНаКлиенте”.
При выполнении этой процедуры в первый раз - появится окно с выбором программы-браузера. После выбора - откроется окно с картой.
Пример 2: Маршрут на карте
Процедура кнопки “Показать маршрут”:
Пример 3: Получение координат из адреса (геокодирование)
Не всегда в типовой базе 1С имеются данные о координатах пункта назначения. Но зато есть адрес, представленный стройкой. Иногда даже заполненный по всем правилам КЛАДР (ФИАС).
Для таких случаев имеется возможность преобразовать строку почтового адреса в координаты: долготу и широту.
Функция “ПолучитьКоординатыПоАдресу” выполняет обращение к сервису геокодирования и разбирает ответ в структуру, содержащую координаты и адрес, для которого были определены координаты.
Пример 4. Расчет длины пути маршрута
Этот пример появился в версии 2.0 нашей обработки.
Эту задачу можно решить тремя способами.
Способ 1 - платный
и убрав директиву вначале текста страницы HTML
Длина маршрута записывается скриптом в отдельный тег с идентификатором "dist", для того, чтобы потом было удобней парсить.
Отображение маршрута на карте не реализовано для повышения производительности. В этом примере карта вообще не нужна для отображения, поэтому в своих разработках вам придётся подумать как её скрыть. К сожалению, нерисовать карту нельзя. Длина не вычислится.
Если вынести операцию получения длины на отдельную базу и опубликовать на ней веб сервис, то можно реализовать псевдо вычисление на сервере. База пользователя будет обращаться к веб сервису, передавая в него точки маршрута. После этого каждые n секунд будет опрашивать веб сервис на появление в нем результата вычисления.
В базе, с опубликованным веб сервисом, должен быть всегда запущен клиент.
При получении точек маршрута web-сервис запишет их как входящее задание на вычисление, например, в свой регистр сведений. Клиент каждые m секунд будет опрашивать регистр сведений на получение новых заданий. При появлении таких - берет первое (самое старое) невыполненное задание и начинает рисовать карту на своей форме. После отрисовки - возвращает результат в регистр сведений.
Примерно так:
Способ 3 - возможно, лучше всех
В предыдущем способе формируется текст страницы HTML для выполнения расчёта длины маршрута на клиенте средствами браузера. Этот текст можно попробовать использовать на сервере, применив COM-объект "AltBrowser.Browser". Применив методы простого парсинга можно получить значение из контейнера div и использовать в 1С.
Этот способ в данной статье не рассматривается.
Заключение
Все сложные операции с формированием текста HTML страницы карты и методами взаимодействия с сервисом Яндекс.Карты в нашей обработке имеют открытый код, который всегда можно доработать под свои нужды.
Обработка находится в составе конфигурации. Выложена целая конфигурация, так как в ней находится общая форма с примером использования обработки.
Пример о том,как вывести яндекс карту на форму и далее работать с ней:
Основной HTML код карты хранится в макете:
Код вывода карты:
Пример обратного геокодирования - получение координат по адресу:
Обработка вырванная из конфигурации: YandexMap.rar
Можно ее использовать как макет для создания обработки под свои требования.
Похожие FAQ
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора PostgreSQL: установка, настройка, обслуживание 11
PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблиц Посмотреть все результаты поиска похожих
Еще в этой же категории
Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Как получить координаты выделенной области на Яндекс Карте? 3
На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее: Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таб Посмотреть все в категории Географическая схема
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают!
Для клиента нужно было сделать вывод объектов на карту
С возможностью просмотра панорамы:
Основной HTML код карты хранится в макете:
Код вывода карты:
Вырванная из конфигурации обработка GMaps.rar
Можно ее использовать как макет для создания обработки под свои требования.
Похожие FAQ
Яндекс карта : вывод точек на карту 0
Пример о том,как вывести яндекс карту на форму и далее работать с ней: Основной HTML код карты хранится в макете: !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" Посмотреть все результаты поиска похожих
Еще в этой же категории
Как получить координаты выделенной области на Яндекс Карте? 3
На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее: Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таб Яндекс карта : вывод точек на карту 0
Пример о том,как вывести яндекс карту на форму и далее работать с ней: Основной HTML код карты хранится в макете: !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" Посмотреть все в категории Географическая схема
Ключевые слова и Изображения
Слова упорядочены по частоте использования в тексте
Изображения
Здравствуйте!
Продолжим знакомство с фреймворком «FBA Toolkit» и рассмотрим еще один пример разработки андроид-клиента для 1С. Наше приложение «Аудит торговой точки» будет загружать маршрут посещения из 1С и отображать его на карте. Используются офлайн карты на базе картографического сервиса OpenStreetMap.
Предполагается, что у вас уже установлены и настроены все необходимые инструменты разработчика. Если это не так, см. предыдущую часть. Фреймворк «FBA Toolkit» должен быть не ниже версии 1.03, обновите конфигурацию 1С и Android-проект ru_profi1c_fba из SVN-репозитария.
Серверная часть (в базе 1С)
1. В информационной базе 1С создаем 2 справочника, которые будут выступать в роли источника данных для примера.
- «Широта» и «Долгота» содержат координаты этой точки, число 10.6
- «Фото» ссылка на справочник «Хранилище дополнительной информации» — ссылка на основное изображение;
- все прочие реквизиты строкового типа.
- «Объект» составного типа в т.ч содержит тип «СправочникСсылка.ТорговаяТочка», определяет объект которому принадлежит дополнительная информация. В мобильном приложении не используется.
- «Хранилище», тип «ХранилищеЗначения», содержит само изображение.
3. Справочники заполняем некоторой тестовой информацией, в этом примере это пиццерии в центре Москвы (данные взяты из открытых источников).
Для некоторых точек загружены изображения. Код сохранения значения в хранилище стандартный для 1С:
Форма элемента справочника «Хранилище дополнительной информации», «ИмяФайла» содержит путь к загружаемому изображению.
4. Создаем мобильное приложение «Аудит торговой точки». В дерево метаданных добавляем наши справочники.
Просто ради удобства, имена реквизитов и объектов из латиницы переведены на английский.
- установлен флаг использования плана обмена «МобильноеПриложениеАудитТочки»
- при изменении любой «Торговой точки» в 1С она будет передана мобильному приложению;
- на справочник «Хранилище дополнительной информации» наложена дополнительная фильтрация: передавать измененную информацию только по торговым точкам. Это делается запросом:
где «УзелОбмена» это предопределенный параметр, в момент обмена будет содержать значение установленного узла для мобильного сотрудника (ниже покажем где это устанавливается).
5. Генерируем шаблон мобильного приложения Android. Стоимость и порядок приобретения лицензии описаны здесь. Как внести полученные лицензионные данные в 1С написано здесь.
Можно так же воспользоваться тестовой лицензией:
client_id: TEST-CLIENT-000
client_name: test-client-name
client_pwd: 31qX9OqZ_V
lisence_id: f7a42162-e27f-4246-a89b-b69c02387740
Только в этом случае не рекомендуется изменять имя пакета мобильного приложения: ru.profi1c.samples.audit.salespoint.
6. В справочник «Мобильные сотрудники» добавляем наше приложение для сотрудника, который используется для тестирования обмена. Обратите внимание на колонку «Узел обмена», это новый элемент нашего плана обмена.
Как правило, для каждого сотрудника создается свой узел обмена. В этом случае получается, что изменения данных в 1С будут автоматически регистрироваться для всех узлов (все мобильных сотрудников), а при обмене каждый мобильный клиент «заберет свою порцию данных».
Этот параметр может использоваться в запросах на выборку данных, как нашем случае со справочником «Хранилище дополнительной информации».
Также рекомендуется для каждого мобильного приложения создавать отдельный план обмена, чтобы не вносить путаницу.
Подготовительные работы в 1С завершены, для тестирования правил обмена можете воспользоваться обработкой «Тест обмена с мобильным приложением», подробнее здесь. В 1С больше ничего делать не надо, всю рутинную работу по организации обмена FBA берет на себя. Программист может сконцентрироваться на разработке мобильного приложения.
Мобильное приложение Android
1. Создаем новый проект на основании сгенерированого шаблона. Для этого в Eclipse необходимо выполнить импорт, как это сделать подробно описано здесь.
2. Займемся картой. В состав FBA включены вспомогательные классы, облегчающие новичку работу с офлайн картами Mapsforge. Один из таких классов – BaseRouteMapActivity, активити предназначенная для отображения точек маршрута и навигации по ним. Его и будем использовать.
2.1 Создаем свой класс, наследник от BaseRouteMapActivity:
Отображать будем карту Москвы, которую необходимо поместить на эмулятор в каталог mnt/sdcard/backup/ . Этот каталог будет создан автоматически при первом запуска программы. Где взять файл карты или как создать самому, смотрите в конце статьи.
При запуске наша карта будет отцентрирована по координатам переданным в методе getMapCenterPoint(). Функция showCurrentPosition() должна возвращать true, если вы ходите отображать маркер с вашей текущей позицией.
Если методом requestLocationUpdates() включено отслеживание координат, то при изменении будет вызываться обработчик onLocationChanged. Настройки частоты обновления координат задаются через getLocationMinDistance() и getLocationMinTime(). По умолчанию используются оба провайдера (GPS и NETWORK) для получения координат, изменить можно в BaseMapActivity т.к исходный код открыт.
В макете activity_route_map.xml размещаем элемент карты:
В принципе, этого достаточно для отображения карты. Также на карте отображается маркер с текущей позицией и есть возможность обработать событие при изменении координат.
2.2 Добавление слоя с точками маршрута выполняется с помощью метода addRouteOverlay, в который передается список элементов List. T это тип доп. данных хранимых вместе с элементом, в вашем случае это CatalogSalesPoint. Подготовим список наших торговых точек:
и добавим вызов этого метода в init().
Здесь из локальной базы выбираются все элементы справочника «Торговые точки» и добавляются в коллекцию отображаемых элементов. Причем для точек, у которых установлены координаты в 1С, маркер будет зеленого цвета. Точки без координат размещаются по центру карты с маркером красного цвета. Пользователь может перемещать их по карте с целью уточнения координат.
2.3 Давайте добавим реакцию на клик по маркеру в обработчик onRouteItemSelect:
Поля класса и метод отображающий дополнительную информацию о торговой точке:
Для отображения всплывающего окна используется макет map_popup.xml (разметка приведена частично):
На макете отображается информация по одной торговой точке, реквизиты «Наименование», «Адрес», «Сайт» и «Телефон» автоматически проецируются на TextView-элементы в mSalesPointView.build(. ).
Для отображения фото используется подчиненный объект ovFotoStorage с дочерним ImageView. Фото считывается из базы и проецируется на ImаgeView в методе mFotoStorageView.build(. ).
А так как в реквизите «Фото» хранится только ссылка на справочник «Хранилище дополнительной информации», ее необходимо предварительно считать методом refresh.
Инициализацию добавляем в метод в init()
Макет map_popup.xml можно установить как кастомный для Toast, но в этом примере он встроен в основной макет activity_route_map.xml:
Приложение готово, запустите его на эмуляторе, настройте параметры авторизации (как в 1С) и выполните обмен с базой. Пример работы приложения:
Клик по номеру телефона откроет стандартную «звонилку», а по клику на ссылку будет запущен браузер. Такое поведение достигается простой установкой свойства android:autoLink для TextView.
Полный код примера доступен в SVN хранилище. Дополнительно в нем показано как сохранить координаты у перемещенных точек и обновить маркер.
Где взять карты
Некоторые карты планируем размещать на нашем сайте, приоритет у городов (областей) непокрытых с достаточной детализацией на Google Maps и карт, подготовленных для клиентов FBA. Краткая инструкция по созданию файла карты приведена там же.
Читайте также: