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

30.12.19

Разработка - Универсальные функции

Процедуры и функции раскладывают произвольную строку адрес в структуру по ключевым словам.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Универсальные функции разложение произвольной строки адреса в структуру:
.epf 7,25Kb
70 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

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

&НаСервере
Функция ПолучитьСоответствиеДанных()
	МассивИндекс = Новый Массив;
	МассивИндекс.Добавить("Тип_Число");
	
	МассивРайон = Новый Массив;
	МассивРайон.Добавить(" Р-Н");
	МассивРайон.Добавить(" РАЙОН");
	
	МассивОбласть = Новый Массив;
	МассивОбласть.Добавить(" ОБЛ");
	МассивОбласть.Добавить(" РЕСП");
	МассивОбласть.Добавить(" КРАЙ");
	МассивОбласть.Добавить("МО");
 	
	МассивГород = Новый Массив;
	МассивГород.Добавить(" Г");
 	
	МассивПоселение = Новый Массив;
 	МассивПоселение.Добавить(" АУЛ");
 	МассивПоселение.Добавить(" П");
 	МассивПоселение.Добавить(" Х");
	МассивПоселение.Добавить(" С/П");
	МассивПоселение.Добавить("СЕЛА");
	МассивПоселение.Добавить("СЕЛО");
	
	МассивУлица = Новый Массив;
	МассивУлица.Добавить(" УЛ");
  	МассивУлица.Добавить(" МКР");
	МассивУлица.Добавить(" С");
	МассивУлица.Добавить(" ДОР");
	МассивУлица.Добавить(" Ш");
	МассивУлица.Добавить(" ПЕР");
	МассивУлица.Добавить(" ПРОЕЗД");
	МассивУлица.Добавить(" ПР-КТ");
	МассивУлица.Добавить("ТЕРРИТОРИЯ");

	МассивДом = Новый Массив;
	МассивДом.Добавить("ДОМ №");
	//МассивДом.Добавить("СТРОЕНИЕ");
	МассивДом.Добавить("ВЛАДЕНИЕ №");
	
   	МассивКорпус = Новый Массив;
	МассивКорпус.Добавить("КОРПУС");
 	МассивКорпус.Добавить("СТРОЕНИЕ");
 	МассивКорпус.Добавить("ПРОМПЛОЩАДКА №");
 	
	МассивКвартира = Новый Массив;
	МассивКвартира.Добавить("КВ.");
 	МассивКвартира.Добавить("ОФ.");
 	МассивКвартира.Добавить("БОКС");
 	МассивКвартира.Добавить("ПОМЕЩЕНИЕ");
	
 	Результат = Новый Соответствие;
	Результат.Вставить("Индекс",	Новый Структура("Данные,УдалитьИзЗначения",МассивИндекс,	Ложь));
	Результат.Вставить("Район",		Новый Структура("Данные,УдалитьИзЗначения",МассивРайон,		Ложь));
	Результат.Вставить("Область",	Новый Структура("Данные,УдалитьИзЗначения",МассивОбласть,	Ложь));
	Результат.Вставить("Город",		Новый Структура("Данные,УдалитьИзЗначения",МассивГород,		Ложь));
	Результат.Вставить("Поселение",	Новый Структура("Данные,УдалитьИзЗначения",МассивПоселение,	Ложь));
	Результат.Вставить("Улица",		Новый Структура("Данные,УдалитьИзЗначения",МассивУлица,		Ложь));
	Результат.Вставить("Дом",		Новый Структура("Данные,УдалитьИзЗначения",МассивДом,		Истина));
 	Результат.Вставить("Корпус",	Новый Структура("Данные,УдалитьИзЗначения",МассивКорпус,	Истина));
	Результат.Вставить("Квартира",	Новый Структура("Данные,УдалитьИзЗначения",МассивКвартира,	Истина));
	
	
	СтрокаРеквизитов = "Представление";
	Для каждого Реквизит из Результат Цикл
		СтрокаРеквизитов = СтрокаРеквизитов + ","+ СокрЛП(Реквизит.Ключ);
	КонецЦикла;
	
	Возврат Новый Структура("Результат,СтрокаРеквизитов",Результат,СтрокаРеквизитов);
КонецФункции

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

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

