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

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

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

В наличии

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

Категория:

Описание

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

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

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

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

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

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

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

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

 

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


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

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

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

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

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

has been added to your cart:
Оформление заказа