Большинство профессиональных одинэсовцев имеет представление, что адресные классификаторы – это такие огромные таблицы, в которых множество непонятных буковок и циферок, но которые очень нужны бухгалтерам. Причем известна и другая истина – содержимое классификаторов никак не влияет на ведение учета. Пусть эти таблицы полностью пусты, или классификаторы туда загружены дважды/трижды или не до конца, нашей базе совершенно безразлично.
В рамках настоящей статьи попробуем разобраться с этим странным справочником с точки зрения программиста. Материал может быть полезен, к примеру, в случаях, когда требуется:
— подкорректировать обработку загрузки классификатора в ИБ;
— самостоятельно организовать загрузку части адресной информации;
— использовать данные адресного классификатора для формирования адреса в собственных разработках.
Сначала рассмотрим вопрос: «А зачем вообще нужен адресный классификатор?».
Ответ очевиден – для стандартизации адресных данных. Например, в Санкт-Петербурге есть улица Олеко Дундича. Название, казалось бы, простое, но встречается множество вариантов написания названия этой улицы: ул. Олеко Дундича, ул. О. Дундича, Дундича О. улица. Всем понятно, что речь идет об одной и той же улице, но при электронной передаче адресной информации все будет сложнее. Для решения проблемы ФНС России периодически выпускает адресные классификаторы (таблицу всех адресов страны с почтовыми индексами) и призывает придерживаться установленных в них географических наименований. Актуальные версии адресных классификаторов размещаются на сайте ГНИВЦ в разделе «Классификатор» http://www.gnivc.ru/inf_provision/classifiers_reference/kladr/
В типовых решениях от 1С, начиная с версий для платформы 7.7, для ввода российского адреса можно (но необязательно) использовать классификатор, загруженный с сайта ГНИВЦ или диска ИТС.
В решениях для 1С: Предприятия 8 для хранения адресного классификатора применяется регистр сведений, именуемый «АдресныйКлассификатор». Существует также вспомогательный справочник «АдресныеСокращения», предназначенный для расшифровки сокращений некоторых географических наименований, содержащихся в регистре.
Справочник «АдресныеСокращения» имеет два реквизита: уровень (уровень объекта из регистра) и сокращение (используемое в регистре сокращение).
Примеры элементов справочника
Код |
Наименование |
Уровень |
Сокращение |
105 |
Область |
1 |
обл |
205 |
Автономный округ |
1 |
АО |
529 |
Улица |
5 |
ул |
Непериодический регистр сведений «АдресныйКлассификатор» имеет 7 измерений и 4 ресурса.
В измерениях содержатся коды для позиционирования с целью последующего формирования адресной строки. Самым важным измерением является Код, который содержит полный код адресного элемента в специальном формате. Предусмотрены также коды для хранения значений отдельных элементов иерархии, которые частично дублируют часть основного кода: «КодРегионаВКоде», «КодУлицыВКоде». Для организации иерархии предусмотрен также реквизит, хранящий уровень текущего элемента «ТипАдресногоЭлемента».
Например для элемента 5-го уровня Адыгея Респ, г. Майкоп, сдт. Эра дп, Дружбы ул.:
Код |
КодРегиона ВКоде |
КодРайона ВКоде |
КодГорода ВКоде |
КодНаселенного ПунктаВКоде |
КодУлицы ВКоде |
ТипАдресного Элемента |
100000104300040000000000 |
1 |
|
1 |
43 |
4 |
5 |
В ресурсах строкового типа хранятся значения элемента, соответствующий коду измерений: Наименование, сокращение, Индекс (почтовый), АльтернативныеНазвания.
Рассмотрим принцип иерархии элементов и образования кодов. Для учета всех особенностей образования российских адресов предусмотрено 6 (в ряде случаев 9) иерархий составляющих адреса, сопровождающихся 25-разрядным кодом. Если какой-то из уровней иерархии не актуален для данного адреса, то ссылка на него заменяется нулевым кодом.
Например, в элементе шестого уровня с кодом 200 000 500 000 460 001 000 000 (Башкортостан Респ, Салават г, Мостовая ул д 5), задействовано 3 из пяти возможных вышестоящих уровней. С учетом географических особенностей, данный адрес не имеет вышестоящих элементов иерархии уровня 2 (Район) и 4 (Населенный пункт).
Таблица иерархии уровней кода элементов адресного классификатора
Уровень |
Измерение |
Длина кода |
Код |
Пример |
Комментарий |
1 Регион |
КодРегионаВКоде |
2 |
ХХ00000000000000000000000
* Лидирующий X при одноразрядном коде опускается (ноль не пишется).
|
100 000 000 000 000 000 000 000 – Адыгея Респ |
Обязательный для всех нижестоящих элементов уровень. Фактическая длина 1 знак для однозначных кодов, 2 – для двухзначных. Задействованы коды 1-89 + 99 – г. Байконур |
2 Район |
КодРайонаВКоде |
3 |
YYXXX00000000000000000000
*Y – родительские разряды |
100 300 000 000 000 000 000 000 — – Адыгея Респ, Красногвардейский район |
Произвольные коды от 000 до 999. Задействованы от 000 до 061. Не путать с районом города!!! |
3 Город |
КодГородаВКоде |
3 |
YYYYYXXX00000000000000000
|
100 000 100 000 000 000 000 000 Адыгея Респ, г. Майкоп (не относится к какому-либо району) |
Не используются для городов федерального значения Москва, Санкт-Петербург. Но применяется для городов, административного подчинения в их составе, напр. Зеленоград |
4 Населенный пункт |
КодНаселенногоПунктаВКоде |
3 |
YYYYYYYYXXX00000000000000
|
100 000 100 300 000 000 000 000 — Адыгея Респ, г. Майкоп, Гавердовский п. (Поселок в подчинении города) |
Используется для обозначения любых нас. пунктов (включая поселки гор. типа), не являющихся городами. Активно применяются сокращения: нп/пгт и пр. |
5 Улица |
КодУлицыВКоде |
4 |
YYYYYYYYYYYXXXX0000000000 |
100 000 100 000 020 000 000 000 — Адыгея Респ, г. Майкоп Абрикосовая ул. |
Используется для обозначения улиц, проспектов и т.д. Не является обязательным – сущ нас пункты и даже города с адресами без улиц. Для городов федерального значения, если код города (подчиненного)/нас. пункта не указан, относится к самому городу, иначе к нас. пункту. |
6 Дом |
|
4 |
YYYYYYYYYYYYYYY0000000000 |
100 000 100 000 210 001 000 000 — Адыгея Респ, г. Майкоп Верещагина ул. Н(1-127),Ч(2-140)
*Н – нечетные номера дома
** запись вида Ч(20-998) говорит о всех четных домах, начиная с 20-го и «не обещает» наличие дома номер 998. *** Могут быть также зашифрованы номера корпусов/строений литеры и пр. |
В регистре конкретных номеров домов не содержится. Используется лишь для выделения групп домов с разными почт. индексами в пределах улицы. Если индекс одинаковый на всей улицы, данная детализация не применяется. |
Квартира |
|
4 |
Оставлены для совместимости. В адресных классификаторах 1С 8 не используются. Последние цифры любого кода всегда 000000 |
||
Код актуальности |
2 |
Полный код уникален во всем классификаторе.
В регистре предусмотрен набор ресурсов:
Наименование – наименование географического объекта, или группа номеров домов
Сокращение – используется для сокращенного (иногда и полного) обозначения типов объектов, а не сокращений наименований. Расшифровка проводится путем нахождения соответствия по справочнику «АдресныеСокращения»
Индекс – почтовый индекс, соответствующий географическому объекту. Может встречаться на различных уровнях иерархии, однако самым точным будет на нижнем уровне. Например, Санкт-Петербург 190000, г. Сестрорецк (город в подчинении Санкт-Петербурга) 197706, а дома по улице Мосина могут иметь два индекса 197706 и 197704
Альтернативные названия – ресурс иногда содержит иные или прежние названия географических объектов. В 1С используются только для визуализации, в адреса не копируются.
Примеры
Код |
Наименование |
Сокращение |
Индекс |
Альт. названия |
7 800 000 000 006 890 000 000 000 |
Ленина |
пл. |
|
|
7 800 000 000 006 900 000 000 000 |
Ленина |
ул. |
195009 |
|
700 900 000 100 020 000 000 000 |
Уянаева |
ул |
361800 |
Калинина ул,Балкарская ул, |
Рассмотрим примерный алгоритм расшифровки адреса по коду
Для элемента классификатора 1 000 001 000 0021 0001 000000 Адыгея Респ, г. Майкоп Верещагина ул. Н(1-127),Ч(2-140)
- Определим длину кода – 24 символа. Под код региона отводится 1 символ. Находим регион с кодом 1. Полный код 100000000000000000000000 – Республика Адыгея
- 3 следующих разряда – код района. Здесь 000 – не применяется.
- 3 следующих разряда – код города. Здесь 001. Находим элемент с кодом 1000001. Полный код 100000100000000000000000 – г. Майкоп.
- 3 следующих разряда – населенный пункт. Здесь 000 – не применяется.
- 4 следующих разряда – код улицы. Здесь 0021. Находим элемент с кодом 10000010000021. Полный код 100000100000210000000000 – Верещагина ул.
- Последние из используемых разрядов – условный код дома. Обозначается как 0001. Полный код 100000100000210001000000. Имеет индекс 385002, в отличии от 100000100000210002000000, для домов ул. Верещагина, имеющих индекс 385008.
Пример обратного алгоритма – сервис для пользовательского ввода адреса
- Выбор начинается с ввода региона (фильтр отбора ТипАдресногоЭлемента=1) – обязательного реквизита. Остальные составные части адреса должны быть недоступны.
- Должен быть доступен выбор: района/города/нас. пункта/улицы с отбором по выбранному региону (фильтр отбора ТипАдресногоЭлемента=2/3/4/5 и КодРегионаВКоде = Коду выбранного региона). Выбор улицы при единственном заполненной составляющей – Регионе возможен только для трех регионов: г. Москва (77), г. Санкт-Петербург (78) и Байконур (99)
- После выбора вышестоящей составляющей адреса, на нижестоящие накладывается соответствующий фильтр: район/город/нас. пункт.
- После выбора города/нас. пункта/улицы допустим выбор групп номеров домов с соответствующим отбором, или наоборот – нахождение элемента классификатора 6-го уровня по введенному номеру. Далее можно подставлять соответствующий почтовый индекс. При необходимости можно организовать ввод номера квартиры. На этом ввод адреса завершается.
Для манипуляций с данными классификатора удобно использовать экспортные процедуры и функции общего модуля «УправлениеКонтактнойИнформацией». Вот некоторые из них.
Функция ПолучитьПолноеНазвание(Знач КодЭлемента, НачальныйУровеньДетализации = 1, КонечныйУровеньДетализации = 6)
-Формирует строку полного адреса для записи регистра классификатора с кодом «КодЭлемента». При необходимости полноту записи можно ограничить, регулируя НачальныйУровеньДетализации и КонечныйУровеньДетализации.
Пример:
УправлениеКонтактнойИнформацией.ПолучитьПолноеНазвание(8900000700000470003000000)
Вернет значение:
Ямало-Ненецкий АО, Ноябрьск г, Советская ул, 90А,94,96А,98А,107 ДОМ
Процедура ПолучитьПоКодуАдресногоЭлементаЕгоКомпоненты(КодАдресногоЭлемента, Регион, Район, Город, НаселенныйПункт, Улица, Дом)
— Раскладывает запись регистра классификатора (элемент с кодом КодАдресногоЭлемента) на составляющие. Результаты будут переданы в переменные-аргументы Регион, Район, Город, НаселенныйПункт, Улица, Дом
Функция ПолучитьИндекс(Знач НазваниеРегиона, Знач НазваниеРайона, Знач НазваниеГорода, Знач НазваниеНаселенногоПункта, Знач НазваниеУлицы, Знач НомерДома, Знач НомерКорпуса)
— определяет индекс по переданным региону, району, городу, населенному пункту, улице, дому и корпусу.
Пример:
УправлениеКонтактнойИнформацией.ПолучитьИндекс(«Санкт-Петербург»,,,,»Невский»,100,)
Вернет значение:
191025
Примечание:
В форме списка записей регистра сведений АдресныйКлассификатор полный код отображается с разделениями по триадам. Помните, что такое разделение не соответствует разгруппировке цифр кода по составляющим!
При подготовке статьи использованы описания объектов из типовых конфигураций для «1С:Предприятие 8.2».