Автоматическое определение зоны доставки по адресу в УТ, ERP, КА (расширение)









Пример реализации автоматического определения зоны доставки по адресу в конфигурациях, использующих подсистему «Управление доставкой». Зоны доставки наносятся на карте в виде произвольных полигонов. При вводе адреса в документах анализируется попадание координат адреса в один из заданных полигонов. В основе разработки лежат технологии Яндекс и математические алгоритмы.

Условия применения

Для подключения расширения необходимо иметь платформу не ниже 8.3.11 и режим совместимости конфигурации также не ниже 8.3.11, т.к. используется механизм расширения данных. В остальных случаях добавленные в расширении реквизиты и табличные части можно перенести в основную конфигурацию. В конфигурации должна быть включена подсистема Управление доставкой.

Работа с зонами доставки

Для успешной работы механизма необходимо задать координаты всех используемых зон доставки. Это можно сделать с помощью специального редактора, который открывается при нажатии на кнопку Выбрать на карте в форме элемента справочника Зоны доставки. Также координаты можно задать вручную (или просмотреть, удалить) нажав на ссылку внизу формы. Но удобнее всего сделать это интерактивно.

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

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

Для оптимизации поиска нужной зоны и удобства их редактирования на карте для каждой зоны необходимо указать регион — строковое наименование области или города, в пределах которого строятся полигоны, например "Владимирская область", "Москва", "Санкт-Петербург". При нанесении новой зоны существующие будут также отображены бирюзовым цветом, соответственно пересечение разных полигонов недопустимо.

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

Использование в документах

Определение зоны доставки возможно встроить во все документы, в которых используется функционал доставки. В текущем примере это реализовано для документа Заказ клиента. На закладке Доставка вводится адрес доставки (произвольно или через классификатор), после чего автоматически определяются координаты адреса и подбирается зона доставки. Если координаты адреса непосредственно не входят ни в одну зону, то подбирается ближайшая по расстоянию.

Рекомендации и ограничения

  • Зоны доставки, как правило, наносятся исходя из соображений транспортной логистики, и не имеют четкой связи с административными единицами региона. В противном же случае стоит задуматься над использованием других сервисов, которые смогут вернуть нужные данные.
  • Все существующие зоны доставки в одном регионе должны быть нанесены таким образом, чтобы было максимально полное покрытие без больших "дыр", иначе определение может быть не совсем корректным, т.к. в случае неудачного поиска зоны будет выбрана ближайшая по расстоянию. Если такое поведение не устраивает, то можно удалить соответствующий вызов функции.
  • Не стоит рисовать очень подробные полигоны с множеством количества точек, чем больше зон и чем они сложнее, тем больше это может сказаться на скорости обработки. Но тут все индивидуально и нужно экспериментировать.
  • Возможна оптимизация работы механизма. Например, можно запоминать координаты и зону по адресам (с точностью до номеров домов), и затем по накопленным данным уже подставлять готовые данные, не обращаясь к сервисам и расчетам.
  • При вводе адресов лучше использовать адресный классификатор, в противном случае корректность определения зоны доставки напрямую зависит от корректности написания адреса пользователем. Если адрес задается вручную, то обязательно должны присутствовать наименования региона, города, улицы с разделением через запятую. Не допускается указание только улицы или населенного пункта, т.к. в этом случае геокодер может вернуть данные совсем другого региона.
  • Следует помнить об ограничениях использования сервисов Яндекс (https://tech.yandex.ru/maps/), в частности число запросов геокодеру в сутки не должно превышать 25 тысяч.

 

12 Comments

  1. AlexHD5

    Всё бы хорошо, но есть одно но:

    Стоимость 1000 запросов в к api Яндкса в сутки, стоит 120 000 руб в год https://tech.yandex.ru/maps/doc/enterprise/concepts/jsapi-geocoder-docpage/#jsapi-geocoder

    2. Карта должна быть размещена на сайте или в приложении, которые сможет увидеть любой человек: без платной регистрации и получения особых прав. Например, карта не должна попасть во внутреннюю сеть компании или на сайт, который доступен только по приглашениям.

    3. API не будет использоваться для управления транспортом или мобильными сотрудниками.

    Для проектов, в которых нельзя выполнить хотя бы одно условие, API будет платным.

    Подробнее об условиях бесплатного использования можно узнать https://tech.yandex.ru/maps/doc/enterprise/concepts/about-enterprise-docpage/?from=commercial

    Reply
  2. alex15650

    (1) Вообще, до 25000 запросов в сутки бесплатно. Этого хватает выше крыши. По поводу остального — в одной из компаний, где я работал, эта вещь пашет уже не один год.

    Reply
  3. andryandry

    Отличная реализация, однако не совсем понял цель введения реквизита район — на большом количестве полигонов есть проблемы с производительностью?

    Я в своей адаптации сделал фильтр по группе в которую входит полигон.

    Reply
  4. andryandry

    (1) API Key понадобился только для построения маршрутов. По запросам реализованным тут он не требовался

    Reply
  5. alex15650

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

    А как вы понимаете по какой группе фильтровать, если зона ещё не известна?

    Reply
  6. andryandry

    (5) зона не известна, но известен родитель.

    Справочник зон иерархический. например 1 родитель — «город», 2 родитель — «область»,

    1.Создаем новый район в группе город — вводим название зоны (желательно известное с точки зрения географии)

    2. Открываем карту и показываем на карте уже известные зоны «города», пытаемся по введенному названию узнать у геокодера есть ли такая зона, если да то сразу строим ее.

    я в такую логику передаелал

    Reply
  7. alex15650

    (6) А когда делаете определение зоны по точке адреса, перебираете все созданные зоны? Я в этом случае беру только зоны конкретного региона, геокодер дает эту информацию. Соответственно поиск сокращается в разы.

    Reply
  8. andryandry

    (7) Нет, только зоны текущей группы

    Reply
  9. alex15650

    Все равно не до конца понял откуда группа берется, ну да ладно, работает и хорошо ))

    Reply
  10. user_atol

    Отличная обработка! Спасибо!

    Reply
  11. basuga

    Разработка хороша, благодарю, решила одну мою задачу. Имейте ввиду, что теперь нужен ключ API в любом случае, без этого при запросе Яндекс выдает ошибку 429.

    Reply
  12. alex15650

    Я рад. Спасибо! )

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *