партнер компании 1с-битрикс
сайт фрилансера Сергея Эстрина
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
Универсальная галерея - модуль для битрикс
Это форум по решению для битрикс «Модуль Классификатор адресов.WEB (архив)».
Страницы: 1
Ответить
RSS
Поиск по индексу, Возможность поиска местоположений по индексу
 
Здравствуйте. Подскажите можно ли с помощью имеющегося API получить местоположение основываясь на индексе - т.е. имеется индекс 183038, при обращении через API получаем г. Мурманск, ул. Миронова, д. 3. Видел есть компонент который позволяет по адресу в итоге получить индекс, хотелось бы решить обратную задачу - по индексу - адрес.
 
Алексей, здравствуйте! С помощью функции SKladrEntry::GetList можно определить код КЛАДР для индекса, если выбрать с фильтром по индексу элемент. Потом, например, с помощью функции SKladr::GetPostAddrString получить адрес по этому коду КЛАДР в виде строки, или с помощью SKladr::GetPostAddr в виде массива.

Описание api: http://g-rain-design.ru/components/kladr/api/

Если что-то непонятно из описания api, можно посмотреть в коде модуля, если у вас он зарегистрирован. Например, примеры использования функции SKladrEntry::GetList есть в разных функциях.
 
В код я и посмотрел (и в принципе подход через  SKladrEntry::GetList сразу "заприметил";), но в том то и дело код
$arRes = SKladrEntry::GetList("", array("NAME"=>"ASC";), "00", array("ZIP" => "183038";),
array("NAME","CODE","SOCR","ZIP";));
в явном виде обращается к регионам. Даже что бы понять какую таблицу выбрать для поиска и фильтрации - необходим код.
 
Алексей,  у меня сейчас нет под рукой сайта с кладром чтобы точно сказать, но может получится сначала определить код региона через SKladrEntry::GetList, с фильтром array("ZIP" => "183%") или array("ZIP" => "183000"), а потом использовать полученный двузначный код региона уже при выборке адреса, т.е. при следующем вызове SKladrEntry::GetList. Например, у региона Санкт-Петербург индекс 198000, я не помню точно у всех регионов аналогично или нет, посмотрите, если да, то этот способ должен работать.
 
Или еще другой вариант: выбрать с помощью SKladrEntry::GetList все регионы, потом сделать SQL запрос из нескольких таблиц. Сложность состоит в том, что сначала искать в таблицах с домами, потом, если ничего не найдено, в таблицах с улицами, а если не найдено там, то в таблицах с остальными уровнями кладр (1-4).

Вот структура таблиц:

Цитата
4. Таблицы с данными регионов

Для каждого региона - 4 таблицы: g_kladr_kladr_NN, g_kladr_street_NN, g_kladr_doma_NN, g_kladr_altnames_NN, где NN - двузначный код региона.

Таблица g_kladr_kladr_NN

Стандартные поля КЛАДР:

Поле      Тип           Ноль      По умолчанию
NAME     varchar(40)    Да      NULL
SOCR     varchar(10)    Да      NULL
CODE     char(13)     Да      NULL
ZIP     varchar(6)     Да      NULL
GNINMB     varchar(4)     Да      NULL
UNO     varchar(4)     Да      NULL
OCATD     varchar(11)    Да      NULL
STATUS     varchar(1)     Да      NULL

Дополнительные поля:

Поле     Тип           Ноль      По умолчанию    Описание
ACTIVE    char(1)        Нет        'Y'                Активность
SORT    int(11)        Нет        100                Сортировка

Таблица g_kladr_street_NN

Стандартные поля КЛАДР

Поле      Тип           Ноль      По умолчанию
NAME     varchar(40)    Да      NULL
SOCR     varchar(10)    Да      NULL
CODE     char(17)     Да      NULL
ZIP     varchar(6)     Да      NULL
GNINMB     varchar(4)     Да      NULL
UNO     varchar(4)     Да      NULL
OCATD     varchar(11)    Да      NULL

Дополнительные поля:

Поле     Тип           Ноль      По умолчанию    Описание
ACTIVE    char(1)        Нет        'Y'                Активность
SORT    int(11)        Нет        100                Сортировка

Таблица g_kladr_doma_NN

Стандартные поля КЛАДР:

Поле      Тип           Ноль      По умолчанию
NAME     varchar(40)    Да      NULL
KORP     varchar(10)    Да      NULL
SOCR     varchar(10)    Да      NULL
CODE     char(19)     Да      NULL
ZIP     varchar(6)     Да      NULL
GNINMB     varchar(4)     Да      NULL
UNO     varchar(4)     Да      NULL
OCATD     varchar(11)    Да      NULL
Таблицы создаются только если загружен соответствующий регион, поэтому нужно сначала выбрать какие регионы загружены с помощью SKladrEntry::GetList.

Но сами sql запросы будет несложные, хоть и длинные (просто названия нескольких таблиц указываются через запятую в отличие от выборки из одной таблицы): SQL-запрос на выборку из нескольких таблиц

CDatabase::Query

Таким образом можно сделать функцию для поиска по индексу.
Страницы: 1
Ответить
Читают тему
Форма ответов
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы