v8.x: 1C и Google Maps - 1С-ИнтеГрация

v8.x: 1C и Google Maps



была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было решено использовать геокодирование сервиса Google и Google Visualization для отображение элементов на карте. 

Геокодирование – процесс преобразования адресов·(Украина, Киевская область, Киев, Крещатик 20) в географические координаты (широта 37.423021 и долгота -122.083739), которые можно использовать для размещения маркеров или расположения карты. Подробно про геокодирование можно почитать
 тут. 

Для работы с геокодированием необходимо
 зарегистрировать ключ API карт Google. 

Важный момент: если у вас программа работает в локальной сети и в Internet, то вам необходимо регистрировать два ключа. В зависимости от того, с какого места подключается пользователь к базе подставлять тот или иной ключ.
 

И так, собственно программная реализация.
 

В конфигурации есть две общих формы:
 
* Форма подбора координат. Данная форма формирует запрос на геокодирование и обрабатывает результат.
 
* Форма отображения объектов. Данная форма использует API визуализации Google. В частности данная форма использует визуализацию
 Map. 

Запрос и обработка результата геокодирования.
 

Формирование запроса происходит с ключом output=csv, для вывода результата запроса в csv файл. После выполнения запроса проверяется код результата запроса и разбор csv файла на широту и долготу.
 


Код 1C v 8.2 УП

 #НаСервере

Процедура ОтправитьЗапросНаПоискКоординат()

   Город = Параметры.ОбъектПодбора.Город.Наименование;

   Страна = Параметры.ОбъектПодбора.Город.Владелец.Владелец.Наименование;

   Адрес = Параметры.ОбъектПодбора.Адрес;

   ПараметрПоиска = Страна + " " + Город + " " + Адрес;

 

   АдресOutput = ПолучитьИмяВременногоФайла();

   Ключ = Константы.КлючКарта.Получить();

   ТекстСсылки = "maps/geo?q=" + EncodeURL(ПараметрПоиска)+"&output=csv&oe=utf8&sensor=false&key=" + Ключ;

   ПроксиСервер = Неопределено;

   HTTPСервис = Новый HTTPСоединение("maps.google.com",,,,ПроксиСерверожь);

   ПравильностьВыполнения = Истина;

 

   Попытка

      HTTPСервис.Получить(ТекстСсылки, АдресOutput);

   Исключение

      Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);

      ПравильностьВыполнения = Ложь;

   КонецПопытки;

 

   Если ПравильностьВыполнения Тогда

      // Распарсить результат ответа поиска

      Текст = Новый ТекстовыйДокумент;

      Текст.Прочитать(АдресOutput);

      РезультатПоиска = Текст.ПолучитьСтроку(1);

 

      КодРезультата = Лев(РезультатПоиска,3);

      РезультатПоиска = Сред(РезультатПоиска, 7, СтрДлина(РезультатПоиска));

 

      Если КодРезультата <> "200" Тогда

         Возврат;

      КонецЕсли;

 

      Широта = Число(Сред(РезультатПоиска,0,10));

      Долгота = Число(Сред(РезультатПоиска,12,10));

   КонецЕсли;

КонецПроцедуры

  



Формирование карты отображения
 
П
ри формировании отображения объекта на карте к стандартному коду визуализации добавлен следующий: 

Код 1C v 8.х

 if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);

      else drawMap();  


Это связано с тем, что платформа не хочет сразу обновлять фрейм поля html документа.
 

