При автоматизации логистики и служб доставки в Москве одной из ключевых задач является определение принадлежности адреса к определенной транспортной зоне: Садовому кольцу, Третьему транспортному кольцу (ТТК) или МКАД. От этого напрямую зависит стоимость доставки, возможность проезда грузового транспорта и время прибытия курьера. В этой статье мы детально проанализируем различные подходы к решению данной задачи в системе 1С, начиная от простых справочников и заканчивая интеграцией с геоинформационными сервисами.
Самый простой, но наименее гибкий способ — это ведение региональных списков. Рассмотрим ситуацию, когда нам нужно быстро проверить принадлежность адреса к Садовому кольцу. Список улиц внутри этого кольца относительно стабилен и редко претерпевает изменения. Мы можем создать в 1С РегистрСведений, где в качестве ключа будет выступать название улицы, а ресурсом — признак вхождения в зону.
Разберем плюсы и минусы использования почтовых индексов. Хотя в некоторых сообщениях форума предлагается использовать индекс для определения зоны, мы должны понимать, что границы почтовых отделений часто пересекают транспортные магистрали. Поэтому индекс может служить лишь косвенным признаком, но не гарантирует стопроцентную точность для адресов, находящихся непосредственно на границе зон.
Для получения гарантированно точного результата проанализируем возможности современных API-сервисов, таких как DaData. Этот сервис предоставляет специализированные поля для московских адресов. Процесс интеграции выглядит следующим образом:
beltway_hit.Поле beltway_hit может принимать значения, указывающие, находится ли адрес внутри МКАД, снаружи или на самой магистрали. Это значительно упрощает разработку, так как нам не нужно самостоятельно рассчитывать координаты. Рассмотрим пример кода для обработки такого ответа:
// Пример обработки ответа от API сервиса стандартизации
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветОтСервиса);
ДанныеАдреса = ПрочитатьJSON(ЧтениеJSON);
Если ДанныеАдреса.beltway_hit = "IN_MKAD" Тогда
Сообщить("Адрес находится внутри МКАД");
ИначеЕсли ДанныеАдреса.beltway_hit = "OUT_MKAD" Тогда
Сообщить("Адрес находится за пределами МКАД");
КонецЕсли;
Если нам требуется бесплатное решение для больших объемов данных, проанализируем математический подход. Суть метода заключается в получении координат адреса (широта и долгота) и проверке их вхождения в заранее определенный многоугольник (полигон), описывающий границы Садового кольца или ТТК.
Для реализации этого метода нам понадобятся координаты границ зон. Их можно бесплатно получить на Портале открытых данных Правительства Москвы (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).
Для транспортной логистики часто важно не просто кольцо, а принадлежность к Грузовому каркасу Москвы. Это система улиц, по которым разрешено свободное движение грузовиков. Проанализируем ситуацию: адрес может находиться внутри МКАД, но вне грузового каркаса. В этом случае водителю потребуется специальный пропуск или маршрутный лист.
Данные о грузовом каркасе также доступны в виде геозон. Мы рекомендуем загружать эти зоны в систему 1С как наборы полигонов и использовать описанный выше алгоритм для автоматической проверки ограничений при создании документа ЗаказНаДоставку или ПутевойЛист.
Разберем по шагам, как лучше всего организовать архитектуру этого решения в типовых конфигурациях (например, 1С:Управление торговлей или 1С:ERP):
ГеографическиеЗоны, где в табличной части будут храниться координаты точек полигона.Адрес (или используйте дополнительные реквизиты контактной информации) поля для хранения широты и долготы.ТочкаВнутриПолигона для каждой из зон (Садовое, ТТК, МКАД) и запишите результат в реквизиты адреса.Важный момент: границы транспортных зон могут незначительно меняться (например, при масштабных реконструкциях развязок). Мы рекомендуем раз в квартал обновлять координаты полигонов с официальных источников данных Правительства Москвы, чтобы поддерживать актуальность расчетов в системе.
Использование комбинации геокодирования и математических алгоритмов внутри 1С является наиболее профессиональным и производительным способом решения задачи. Это избавляет систему от зависимости от платных внешних сервисов при каждом расчете и позволяет мгновенно обрабатывать тысячи заказов в автоматическом режиме.