Мой адрес не дом и не улица… Размышления об адресном классификаторе

30.08.13

Разработка - Математика и алгоритмы

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

Большинство профессиональных одинэсовцев имеет представление, что адресные классификаторы – это такие огромные таблицы, в которых множество непонятных буковок и циферок, но которые очень нужны бухгалтерам. Причем известна и другая истина – содержимое классификаторов никак не влияет на ведение учета. Пусть эти таблицы полностью пусты, или классификаторы туда загружены дважды/трижды или не до конца, нашей базе совершенно безразлично.

В рамках настоящей статьи попробуем разобраться с этим странным справочником с точки зрения программиста. Материал может быть полезен,  к примеру, в случаях, когда требуется:

- подкорректировать обработку загрузки классификатора в ИБ;

- самостоятельно организовать загрузку части адресной информации;

- использовать данные адресного классификатора для формирования адреса в собственных разработках.

 

Сначала рассмотрим вопрос: «А зачем вообще нужен адресный классификатор?».

Ответ очевиден – для стандартизации адресных данных. Например, в Санкт-Петербурге есть улица Олеко Дундича. Название, казалось бы, простое, но встречается множество вариантов написания названия этой улицы: ул. Олеко Дундича, ул. О. Дундича, Дундича О. улица. Всем понятно, что речь идет об одной и той же улице, но при электронной передаче адресной информации все будет сложнее. Для решения проблемы ФНС России периодически выпускает адресные классификаторы (таблицу всех адресов страны с почтовыми индексами) и призывает придерживаться установленных в них географических наименований. Актуальные версии адресных классификаторов размещаются на сайте ГНИВЦ в разделе «Классификатор» 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)

 

  1. Определим длину кода – 24 символа. Под код региона отводится 1 символ. Находим регион с кодом 1. Полный код 100000000000000000000000 – Республика Адыгея
  2. 3 следующих разряда – код района. Здесь 000 – не применяется.
  3. 3 следующих разряда – код города. Здесь 001. Находим элемент с кодом 1000001. Полный код 100000100000000000000000 – г. Майкоп.
  4. 3 следующих разряда – населенный пункт. Здесь 000 – не применяется.
  5. 4 следующих разряда – код улицы. Здесь 0021. Находим элемент с кодом 10000010000021. Полный код 100000100000210000000000 – Верещагина ул.
  6. Последние из используемых разрядов – условный код дома. Обозначается как 0001. Полный код 100000100000210001000000. Имеет индекс 385002, в отличии от 100000100000210002000000, для домов ул. Верещагина, имеющих индекс 385008.

 

Пример обратного алгоритма – сервис для пользовательского ввода адреса

  1. Выбор начинается с ввода региона (фильтр отбора ТипАдресногоЭлемента=1) – обязательного реквизита. Остальные составные части адреса должны быть недоступны.
  2. Должен быть доступен выбор: района/города/нас. пункта/улицы с отбором по выбранному региону (фильтр отбора ТипАдресногоЭлемента=2/3/4/5 и КодРегионаВКоде = Коду выбранного региона). Выбор улицы при единственном заполненной составляющей – Регионе возможен только для трех регионов: г. Москва (77), г. Санкт-Петербург (78) и Байконур (99)
  3. После выбора вышестоящей составляющей адреса, на нижестоящие накладывается соответствующий фильтр: район/город/нас. пункт.
  4. После выбора города/нас. пункта/улицы допустим выбор групп номеров домов с соответствующим отбором, или наоборот – нахождение элемента классификатора 6-го уровня по введенному номеру. Далее можно подставлять соответствующий почтовый индекс. При необходимости можно организовать ввод номера квартиры. На этом ввод адреса завершается.

 

Для манипуляций с данными классификатора удобно использовать экспортные процедуры и функции общего модуля «УправлениеКонтактнойИнформацией». Вот некоторые из них.

 

Функция ПолучитьПолноеНазвание(Знач КодЭлемента, НачальныйУровеньДетализации = 1, КонечныйУровеньДетализации = 6)

-Формирует строку полного адреса для записи регистра классификатора с кодом «КодЭлемента». При необходимости полноту записи можно ограничить, регулируя НачальныйУровеньДетализации и КонечныйУровеньДетализации.

 

Пример:

 

УправлениеКонтактнойИнформацией.ПолучитьПолноеНазвание(8900000700000470003000000)

Вернет значение:

Ямало-Ненецкий АО, Ноябрьск г, Советская ул, 90А,94,96А,98А,107 ДОМ

 

Процедура ПолучитьПоКодуАдресногоЭлементаЕгоКомпоненты(КодАдресногоЭлемента, Регион, Район, Город, НаселенныйПункт, Улица, Дом)

- Раскладывает запись регистра классификатора (элемент с кодом КодАдресногоЭлемента) на составляющие. Результаты будут переданы в переменные-аргументы Регион, Район, Город, НаселенныйПункт, Улица, Дом

 

Функция ПолучитьИндекс(Знач НазваниеРегиона, Знач НазваниеРайона, Знач НазваниеГорода, Знач НазваниеНаселенногоПункта, Знач НазваниеУлицы, Знач НомерДома, Знач НомерКорпуса)

- определяет индекс по переданным региону, району, городу, населенному пункту, улице, дому и корпусу.

 

Пример:

 

УправлениеКонтактнойИнформацией.ПолучитьИндекс("Санкт-Петербург",,,,"Невский",100,)

Вернет значение:

191025

 

Примечание:

В форме списка записей регистра сведений АдресныйКлассификатор полный код отображается с разделениями по триадам. Помните, что такое разделение не соответствует разгруппировке цифр кода по составляющим!

 

При подготовке статьи использованы описания объектов из типовых конфигураций для «1С:Предприятие 8.2».

Кладр

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1754    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4419    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7462    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7855    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4446    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8839    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7805    dusha0020    8    

70
Оставьте свое сообщение