Имя: Пароль:
1C
1С v8
определить зону по адресу в 1С
0 lero84
 
10.10.18
11:36
Здравствуйте!
Есть Управление торговлей и взаимоотношениями с клиентами (CRM), редакция 2.0 (2.0.19.20). Необходимо определять зону доставки по адресу. Цену мы определять хотим сами.
У Яндекса есть конструктор карт, думаю там отрисовать зоны и проверять как-то попадание.
может есть другие варианты решения,  более простые.
Подскажите пожалуйста
1 DeeK
 
10.10.18
11:48
насколько мне известно пользование шо гугловскими шо яндексовыми картами платно
2 arsik
 
гуру
10.10.18
11:52
(0) У нас так реализовано. Работает. Зоны рисует человек в яндекс картах. Потом зоны загружаются в 1С. Далее 1С уже проверяет какой зоне принадлежит точка.
(1) Яндекс бесплатно, до определенного предела. Не помню сколько запросов в месяц.
3 DeeK
 
10.10.18
12:02
(2) 25000 в день, но
"Бесплатная версия API не предназначена для проектов с ограниченным доступом, например, когда он раздается по приглашениям или открыт только для сотрудников внутри компании."
4 Cyberhawk
 
10.10.18
12:03
Есть сервис преобразования адреса в координаты
5 Cyberhawk
 
10.10.18
12:03
Зная координаты точки и координаты границ зоны ты уже сам без всякого сервиса определишь попадание точки внутрь
6 arsik
 
гуру
10.10.18
12:14
(5) Ну да. Там само сложное по адресу координаты получить.
7 Cyberhawk
 
10.10.18
12:32
(6) https://tech.yandex.ru/maps/geocoder/
Стоимость для коммерсов от 120 тыр в год
8 lero84
 
10.10.18
13:02
всем спасибо огромное! координаты адреса получить получилось, но как зоны загрузить в 1С, или как понять координаты границ зоны..
9 arsik
 
гуру
10.10.18
13:13
(8) Вот так попробуй. Это в 8.1. Ну и в принципе этот кусок - рыба. Разберешься я думаю.
Функция ЗагрузитьКартуОнлайн()
    локСервер = "api-maps.yandex.ru";
    Соединение = кцРаботаСИнтернет.СоздатьHTTPСоединение(локСервер,,,,,Истина);
    локИмяФайла = ПолучитьИмяВременногоФайла();
    локТФ = Новый ТекстовыйДокумент;
    
    кцРаботаСИнтернет.HTTPСоединениеПолучить(Соединение,"services/constructor/1.0/js/?sid="+СокрЛП(ИД),локИмяФайла);
    локТФ.Прочитать(локИмяФайла,КодировкаТекста.UTF8);
    СтруктураСтрокой = ПолучитьСтруктуруСтрокой(локТФ.ПолучитьТекст());
    
    ТекстОшибки = "";
    СтруктураКарты = ПроцедурыОбменаССайтом.JSONparse(СтруктураСтрокой,ТекстОшибки);
    Если ТекстОшибки<>"" Тогда
        Сообщить("Ошибка разбора JSON: "+ТекстОшибки);
        Возврат Ложь;
    КонецЕсли;
    
    Для Каждого Полигон из СтруктураКарты.geoObjects.features Цикл
        Если Полигон.geometry.type = "Polygon" Тогда
            СтрокаТаблицы = дРайонов.Строки.Добавить();
            СтрокаТаблицы.ИмяПолигона = СокрЛП(Полигон.properties.name);
            для Каждого Вершина из Полигон.geometry.coordinates[0] Цикл
                СтрокаКоординат = СтрокаТаблицы.Строки.Добавить();
                СтрокаКоординат.Долгота = Вершина[0];
                СтрокаКоординат.Широта = Вершина[1];
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Истина;
КонецФункции
10 Cyberhawk
 
10.10.18
13:14
(8) Если точка левее правой границы зоны и правее левой границы зоны и выше нижней границы зоны и ниже верхней границы зоны тогда бинго конецесли
11 arsik
 
гуру
10.10.18
13:16
+(9) Вот еще без этого куска будет непонятно. Криво конечно, но работает.
Функция ПолучитьСтруктуруСтрокой(ТекстДЖ)
    Начало = Найти(ТекстДЖ,"""maps"":[{");
    врСтр = Сред(ТекстДЖ,Начало);
    Стек = 0;
    счВсего = СтрДлина(врСтр);
    Для сч = 1 по счВсего Цикл
        смв = Сред(врСтр,сч,1);
        Если смв = "[" Тогда
            Стек = Стек+1;
        ИначеЕсли смв = "]" Тогда
            Стек = Стек-1;
            Если Стек = 0 Тогда
                Прервать;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    возврат Сред(врСтр,9,сч-1);
КонецФункции
12 arsik
 
гуру
10.10.18
13:17
(10) Неверно. Вот верный вариант.
http://catalog.mista.ru/public/166497/
13 Cyberhawk
 
10.10.18
13:21
(12) Не подходит под условия в (5)
14 arsik
 
гуру
10.10.18
13:26
(13) С чего это? Чем не подходит то?
Но на самом деле сейчас мы этим, комплексным анализом, не пользуемся. Внутренняя web апи есть, которая связана с посгресной базой. У постгреса есть спец таблицы для геокоординат и запросы к ним быстрее делаются.
Ну и при комплексном анализе нужно было проверять все области. Т.к. одна область могла входить в другую. В постгресе все по щелчку пальца, + выдает все области попадания, допустим, с сортировкой по площади.
15 arsik
 
гуру
10.10.18
13:32
+(14) Что бы было понятно. Если точка внути "района города", постгре выдаст все 3 области, например по возрастанию площади.
https://i.imgur.com/nGSCJlK.png
16 Cyberhawk
 
10.10.18
13:41
(14) "сам без всякого сервиса"
17 Cyberhawk
 
10.10.18
13:45
А что за "внутренняя веб апи", локальный сервис что ли какой?
18 arsik
 
гуру
10.10.18
13:51
(16) Комплексный анализ и работает сам без всякого сервиса, только координаты точки через сервис получаем. А далее уже с загруженными ранее полигонами работаем. Технология вот отсюда https://habr.com/post/125356/. Просто на 1С код портирован.
(17) Веб-приложение (http-сервис в терминах 1С) прикрученное к постгресной базе. На входе адрес, на выходе зоны в json.
19 Cyberhawk
 
10.10.18
13:53
(18) Ага, теперь понял, спс. Географические зоны 1С помню что УГ какое-то в этом плане.
20 arsik
 
гуру
10.10.18
14:03
(19) обработка в (12) не пользуется географическими зонами. Изначально мы пробовали - но это какое то говнище.
Там 1 функция. На входе - координаты вершин полигона и координаты точки. На выходе - булево.
21 Cyberhawk
 
10.10.18
14:03
(20) Я понял. Про географические зоны просто упомянул из того, что вспомнил о них - впечатление схожее )
22 lero84
 
12.10.18
10:59
(20) Большое спасибо Вам и всем кто принимал участие!!
все поняла, уже в разработке. а то не знала как подступится к задаче)
Посылаю лучи добра и радости!!!
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой