Как разобрать адрес 1с

Обновлено: 03.07.2024

Большое количество сведений о клиентах, имеющееся в базах данных, хранятся в неудобном для автоматической обработки виде, например, адресная информация. Чаще всего она пишется в строки вида "г. Рязань ул. Электрозаводская 63". Насколько эта информация пригодна для автоматической обработки? Можно ли и нужно ли ее применять?

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

Вообще, любой анализ начинается со сбора информации об объекте. Чем больше мы знаем, тем качественнее проводимый анализ. И уж тем более обидно, когда сведения собраны, а получить от них практическую пользу невозможно.

Для нормального использования адресной информации необходимо разделить адрес на составляющие – разложить все "по полочкам".

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

При работе с большими объемами данных вы наверняка столкнетесь с проблемой дублирования информации, когда один и тот же клиент вводится в список клиентов дважды. Компания с названием "Компьютер-сервис" есть, наверно, в каждом крупном городе. В таких случаях необходимо анализировать адрес. Вот тут и возникает проблема. Один и тот же адрес каждый вводит по-своему. Не стоит винить в этом сотрудников, т.к. они пишут так, чтобы поняли другие люди. Люди то поймут, а вот программа – нет.

Но задача решаема при помощи метода, описанного ниже.

Принцип работы механизма разбора

Для начала нужно четко определиться с задачей. Наша цель – преобразовать строку адреса к форме.

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

Человек обычно способен разобрать даже самый трудно различимый адрес. Поэтому попробуем проанализировать, как же он решает эту задачу. На мнение о том, что означает тот или иной элемент в строке, влияет следующее:

  1. Характерные особенности написания объектов. Например, если строка состоит из 6 цифр подряд, то это, скорее всего, индекс.
  2. Положение термина относительно сокращений и обозначений различного рода типов объектов. Например, если встречается последовательность вида "ул. ХХХ", то, скорее всего, ХХХ – это улица.
  3. Относительное положение анализируемого слова в предложении. В России принято при написании адреса начинать с крупной административной единицы и двигаться к меньшей. Правда, в англоговорящих странах – наоборот.
  4. Если вы знаете тип этого слова, то можно сразу, особо не раздумывая, отнести его к нему. Проще говоря, Москву вы сразу отнесете к городам.

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

Реализация

Задачи такого класса как разбор адреса хорошо решаются при помощи нейросетей. Но для того, чтобы их применить нужно, проделать следующее.

Придумать способ кодирования/декодирования информации

Как известно, нейросети работают только с числовой информацией, а в строке адреса встречаются как числа, так и строки. Описанные выше принципы разбора адреса человеком позволяют достаточно качественно закодировать строку адреса – задается код для каждой категории информации – строкам, числам, сокращениям и прочее.

Подготовить обучающую выборку

За основу был взят список из 1000 адресов, написанных различными способами. Все эти адреса после кодирования были преобразованы в шаблоны.

Далее сканировался список адресов, и из них извлекались адреса, соответствующие уникальным шаблонам. Таких уникальных шаблонов оказалось 390. После этого "учитель" просмотрел все шаблоны и в каждом конкретном случае указал, к какой категории относится анализируемая часть адреса. Если встречались противоречия, т.е. такие случае, что под один и тот же шаблон подходит несколько категорий адреса, то "учитель" выбирал наиболее характерный объект. Таким образом была подготовлена обучающая выборка.

Обучение нейросети и перенос ее на сайт

Обучающая выборка была пропущена через Neural Network Wizard. Результат обучения был сохранен в nnw-файле. Наиболее сложный участок был пройден. Есть способ кодирования/декодирования и обученная нейросеть.

Обученную нейросеть можно использовать уже где угодно. Причем после обучения не требуются большие вычислительные ресурсы. Можно ее встроить куда угодно.

Область применения

Пропустив адресную информацию через систему разбора, вы получите следующее:

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

Возможно, кому-нибудь понадобится в работе.

В качестве исходных данных - процедура, выдающая соответствие с ключевыми словами и сокращениями

Причем структура соответствия и задает структуру переменной ответа

Сама процедура, которая все разбирает, весьма проста

Вызов для обработки данных происходит

Тестировалась на платформе 1С:Предприятие 8.3 (8.3.15), конфигурация УТ 11, БП 3.0, УАТ

P.S. Здесь не используются типовые процедуры и функции, поэтому нет разницы, в какой конфигурации будете это использовать

Надеюсь, кому-то данная информация облегчит жизнь)

Универсальные функции разложение произвольной строки адреса в структуру:

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

СтРАНЫЕ менеджеры, я понимаю конечно что у вас нет тех 10 секунд чтобы заполнить все поля правильно, и в дальнейшем работать а не дергать программиста, но адрес "Мех 12/25" это что? Ну вот как понять что это значит " г.Харьков ул.Василя Стуса, дом 12 кв 25", или "С СБ 120" - "г.Сумы, ул. С.Бандеры 120" ну и коронное "Умань базар", ну еперный балет, это при том что у вас А) РЛС на своих клиентов Б) Есть упрощенная форма ввода данных пользователей Ц) База клиентов не ваша личная, вам ее выдали блин, и сами вы ее вести не будете, потому что у вас нет производства, а фирма-то производит! И я уже молчу про то что телефоны пишутся в виде "0987654321" в комментарии "+1 в конце", и да, потому что номер "0987654322", но программа с таким номером не пускает, потому что это дубль, а дубль потому что это не ваш клиент, а менеджера который сейчас на больничном, и ты ж, мать щенка, его заменяешь! Почему бы при общении с клиентом не нажать на кнопку "холд", которую я специально для вас же и сделал, и включить мозг на 10 секунд, чтобы избежать потом проблем вида "ааа, мы потеряли дебеторку" "оооо, мы теперь не видим адреса, мы же в представление всегда писали" "ууууу, как теперь звонить, номер то не подходит" которые отнимут несоизмеримое количество времени

"Есть запрос такого вида<br>Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ<br> | ВТ_Суммы.Регистратор,<br> | ВТ_Суммы.ФизЛицо,<br> | ВТ_Суммы.ИсполнительныйЛист,<br> | ВТ_Суммы.Удержание КАК Сумма,<br> | ВТ_Суммы.Истец КАК ФИОПолучателя,<br> | ЕСТЬNULL(АдресаКонтрагентов.Представление, """") КАК АдресПолучателя,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.АдресПредставителя, """") КАК АдресПредставителя,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.ФамилияПредставителя, """") КАК ФамилияПредставителя,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.ИмяПредставителя, """") КАК ИмяПредставителя,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.ОтчествоПредставителя, """") КАК ОтчествоПредставителя,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.ДокСерия, """") КАК ДокСерия,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.ДокНомер, """") КАК ДокНомер,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.ДатаВыдачи, """") КАК ДатаВыдачи,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.НаименованиеУчреждения, """") КАК НаименованиеУчреждения,<br> | ВТ_Суммы.Регистратор.Организация.ИНН КАК ИННОрганизации,<br> | ВТ_Суммы.Регистратор.Организация.ОсновнойБанковскийСчет.Банк.КоррСчет КАК КСОрганизации,<br> | ВТ_Суммы.Регистратор.Организация.ОсновнойБанковскийСчет.Банк.Наименование КАК НаименованиеБанкаОрганизации,<br> | ВТ_Суммы.Регистратор.Организация.ОсновнойБанковскийСчет.НомерСчета КАК РасчетныйСчет,<br> | ВТ_Суммы.Регистратор.Организация.ОсновнойБанковскийСчет.Банк.Код КАК БИК,<br> | ВТ_Суммы.Регистратор.Организация.ОГРН КАК ОГРН,<br> | ЕСТЬNULL(АдресОрганизации.Представление, """") КАК АдресОрганизации,<br> | ЕСТЬNULL(ВТ_ДанныеПредставителя.ИндексПредставителя, """") КАК ИндексПредставителя,<br> | ЕСТЬNULL(АдресОрганизации.Поле1, """") КАК ИндексОрганизации,<br> | ВТ_НДФЛ.ФизЛицо КАК ФизЛицо1,<br> | ВТ_НДФЛ.Налог,<br> | ВТ_Начисление.Результат КАК Начисление<br> |ИЗ<br> | ВТ_Суммы КАК ВТ_Суммы<br> | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК АдресаКонтрагентов<br> | ПО ВТ_Суммы.Истец = АдресаКонтрагентов.Объект<br> | И (АдресаКонтрагентов.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))<br> | И (АдресаКонтрагентов.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ФактАдресКонтрагента))<br> | ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ДанныеПредставителя КАК ВТ_ДанныеПредставителя<br> | ПО (ИСТИНА)<br> | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК АдресОрганизации<br> | ПО ВТ_Суммы.Регистратор.Организация = АдресОрганизации.Объект<br> | И (АдресОрганизации.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес))<br> | И (АдресОрганизации.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресОрганизации))<br> | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_НДФЛ КАК ВТ_НДФЛ<br> | ПО ВТ_Суммы.ФизЛицо = ВТ_НДФЛ.ФизЛицо<br> | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Начисление КАК ВТ_Начисление<br> | ПО ВТ_Суммы.ФизЛицо = ВТ_Начисление.ФизЛицо<br> |;<br><br>АдресПолучателя пишет типа так 101001, Россия, Москва, Морская ул, дом 21, кв 2.<br><br>Мне нужно вытащить только Москва например или ул. Морская.<br><br>Структура адреса из поля представления каждый раз разная, по запросу заместо ЕСТЬNULL(АдресаКонтрагентов.Представление, """") ставлю АдресаКонтрагентов.Поле1 или Поле2-10 не выбирает ничего. Хотя по логике в регистре Контактная информация как раз там должно сидеть по отдельности каждое значение.<br><br>"

Введенный адрес в единую строку разбивается на такие составляющие, как:

Код обработки закомментирован. Используются регулярные выражения для обработки информации. В обработку также встроена функция по интерактивному просмотру работы регулярных выражений. При вводе регулярного выражения в поле "Шаблон", в поле "Результат выражения" появится результат поиска в исходной строке по введенному регулярному выражению.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Обработка для разбиения адреса на отдельные составляющие.

А если не секрет, в чём практический смысл этой обработки? Пример разбиения стороки на подстроки можно получить и из модуля конфигурации, если не полениться туда залезть.

Была задача по внесению адреса в БД. Пользователи записывали в таблицу адреса в виде одной строки. Порядок и вид записанного адреса постоянно менялся.

Чтобы разбить адрес на составляющие и корректно занести данные была написана обработка. Это лишь ее часть.
Аналогов в 1С не нашел, которые бы корректно занесли все записи.

БД Какая? Самописная или стандартная?
Если БД под 8.2 Управляемое приложение тогда лучше использовать БСП ("Библиотека стандартных подсистем")
Там адрес вводиться по КЛАДРу (Классификатору адресов) Просто и удобно.

БД стандартная. Обработка лишь помогает вытаскивать адреса в приемлемый вид для дальнейшего занесения в 1С и т.д.

Насчет КЛАДРа согласен, удобная весчь. =)

О вроде то что надо. Осталось придумать как в запросе сформировать отчет по продажам по регионам (нужно вытащить из адреса).

Не очень силен в использовании регулярных выражений, поэтому вопрос: что такое "Шаблон регулярного выражения" как пишется и для чего используется? Что такое результат форматирования?

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

Попробовал Вашу обработку и вот что получилось:
Вот пример исходной строки
,02. Бекетово,Октябрьская,36,б,
А вот что получилось:

поле "Район" = Крамаскалинский р-н
поле "Дом" = 02
Все остальные поля пустые

Для варианта: Тюменская обл, Нижнетавдинский р-н, Геолог с/т, Лесная ул, дом № 1 б
"Регион" = Тюменская обл
"Район" = Нижнетавдинский
"Дом" = 1 б

как-то не совсем айс

(6) Valerich,
Согласен, не айс =)
Поле "Шаблон" используется для написания регулярных выражений и их последующего тестирования. Вводим рег. выражение в шаблон, данные в исходную строку и в "Результат формитирования" видим что получим в итоге.

Насчет приведенных примеров. Да, он не будет их нормально обрабатывать, ибо там запятые и другие символы, не предусмотренные в рег. выражениях, которые я написал + некоторые другие моменты.

Но, думаю, что добавить изменения в рег. выражения не составит проблем для вашего случая, ведь сразу все предусмотреть невозможно. Помню, что в моей задаче раньше стояло разбить адреса, которые были записаны на подобие: "г. Тюмень, ул Одесская 56, дом 5 корп 6 425252 кв. 76".

Поэтому и ориентировал регулярки для этих примеров.

(7) Можете привести какие-нибудь примеры того, что можно вводить в шаблон, чтобы увидеть какой-то эффект, пусть даже на Ваших данных. Просто для понимания как все работает.

И как можно изменить рег выражения, чтобы понять в какую сторону двигаться в моем случае?

Пример приведу на ваших данных. Допустим есть строка ",02. Бекетово,Октябрьская,36,б,".
Чтобы вытащить оттуда улицу с номером дома (без букв, чтобы не усложнять пример) сделаем следующее выражение:
Шаблон = "[А-Я][а-я]+(,|)3"
Результат: Октябрьская,36
Принцип работы заключается в поиске по заданным параметрам. В примере первое слово начинается с большой буквы, далее идут символы нижнего регистра в произвольном количестве (для этого поставлен +), потом идет символ запятая, хотя его может и не быть. И в конце вытаскивается номер дома.

Настоятельно рекомендую прочитать две статьи выше. Регулярные выражения могучая вещь. С их помощью ищут любые данные, делают парсеры сайтов и так далее.


Введенный адрес в единую строку разбивается на такие составляющие, как:

Код обработки закомментирован. Используются регулярные выражения для обработки информации. В обработку также встроена функция по интерактивному просмотру работы регулярных выражений. При вводе регулярного выражения в поле "Шаблон", в поле "Результат выражения" появится результат поиска в исходной строке по введенному регулярному выражению.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Обработка для разбиения адреса на отдельные составляющие.

А если не секрет, в чём практический смысл этой обработки? Пример разбиения стороки на подстроки можно получить и из модуля конфигурации, если не полениться туда залезть.

Была задача по внесению адреса в БД. Пользователи записывали в таблицу адреса в виде одной строки. Порядок и вид записанного адреса постоянно менялся.

Чтобы разбить адрес на составляющие и корректно занести данные была написана обработка. Это лишь ее часть.
Аналогов в 1С не нашел, которые бы корректно занесли все записи.

БД Какая? Самописная или стандартная?
Если БД под 8.2 Управляемое приложение тогда лучше использовать БСП ("Библиотека стандартных подсистем")
Там адрес вводиться по КЛАДРу (Классификатору адресов) Просто и удобно.

БД стандартная. Обработка лишь помогает вытаскивать адреса в приемлемый вид для дальнейшего занесения в 1С и т.д.

Насчет КЛАДРа согласен, удобная весчь. =)

О вроде то что надо. Осталось придумать как в запросе сформировать отчет по продажам по регионам (нужно вытащить из адреса).

Не очень силен в использовании регулярных выражений, поэтому вопрос: что такое "Шаблон регулярного выражения" как пишется и для чего используется? Что такое результат форматирования?

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

Попробовал Вашу обработку и вот что получилось:
Вот пример исходной строки
,02. Бекетово,Октябрьская,36,б,
А вот что получилось:

поле "Район" = Крамаскалинский р-н
поле "Дом" = 02
Все остальные поля пустые

Для варианта: Тюменская обл, Нижнетавдинский р-н, Геолог с/т, Лесная ул, дом № 1 б
"Регион" = Тюменская обл
"Район" = Нижнетавдинский
"Дом" = 1 б

как-то не совсем айс

(6) Valerich,
Согласен, не айс =)
Поле "Шаблон" используется для написания регулярных выражений и их последующего тестирования. Вводим рег. выражение в шаблон, данные в исходную строку и в "Результат формитирования" видим что получим в итоге.

Насчет приведенных примеров. Да, он не будет их нормально обрабатывать, ибо там запятые и другие символы, не предусмотренные в рег. выражениях, которые я написал + некоторые другие моменты.

Но, думаю, что добавить изменения в рег. выражения не составит проблем для вашего случая, ведь сразу все предусмотреть невозможно. Помню, что в моей задаче раньше стояло разбить адреса, которые были записаны на подобие: "г. Тюмень, ул Одесская 56, дом 5 корп 6 425252 кв. 76".

Поэтому и ориентировал регулярки для этих примеров.

(7) Можете привести какие-нибудь примеры того, что можно вводить в шаблон, чтобы увидеть какой-то эффект, пусть даже на Ваших данных. Просто для понимания как все работает.

И как можно изменить рег выражения, чтобы понять в какую сторону двигаться в моем случае?

Пример приведу на ваших данных. Допустим есть строка ",02. Бекетово,Октябрьская,36,б,".
Чтобы вытащить оттуда улицу с номером дома (без букв, чтобы не усложнять пример) сделаем следующее выражение:
Шаблон = "[А-Я][а-я]+(,|)8"
Результат: Октябрьская,36
Принцип работы заключается в поиске по заданным параметрам. В примере первое слово начинается с большой буквы, далее идут символы нижнего регистра в произвольном количестве (для этого поставлен +), потом идет символ запятая, хотя его может и не быть. И в конце вытаскивается номер дома.

Настоятельно рекомендую прочитать две статьи выше. Регулярные выражения могучая вещь. С их помощью ищут любые данные, делают парсеры сайтов и так далее.

Классная вещь! Сейчас сижу именно над такой задачей - распознавания адресов. Думаю, применять можно и в ЗУП для загрузки адресов сотрудников из других (не таких правильных) систем. Интересно, можно же добавить опцию, чтобы по индексу восстанавливать часть адреса, если он задан не полно - на вашей практике часто индекс убивает "правильную часть адреса". <Регион, район, город>. (10) graphbuh,
думаю, что можно. Конкретней надо смотреть по тем данным, которые необходимо обработать. мне кажется что такими простыми рег вырами: Шаблон = "[А-Я][а-я]+(,|)5<1,3>" нормально не обработаешь, потому что получается он подходит для одного конкретного случая. Для варианта: Тюменская обл, Нижнетавдинский р-н, Геолог с/т, Лесная ул, дом № 1 б это рег. выр. уже не проканает- потому что номер уже после текстового выражения дом, а не после улицы, в примере и написано что улица не определилась. (14) a1ex4ndr, надо понимать, что в общем случае, задача слабо решаема, либо вообще нерешаема. и имхо регулярки не самый лучший способ парсинга слабоструктурированной/неструктурированной информации, но менее трудоемкий и быстрый. пригодилось - доработочка не помешает - займусь на досуге Вообщем хорошая тема для малоразвитых стран или республик. Недавно занимался подобного рода занятием в ДНР. Мало кто знает что на Украине это вообще огромная проблема по сравнению с Россией. Украина это страна в которой нет КЛАДРА или подобного рода классификатора.

Просмотры 23639

Загрузки 171

Рейтинг 32

Создание 24.09.11 11:27

Обновление 24.09.11 11:27

№ Публикации 91732

Конфигурация Конфигурации 1cv8

Операционная система Windows

Страна Россия

Вид учета Не имеет значения

Доступ к файлу Абонемент ($m)

Код открыт Не указано

См. также

Публикаций не найдено

Попробуйте расширить область поиска, проверьте поисковый запрос и повторите попытку.

Читайте также: