Как в 1С определить вхождение московского адреса в транспортные зоны (МКАД, ТТК, Садовое кольцо)

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации логистики и служб доставки в Москве одной из ключевых задач является определение принадлежности адреса к определенной транспортной зоне: Садовому кольцу, Третьему транспортному кольцу (ТТК) или МКАД. От этого напрямую зависит стоимость доставки, возможность проезда грузового транспорта и время прибытия курьера. В этой статье мы детально проанализируем различные подходы к решению данной задачи в системе 1С, начиная от простых справочников и заканчивая интеграцией с геоинформационными сервисами.

Метод 1: Использование статических списков и индексов

Самый простой, но наименее гибкий способ — это ведение региональных списков. Рассмотрим ситуацию, когда нам нужно быстро проверить принадлежность адреса к Садовому кольцу. Список улиц внутри этого кольца относительно стабилен и редко претерпевает изменения. Мы можем создать в 1С РегистрСведений, где в качестве ключа будет выступать название улицы, а ресурсом — признак вхождения в зону.

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

Метод 2: Интеграция с сервисом DaData (API)

Для получения гарантированно точного результата проанализируем возможности современных API-сервисов, таких как DaData. Этот сервис предоставляет специализированные поля для московских адресов. Процесс интеграции выглядит следующим образом:

  1. Отправляем строку адреса в API сервиса.
  2. В ответ получаем структурированный JSON.
  3. Анализируем поле beltway_hit.

Поле beltway_hit может принимать значения, указывающие, находится ли адрес внутри МКАД, снаружи или на самой магистрали. Это значительно упрощает разработку, так как нам не нужно самостоятельно рассчитывать координаты. Рассмотрим пример кода для обработки такого ответа:


// Пример обработки ответа от API сервиса стандартизации
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветОтСервиса);
ДанныеАдреса = ПрочитатьJSON(ЧтениеJSON);

Если ДанныеАдреса.beltway_hit = "IN_MKAD" Тогда
    Сообщить("Адрес находится внутри МКАД");
ИначеЕсли ДанныеАдреса.beltway_hit = "OUT_MKAD" Тогда
    Сообщить("Адрес находится за пределами МКАД");
КонецЕсли;

Метод 3: Геокодирование и алгоритм «Точка в многоугольнике»

Если нам требуется бесплатное решение для больших объемов данных, проанализируем математический подход. Суть метода заключается в получении координат адреса (широта и долгота) и проверке их вхождения в заранее определенный многоугольник (полигон), описывающий границы Садового кольца или ТТК.

Для реализации этого метода нам понадобятся координаты границ зон. Их можно бесплатно получить на Портале открытых данных Правительства Москвы (data.mos.ru) в формате GeoJSON. После загрузки этих координат в справочник 1С, мы можем применить классический алгоритм Ray Casting.

Выясним, как программно реализовать проверку вхождения точки в многоугольник на языке 1С:


Функция ТочкаВнутриПолигона(Широта, Долгота, МассивКоординатЗоны) Экспорт
    // МассивКоординатЗоны - это массив структур с полями Lat и Lon
    Внутри = Ложь;
    КоличествоТочек = МассивКоординатЗоны.Количество();
    j = КоличествоТочек - 1;
    
    Для i = 0 По КоличествоТочек - 1 Цикл
        ТочкаI = МассивКоординатЗоны[i];
        ТочкаJ = МассивКоординатЗоны[j];
        
        Если ((ТочкаI.Lat > Широта) <> (ТочкаJ.Lat > Широта)) И 
             (Долгота < (ТочкаJ.Lon - ТочкаI.Lon) * (Широта - ТочкаI.Lat) / (ТочкаJ.Lat - ТочкаI.Lat) + ТочкаI.Lon) Тогда
            Внутри = НЕ Внутри;
        КонецЕсли;
        j = i;
    КонецЦикла;
    
    Возврат Внутри;
КонецФункции

Этот метод позволяет локально и мгновенно определять зону для любого адреса, имея только его координаты. Координаты можно получить один раз при вводе адреса через бесплатные геокодеры (например, Nominatim от OpenStreetMap).

Метод 4: Использование «Грузового каркаса»

Для транспортной логистики часто важно не просто кольцо, а принадлежность к Грузовому каркасу Москвы. Это система улиц, по которым разрешено свободное движение грузовиков. Проанализируем ситуацию: адрес может находиться внутри МКАД, но вне грузового каркаса. В этом случае водителю потребуется специальный пропуск или маршрутный лист.

Данные о грузовом каркасе также доступны в виде геозон. Мы рекомендуем загружать эти зоны в систему 1С как наборы полигонов и использовать описанный выше алгоритм для автоматической проверки ограничений при создании документа ЗаказНаДоставку или ПутевойЛист.

Практические рекомендации по реализации в 1С

Разберем по шагам, как лучше всего организовать архитектуру этого решения в типовых конфигурациях (например, 1С:Управление торговлей или 1С:ERP):

  1. Создайте справочник ГеографическиеЗоны, где в табличной части будут храниться координаты точек полигона.
  2. Добавьте в карточку Адрес (или используйте дополнительные реквизиты контактной информации) поля для хранения широты и долготы.
  3. При записи нового адреса или изменении старого, настройте вызов фонового задания для получения координат через внешнее API.
  4. После получения координат выполните функцию ТочкаВнутриПолигона для каждой из зон (Садовое, ТТК, МКАД) и запишите результат в реквизиты адреса.

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

Использование комбинации геокодирования и математических алгоритмов внутри 1С является наиболее профессиональным и производительным способом решения задачи. Это избавляет систему от зависимости от платных внешних сервисов при каждом расчете и позволяет мгновенно обрабатывать тысячи заказов в автоматическом режиме.

← На главную