&НаКлиенте
Функция _РазложитьАдрес(СтрокаАдреса)
	
	Данные = ПолучитьСоответствиеДанных();
	Результат = Новый Структура(Данные.СтрокаРеквизитов);
	СоставАдреса = Разложить(СокрЛП(СтрокаАдреса),",");
	Результат.Представление = СокрЛП(СтрокаАдреса);
	ДанныеКонтроля = Данные.результат;
	Для каждого Состав из СоставАдреса Цикл	
		Для каждого Контроль из ДанныеКонтроля Цикл
			ЗначениеКлюч = Контроль.Ключ;
			Значение = Контроль.Значение;
			Для каждого Строка из Значение.Данные  Цикл	
				Если Строка = "Тип_Число" ТОгда
					Попытка
						_Число = Число(СокрЛП(Состав));
						Если _Число <> 0 Тогда
							Результат[ЗначениеКлюч] = СокрЛП(Состав);
						КонецЕсли;
					Исключение
					КонецПопытки;
				КонецЕсли;	
				Если стрНайти(ВРЕГ(Состав),ВРЕГ(Строка)) <> 0 ТОгда
					Если Значение.УдалитьИзЗначения ТОгда
						Результат[ЗначениеКлюч] = СокрЛП(стрЗаменить(ВРЕГ(СокрЛП(Состав)),ВРЕГ(Строка),""));
					Иначе
						Результат[ЗначениеКлюч] = СокрЛП(Состав);
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;						
		КонецЦикла;			
	КонецЦикла;
	Возврат Результат;
КонецФункции

 

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


    СтрокаАдрес = "..........сама строка адреса.......";

	Ответ = _РазложитьАдрес(СтрокаАдрес);

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

разложение произвольной строки адреса

См. также

Универсальные функции Работа с интерфейсом Программист 1С v8.3 Бесплатно (free)

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

14.05.2025    4004    DeerCven    9    

48

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    42840    dimanich70    83    

158

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6334    6    John_d    12    

58

Универсальные функции Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    52237    atdonya    31    

67

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

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8085    ke.92@mail.ru    17    

66

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

28.08.2023    21600    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Vlan 36 30.12.19 11:46 Сейчас в теме
У Вас ТЕРРИТОРИЯ с ошибкой.
3. user774630 30.12.19 12:35 Сейчас в теме
(1) +1
МассивУлица.Добавить("ТЕРРИТРОИЯ");
4. vik070777 276 30.12.19 12:39 Сейчас в теме
(3) Найдешь ошибку прими за улыбку
6. vik070777 276 30.12.19 12:42 Сейчас в теме
2. FesenkoA 59 30.12.19 12:07 Сейчас в теме
Ненависти пост:

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

Извините, выговорился
zif74; AlexK_2012; товарищ Ын; sogesti; manlak; AnatolPopov; mrChOP93; +7 Ответить
5. vik070777 276 30.12.19 12:40 Сейчас в теме
(2) Так то да, но в 1С 7.7. есть конфигурации как бы не вносили все равно абра кадабра получается, при переносе данных с этим приходится бороться :)
10. AnatolPopov 175 05.01.20 00:38 Сейчас в теме
(2) Как я вас понимаю... ;)
Я на ваш крик души длинный ответ написал:
https://infostart.ru/public/1176209/
7. AnatolPopov 175 30.12.19 14:40 Сейчас в теме
Если интересно, на каникулах поделюсь, как я делал сравнение адресов, введенных с разной степенью небрежности ;)
Там не было как таковой задачи разложить адрес, а надо было сопоставить всякие разные данные из двух карточек, взятых из разных баз, и решить, относятся ли они к одному и тому же гражданину. В частности, сравнить адреса. В итоге решил просто приводить адреса к некоему формализованному виду и сравнивать то, что получилось.
8. vik070777 276 30.12.19 16:13 Сейчас в теме
(7)Весьма интересно, опубликуйте и скиньте сюда ссылку для ознакомления)
9. AnatolPopov 175 05.01.20 00:32 Сейчас в теме
11. пользователь 27.10.20 11:37
Сообщение было скрыто модератором.
...
12. MsGoldenfold 12.01.22 07:58 Сейчас в теме
Добрый день! Возможна ли пакетная обработка? Например, обработать 200 адресов за раз.
13. vik070777 276 12.01.22 12:58 Сейчас в теме
Ответ = _РазложитьАдрес(СтрокаАдрес);

Вы можете данную строку запустить в цикле списка адресов для разложения
Для отправки сообщения требуется регистрация/авторизация