К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как по адресу получить координаты в 1С

Как в 1С получить координаты по адресу: сервисы геокодирования, HTTP-запросы к API DaData, Яндекс и OpenStreetMap, хранение координат и типовые ошибки.

Задача получить координаты по адресу возникает в 1С постоянно: построить маршрут доставки, показать контрагента на карте, рассчитать расстояние до склада, сгруппировать заказы по зонам. Сама платформа 1С координаты по адресу не вычисляет — для этого используются внешние сервисы геокодирования, к которым 1С обращается по HTTP. Поэтому решение всегда состоит из двух частей: выбрать сервис и написать код обращения к нему.

Геокодирование — это преобразование текстового адреса в географические координаты (широту и долготу). Обратная операция, когда по координатам получают адрес, называется обратным геокодированием и тоже доступна в большинстве сервисов. Ниже разберём, какие сервисы подходят для работы из 1С, как сформировать запрос средствами платформы, как разобрать ответ и где хранить результат, чтобы не дергать внешний API при каждом обращении к адресу.

Какие сервисы геокодирования подходят для 1С

Для интеграции с 1С нужен сервис, который принимает адрес в параметрах HTTP-запроса и возвращает структурированный ответ в формате JSON. На практике чаще всего используют три варианта: DaData (сильная сторона — нормализация российских адресов и подсказки по ФИАС/ГАР), геокодер Яндекс.Карт (хорошее покрытие и точность по России) и Nominatim на базе OpenStreetMap (бесплатный, но с ограничениями по частоте запросов и без гарантий точности).

Все три сервиса работают по одной схеме: вы регистрируетесь, получаете API-ключ (у Nominatim ключ не нужен, но требуется корректный заголовок User-Agent), отправляете GET-запрос с адресом и получаете JSON, где среди прочих полей есть широта и долгота. Отличия — в лимитах, стоимости, формате ответа и качестве распознавания «грязных» адресов, введённых пользователями вручную.

Сравнение вариантов

DaData

Нормализует российские адреса, возвращает коды ФИАС/ГАР и координаты. Подходит для учётных систем; бесплатный лимит ограничен, далее платно.

Яндекс.Карты (геокодер)

Высокая точность по России и СНГ. Требует API-ключ; условия использования ограничивают хранение результатов — читайте лицензионное соглашение.

Nominatim (OpenStreetMap)

Бесплатный, без ключа, но с жёстким лимитом частоты запросов и требованием указывать User-Agent. Подходит для разовых и маленьких объёмов.

Как устроен HTTP-запрос к сервису геокодирования

В типовом сценарии 1С формирует GET-запрос вида «адрес сервиса + параметры: текст адреса, ключ, формат ответа». Платформа предоставляет для этого объекты HTTPСоединение и HTTPЗапрос, а также более короткий путь через ПолучениеФайлаИзИнтернета для простых случаев. Ответ приходит в теле HTTP-ответа в виде строки JSON.

Важно корректно закодировать адрес для передачи в URL: пробелы, кириллица и спецсимволы должны быть преобразованы. В платформе для этого есть функция КодироватьСтроку с методом КодировкаURL. Если пропустить кодирование, сервис вернёт ошибку разбора запроса или пустой результат, хотя сам адрес корректен.

1c
Функция ПолучитьКоординаты(Адрес, КлючAPI)
    Сервер = "geocode-maps.yandex.ru";
    Ресурс = "/1.x/?apikey=" + КлючAPI + "&format=json&geocode=" + КодироватьСтроку(Адрес, СпособКодированияСтроки.КодировкаURL);
    Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
    Запрос = Новый HTTPЗапрос(Ресурс);
    Ответ = Соединение.Получить(Запрос);
    Возврат Ответ.ПолучитьТелоКакСтроку();
КонецФункции

Разбор JSON-ответа и извлечение широты и долготы

Строку ответа преобразуют в структуру данных через объект ЧтениеJSON. Дальше нужно пройти по иерархии полей до координат: у каждого сервиса свой путь. Например, у геокодера Яндекса координаты лежат в строке «долгота широта» через пробел внутри вложенных коллекций response → GeoObjectCollection → featureMember → GeoObject → Point → pos. У DaData это отдельные поля geo_lat и geo_lon в массиве suggestions.

Обязательно проверяйте, что сервис вообще нашёл адрес: массив результатов может быть пустым, а у Nominatim при отсутствии результата возвращается пустой JSON-массив. Обращение к несуществующему элементу вызовет ошибку выполнения, поэтому перед извлечением координат проверяйте количество элементов в коллекциях.

Обратите внимание на порядок координат: одни сервисы возвращают «широта, долгота», другие — «долгота, широта». Это самая коварная деталь интеграции: запрос выполняется без ошибок, но точка на карте оказывается в другом полушарии. Всегда сверяйте первый полученный результат с известным адресом.

Где и как хранить координаты в базе 1С

Повторный запрос к сервису при каждом открытии карты или построении отчёта — плохая практика: расходуется лимит API, замедляется работа, а при недоступности сервиса функционал ломается. Координаты следует получать один раз и сохранять в базе. Типовые варианты хранения: два числовых реквизита (Широта, Долгота) в справочнике контрагентов или адресов доставки, либо отдельный регистр сведений, привязанный к адресу или его коду ФИАС.

Регистр сведений удобнее, когда один адрес используется в разных объектах или когда нужно хранить дополнительные данные ответа: точность геокодирования, дату запроса, нормализованный адрес. Заполнение координат лучше выполнять регламентным заданием или по кнопке «Определить координаты», а не в момент записи объекта — иначе сетевая задержка будет мешать пользователю.

Обработка ошибок и ограничения сервисов

Внешний вызов может завершиться неудачей по многим причинам: нет интернета, неверный API-ключ, превышен лимит запросов, сервис временно недоступен. Код ответа 200 означает успех; коды 403 и 429 обычно указывают на проблемы с ключом или лимитом. Оборачивайте вызов в попытку-исключение и проверяйте КодСостояния ответа до разбора тела.

При массовой обработке адресов соблюдайте ограничения сервиса по частоте запросов. Nominatim прямо требует не чаще одного запроса в секунду, у платных сервисов лимиты привязаны к тарифу. Добавляйте паузы или обрабатывайте адреса пакетами в фоновом задании, иначе ваш ключ или IP-адрес могут временно заблокировать.

Типичные ошибки
01
Не кодировать адрес для URL — сервис возвращает ошибку или пустой ответ на адресах с пробелами и кириллицей.
02
Перепутать широту и долготу при разборе ответа — точка оказывается в другой части света, а ошибка замечается поздно.
03
Запрашивать сервис при каждом обращении к адресу — расходуется лимит API и замедляется работа пользователей.
04
Не проверять код ответа и пустой результат — программа падает с ошибкой обращения к несуществующему элементу массива.
05
Игнорировать лимиты частоты запросов при массовой обработке — блокировка ключа или IP-адреса.

Проверка результата и контроль качества

После внедрения проверьте механизм на контрольном наборе: несколько точных адресов, адрес с опечаткой, несуществующий адрес и адрес за пределами вашего региона. Для каждого случая должно быть предсказуемое поведение: координаты найдены, найден приблизительный результат или зафиксирован отказ — без падения кода.

Полезно сохранять вместе с координатами признак качества результата, если сервис его возвращает (у DaData это поля qc_geo, у Яндекса — precision). Это позволит отличить точное совпадение с домом от приблизительной привязки к улице или населённому пункту и не использовать неточные данные там, где требуется точность до здания.

Контрольные точки

Как проверить результат

Код состояния HTTP-ответа
Норма

200, тело ответа содержит JSON с координатами

Тревожный признак

403, 429 или 5xx — проблема с ключом, лимитом или доступностью сервиса

Точка на карте по полученным координатам
Норма

Совпадает с реальным расположением адреса

Тревожный признак

Точка в другом городе или океане — перепутаны широта и долгота

Признак точности результата
Норма

Сервис сообщает о совпадении до дома

Тревожный признак

Привязка только к улице или городу при необходимости точного адреса

FAQ

Можно ли получить координаты без интернета?

Да, если развернуть локальный сервер геокодирования на базе открытых данных OpenStreetMap или справочника ФИАС/ГАР. Это требует отдельной инфраструктуры и регулярного обновления данных, поэтому оправдано только при больших объёмах или жёстких требованиях к автономности.

Чем отличается геокодирование от подсказок по адресу?

Подсказки (например, в DaData) помогают пользователю ввести корректный нормализованный адрес и часто сразу возвращают координаты вместе с ним. Геокодирование в узком смысле — это отдельный запрос «адрес → координаты». Если вы уже используете подсказки при вводе, координаты часто можно сохранить сразу, без отдельного вызова.

Как получить координаты для тысячи адресов разово?

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

Что делать, если сервис не находит адрес?

Сначала нормализуйте адрес: приведите сокращения, уберите лишние слова, попробуйте вариант без номера квартиры и корпуса. Если адрес новостройки, его может ещё не быть в базе сервиса — тогда координаты придётся указать вручную по карте.

Где в типовых конфигурациях уже есть работа с картами?

В ряде конфигураций есть подсистемы работы с картами и маршрутами (например, в решениях для доставки и логистики), а в БСП есть механизмы контактной информации с поддержкой адресов по классификатору. Перед разработкой своего решения проверьте существующий функционал вашей конфигурации.

Можно ли хранить координаты в виде одной строки?

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

Итог

Что важно запомнить

Координаты по адресу в 1С получают через внешний сервис геокодирования: HTTP-запрос с закодированным адресом, разбор JSON через ЧтениеJSON, проверка кода ответа и порядка координат. Результат сохраняют в базе и обновляют при изменении адреса, а массовую обработку выполняют с учётом лимитов сервиса.