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

30.12.19

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

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

Файлы

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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


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

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

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

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

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

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

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

См. также

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

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

14.05.2025    5359    DeerCven    15    

57

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

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

21.05.2024    46182    dimanich70    83    

164

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

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

1 стартмани

18.03.2024    6823    6    John_d    13    

59

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

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

12.02.2024    57191    atdonya    31    

68

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

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

30.11.2023    8587    ke.92@mail.ru    17    

68

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

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

28.08.2023    22715    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 Сейчас в теме
Ответ = _РазложитьАдрес(СтрокаАдрес);

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