Код 1C v 8.2 УП

 #НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   СсылкаНаБазу = ПолучитьНавигационнуюСсылкуИнформационнойБазы();

   APIГугла = Константы.КлючКарта.Получить();

 

   ТаблицаОбъектовДляВывода = Новый ТаблицаЗначений;

   ТаблицаОбъектовДляВывода.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка"));

   ТаблицаОбъектовДляВывода.Колонки.Добавить("Город",Новый ОписаниеТипов("Строка"));

   ТаблицаОбъектовДляВывода.Колонки.Добавить("Адрес",Новый ОписаниеТипов("Строка"));

   ТаблицаОбъектовДляВывода.Колонки.Добавить("Широта",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));

   ТаблицаОбъектовДляВывода.Колонки.Добавить("Долгота",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,6)));

   Если Параметры.ОтображатьСОтветственными Тогда

      ТаблицаОбъектовДляВывода.Колонки.Добавить("Ответственный",Новый ОписаниеТипов("Строка"));

   КонецЕсли;

 

   Для Каждого ТекЭлемент Из Параметры.ОбъектыДляОтображения Цикл

      КоординатыОбъекта = ОбщийМодульКартаСервер.ПолучитьКоординатыОбъекта(ТекЭлемент.Значение.ОбъектПосещения);

      Если КоординатыОбъекта = Неопределено Тогда

         Продолжить;

      Иначе

         НоваяСтрока = ТаблицаОбъектовДляВывода.Добавить();

         НоваяСтрока.Наименование = ТекЭлемент.Значение.ОбъектПосещения.Наименование;

         НоваяСтрока.Город = ТекЭлемент.Значение.ОбъектПосещения.Город.Наименование;

         НоваяСтрока.Адрес = ТекЭлемент.Значение.ОбъектПосещения.Адрес;

         НоваяСтрока.Широта = КоординатыОбъекта[0];

         НоваяСтрока.Долгота = КоординатыОбъекта[1];

         Если Параметры.ОтображатьСОтветственными Тогда

            НоваяСтрока.Ответственный = ТекЭлемент.Значение.Ответственный.Наименование;

         КонецЕсли;

      КонецЕсли;

   КонецЦикла;

 

   ТекстСкрипта = "data.addRows(" + Строка(ТаблицаОбъектовДляВывода.Количество()) + ");";

   Сч = 0;

   Для Каждого ТекСтрока Из ТаблицаОбъектовДляВывода Цикл

      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 0, " +СтрЗаменить(Строка(ТекСтрока.Широта),",",".") + ");";

      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 1, " +СтрЗаменить(Строка(ТекСтрока.Долгота),",",".") + ");";

      ТекстСкрипта = ТекстСкрипта + " data.setCell(" + Строка(Сч) + ", 2, '" +Строка(ТекСтрока.Наименование) + " "

      + Строка(ТекСтрока.Город) + " " + Строка(ТекСтрока.Адрес) + " " + ?(Параметры.ОтображатьСОтветственными, ".Ответственный: " + Строка(ТекСтрока.Ответственный), "") + " " + "');";

      Сч = Сч + 1;

   КонецЦикла;

СтраницаХТМЛ = "<html>

|  <head>

|    <script src=""http://maps.google.com/maps?file=api&v=2&key=" + APIГугла + """ type=""text/javascript""></script>

|    <script type=""text/javascript"" src=""http://www.google.com/jsapi""></script>

|  </head>

|

|  <body>

|    <div id=""map_div"" style=""width: 800px; height: 550px""></div>

|    <script type=""text/javascript"">

|

|      google.load(""visualization"", ""1"", {packages:[""map""]});

|      google.setOnLoadCallback(drawMap);

|      function checkIfGoogleLoad() {

|        if(!google.visualization) setTimeout(checkIfGoogleLoad, 1000);

|                      else drawMap();

|      }

|      function drawMap() {

|        var data = new google.visualization.DataTable();

|        data.addColumn('number', 'Lat');

|        data.addColumn('number', 'Lon');

|        data.addColumn('string', 'Name');" + ТекстСкрипта + "

|        var map = new google.visualization.Map(document.getElementById('map_div'));

|        map.draw(data, {showTip: true, mapType: 'normal'});

|      }

|      checkIfGoogleLoad();

|    </script>

|  </body>

|</html>";

КонецПроцедуры  


Андрей Данилюк

 

 



Назад в раздел