При разработке мобильных приложений на платформе 1С часто возникает необходимость работать с картами и геопозиционированием. Однако при попытке программно получить координаты объекта по его адресу разработчики могут столкнуться с ошибкой: «Тип не определен (ДанныеАдреса)».
Проанализируем причину этой проблемы, разберем по шагам её решение, а также рассмотрим важные нюансы работы с геоданными и варианты построения маршрутов на карте.
Специализированные типы и функции для работы с геопозиционированием — такие как ДанныеАдреса, ГеографическиеКоординаты, ПолучитьМестоположениеПоАдресу() и ПоказатьНаКарте() — доступны исключительно на стороне клиента мобильного устройства.
Если код исполняется на сервере, на обычном тонком клиенте для ПК или вне клиентского контекста мобильного приложения, платформа 1С просто «не знает» о существовании типа ДанныеАдреса. В результате компилятор выдает ошибку о неопределенном типе.
Для устранения ошибки необходимо явно указать платформе, что данный участок кода должен компилироваться и выполняться только в контексте мобильного клиента. Для этого используем инструкции препроцессора #Если МобильноеПриложениеКлиент Тогда или #Если МобильныйКлиент Тогда.
Рассмотрим правильный пример написания кода:
Координаты = Неопределено;
#Если МобильноеПриложениеКлиент Тогда
СтруктураАдреса = Новый Структура();
СтруктураАдреса.Вставить("Страна", Объект.Страна);
СтруктураАдреса.Вставить("Город", Объект.Город);
СтруктураАдреса.Вставить("Улица", Объект.Улица);
СтруктураАдреса.Вставить("Дом", Объект.Дом);
ДанныеАдреса = Новый ДанныеАдреса(СтруктураАдреса);
Координаты = ПолучитьМестоположениеПоАдресу(ДанныеАдреса);
#КонецЕсли
Если Координаты <> Неопределено Тогда
ПоказатьНаКарте(Координаты);
Иначе
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не заполнены поля, описывающие адрес клиента!";
Сообщение.Поле = "Объект.Страна";
Сообщение.Сообщить();
КонецЕсли;
Помимо корректного контекста исполнения кода, обратим внимание на обязательные условия для работы геокодирования:
ПолучитьМестоположениеПоАдресу() делает запрос к внешним картографическим сервисам операционной системы. Если на устройстве отсутствует интернет, метод вернет Неопределено."Регион" (область или край).Если задача мобильного приложения не ограничивается отображением одной точки, а требует построения маршрута между двумя и более точками, рассмотрим основные практические подходы:
С помощью глобального метода ЗапуститьПриложение() можно передать сформированную ссылочную команду внешнему приложению (например, Яндекс.Навигатору, Яндекс.Картам или Google Maps) с координатами начальной и конечной точек. Операционная система перенаправит пользователя в установленный навигатор, где автоматически построится маршрут.
На управляемую форму добавляется элемент с типом Поле HTML-документа. В него загружается веб-страница с подключенным API карт (Яндекс.Карты API, Google Maps API или Leaflet/OpenStreetMap). Взаимодействие между 1С и JavaScript позволяет передавать координаты и динамически прорисовывать трек прямо внутри формы приложения.
Для расчета расстояния и получения точек маршрута без показа графической карты используются объекты HTTPСоединение и HTTPЗапрос. Сервис возвращает данные в формате JSON, которые затем обрабатываются алгоритмами 1С.