Внимание: расширение не является готовым продуктом, это лишь заготовка для реализации задачи по подсчёту расстояний и/или времени, затрачиваемого на транспортировку груза в Вашей конфигурации. Реализована на платформе 8.3.23.1865 в режиме совместимости 8.3.14, но подходит для любой конфигурации любой версии, реализованной на платформе 1С 8.3.
Позволяет:
- Определить координаты точек маршрута, объявленные адресом в свободной форме;
- Отсортировать маршрут по кратчайшим расстояниям;
- Определить хордовое расстояние между двумя точками, заданными координатами;
- Получить расстояния перегонов, общее расстояние маршрута, а также расчётное время, которое будет затрачено на маршрут.
Используемые объекты:
- Перечисление "Виды сервисов Яндекс API" содержит фиксированный список всех сервисов Яндекс.API;
- Справочник "Настройки Яндекс API". Предназначен для хранения и использования настроек соответствующих сервисов. Содержит в себе автоматически заполняемую табличную часть "Параметры запроса", содержащую в себе все возможные параметры, отправляемые в Яндекс при осуществлении запроса на получение данных;
- Регистр сведений "Координаты" содержит в себе единственное измерение "Пользовательский адрес" (предполагается, что передаваемый адрес может не соответствовать стандартам), ресурсы "Долгота" и "Широта", а также реквизиты "Эталонный адрес", "Почтовый индекс" и "Локализация" (может потребоваться для расчёта стоимости доставки), которые заполняются из полученных данных от сервиса (также, как и координаты);
- Общий серверный модуль "ЯндексAPI". Состав модуля:
- Функция ПолучитьНастройкуСервиса - Возвращает структуру с настройками;
- Функция СформироватьЗапросДляОтправки - формирует HTTP-запрос для отправки сервису;
- Функция ЗапроситьДанныеСервисаЯндекс - возвращает HTTPОтвет от сервиса;
- Функция ОпределитьКоординатыПоАдресу - возвращает структуру с ключами "lon,lat";
- Функция ПолучитьРасстояниеМаршрута - возвращает общее расстояние в километрах;
- Функция ПолучитьМетрикуМаршрута - возвращает массив из структур, каждая из которых содержит в себе параметры <РасстояниеМетров> и <ВремяСекунд>;
- Функция ОтсортироватьМаршрут - возвращает таблицу значений, которая отсортирована от точки <Долгота, Широта>;
- Функция ТочкаВходитВОбласть - возвращает булевый признак вхождения указанной координатами точки в полигон, обозначенный массивом точек, каждая из которых заявлена координатами;
- Функция ПолучитьРасстояниеОтТочкиДоТочки - возвращает расстояние от точки до точки по прямой в километрах.
Пример использования:
// ИсходнаяТаблицаЗначений должна содержать в себе две обязательных колонки типа Число{14,6} <Долгота> и <Широта>
Функция СортировкаТаблицыМаршрута(Знач ИсходнаяТаблицаЗначений)
ИсходнаяТаблицаЗначений = ЯндексAPI.ОтсортироватьМаршрут(ИсходнаяТаблицаЗначений, ДолготаТочкиОтправления, ШиротаТочкиОтправления);
Результат = ИсходнаяТаблицаЗначений.СкопироватьКолонки();
Пока ИсходнаяТаблицаЗначений.Количество() > 0 Цикл
НовСтр = Результат.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, ИсходнаяТаблицаЗначений[0]);
ДолготаТочкиОтправления = ИсходнаяТаблицаЗначений[0].Долгота;
ШиротаТочкиОтправления = ИсходнаяТаблицаЗначений[0].Широта;
ИсходнаяТаблицаЗначений.Удалить(0);
Если ИсходнаяТаблицаЗначений.Количество() > 0 Тогда
ИсходнаяТаблицаЗначений = ЯндексAPI.ОтсортироватьМаршрут(ИсходнаяТаблицаЗначений, ДолготаТочкиОтправления, ШиротаТочкиОтправления);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Замечания и наблюдения:
- По невыясненной причине Яндекс обрабатывает GET-запросы только в случае, если сам запрос строкой;
- Иногда (редко) маршруты не вычисляются, Яндекс возвращает либо частично рассчитанный маршрут, либо просто пустой ответ, хотя во всех случаях с кодом 200. После длительных выяснений оказалось, что в случае перекрытия дорог Яндекс не обрабатывает маршрут и не возвращает ошибок (в поддержке обещали "подумать").