Идентификатор адреса ФИАС в ERP

1. XOCTEP 116 07.11.18 22:56 Сейчас в теме
Доброго времени суток.
Подскажите, кто знает. Как в ERP получить идентификатор адреса ФИАС?
Перелазил:
- РС "Адресные объекты" - в нем есть ИД, то нет домов, только до улиц детализация.
- РС "Дома здания строения" - не понял что в нем хранится
- РС "Дополнительные адресные сведения" - хранит различные коды адреса, видимо по идентификатору.

Есть у кого мысли или опыт?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. de0nis 449 31.01.19 12:09 Сейчас в теме
(1) Смотрел в документообороте, думаю в ERP тоже самое. РС "Дома здания строения" есть реквизит Строения. В нём в хранилище значений хранится зашифрованная информация по домам Адресного объекта - улицы (через идентификатор в реквизите АдресныйОбъект связан с РС "АдресныеОбъекты").

Есть процедура АдресныйКлассификаторСлужебный.СписокДомов() - которая разбирает данные из поля Строения и возвращает их в таблице значений. Одно из полей этой таблицы Идентификатор адреса. Сама расшифровка адреса поля в процедуре АдресныйКлассификаторСлужебный.ИзвлечьСписокДомов()

Процедура ИзвлечьСписокДомов(СтрокаСоСпискомДомов, СтрокаПоиска, ВариантыДомов, Запись, ТочноеСовпадение)
	
	ТипЧисло = Новый ОписаниеТипов("Число");
	МассивДомов = СтрРазделить(СтрокаСоСпискомДомов, Символы.Таб, Ложь);
	
	НаименованиеЗданийИСтроений = НаименованиеВладенийИСтроений();
	
	Для каждого Дом Из МассивДомов Цикл
		ИдентификаторДома = Лев(Дом, 24);
		НомерДома = СтрРазделить(Сред(Дом, 25), "~", Истина);
		
			ОписаниеДома = ОписаниеДома();
			ОписаниеДома.Идентификатор = УникальныйИдентификаторИзСтроки64(Лев(Дом, 24));
			Если ЗначениеЗаполнено(НомерДома[0]) Тогда
				ОписаниеДома.ВидВладения      = ТипЧисло.ПривестиЗначение(Лев(НомерДома[0], 1));
				ОписаниеДома.Дом              = Сред(НомерДома[0], 2);
				ДомЧислом = Формат(НомерДомаЧислом(ОписаниеДома.Дом), "ЧЦ=4; ЧН=; ЧВН=; ЧГ=0; ЧФ=1Ч");
				Если ЗначениеЗаполнено(ОписаниеДома.ВидВладения) Тогда
					ОписаниеДома.НазваниеВладения = НаименованиеЗданийИСтроений.Владения.Получить(ОписаниеДома.ВидВладения);
				КонецЕсли;
			Иначе
				ДомЧислом = "10000";
			КонецЕсли;
Показать


Это если нет адреса в формате XML или JSON. Если адрес вводился из ФИАС в контактную информацию, то код будет примерно такой:

ПолученныйАдрес = УправлениеКонтактнойИнформациейСлужебный.СтрокаJSONВСтруктуру(СтрокаКонтактнойИнформации.Значение);
Адрес = РаботаСАдресамиКлиентСервер.ОписаниеНовойКонтактнойИнформации(Тип_Адрес);
		ЗаполнитьЗначенияСвойств(Адрес, ПолученныйАдрес);
		
ИдентификаторФИАС = Новый УникальныйИдентификатор(?(ПустаяСтрока(Адрес.ID), "00000000-0000-0000-0000-000000000000", Адрес.ID)); 


Всё приведено для документооборота, но т.к. используется БСП и там и там, то в ERP должно быть аналогично, может отличаются имена модулей или процедур.
4. XOCTEP 116 31.01.19 17:00 Сейчас в теме
(3) Спасибо за идею, правда уже поздно. Сделали через ИД улицы.
5. de0nis 449 01.02.19 13:54 Сейчас в теме
(4) Сам сижу разбираюсь сейчас, информации как-то тоже не густо. Только задача у меня наоборот - есть идентификатор, нужно адрес получить.
6. mvxyz 322 25.06.21 17:55 Сейчас в теме
7. de0nis 449 26.06.21 00:06 Сейчас в теме
(6) в документообороте - да. Код могу чуть позже скинуть, если надо. Правда конфа давно не обновлялась.
8. mvxyz 322 26.06.21 16:18 Сейчас в теме
(7)Буду признателен за код. Спасибо!
9. de0nis 449 29.06.21 17:42 Сейчас в теме
(8) Немножко обманул. Много времени прошло, уже точно не помню. По конечному идентификатору адреса (HouseId) не получилось, т.к. он в отдельном регистре "Дома здания строения" и хранится в ХранилищеЗначений. Но в моей задаче была возможность получить идентификатор улицы, по нему, уже выбрать список домов из хранилища.

Функция примерно такая:
СписокДомов = АдресныйКлассификаторСлужебный.СписокДомов(Новый УникальныйИдентификатор(ИдентификаторУлицы), "", 4000);
	СтрокаВыбранногоДома = СписокДомов.Найти(Новый УникальныйИдентификатор(ИдентификаторАдреса), "Идентификатор");
	
	Если СтрокаВыбранногоДома = неопределено Тогда
		СообщениеВЛог("Идентификатор улицы по идентификатору адреса '"+ИдентификаторАдреса+"' получен, но не найдена строка дома по этому ижентификатору.", "Предупреждение");	
		Возврат ДанныеВыбораВСфободнойФорме(СтрокаАдреса);
	КонецЕсли;
	
	МассивКорпусДом = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаВыбранногоДома.Представление,",");
	Если МассивКорпусДом.Количество() > 1 Тогда
		Строение = СокрЛП(СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаВыбранногоДома.Представление,",")[1]);	
	КонецЕсли;	
	
	АдресПоУлицеВJSONВ = РаботаСАдресами.АдресПоИдентификатору(ИдентификаторУлицы,Новый Структура("АдресВJSON, НомерДома, НомерСтроения ,ДополнительнаяИнформация", 
		Истина, СтрокаВыбранногоДома.Дом, Строение, СтрокаАдреса)); 
		
	СтруктураАдреса = УправлениеКонтактнойИнформациейСлужебный.СтрокаJSONВСтруктуру(АдресПоУлицеВJSONВ);
	СтруктураАдреса.id = ИдентификаторАдреса;
	СтруктураАдреса.houseId = ИдентификаторАдреса; 
	СтруктураАдреса.country = "РОССИЯ";
	СтруктураАдреса.CountryCode = "643";
	Если МассивКорпусДом.Количество() > 2 Тогда 
		// Есть и корпус и литера.	
		Для сч = 2 по МассивКорпусДом.Количество()-1 Цикл 
			ОписаниеСтроения = РазделитьДомаСтроения(МассивКорпусДом[сч], НСтр("ru='Корпус'"));
			Строение = УправлениеКонтактнойИнформациейКлиентСервер.ЗначениеСтроенияИлиПомещения(ОписаниеСтроения.Тип,  ОписаниеСтроения.Номер);
			СтруктураАдреса.buildings.Добавить(Строение);
		КонецЦикла;	
	КонецЕсли;
	
	Для каждого Элемент из СтруктураАдреса.buildings Цикл
		Элемент.type = ТРег(СокрЛП(Элемент.type));	                                                          
	КонецЦикла;	
	
	Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(СтруктураАдреса);
	КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзJSONВXML(СтруктураАдреса, Перечисления.ТипыКонтактнойИнформации.Адрес);
	
	ДанныеВыбора = Новый Структура;
	ДанныеВыбора.Вставить("КонтактнаяИнформация", КонтактнаяИнформация);
	ДанныеВыбора.Вставить("Значение", Значение);
	ДанныеВыбора.Вставить("Представление", СтруктураАдреса.Value);
	ДанныеВыбора.Вставить("Комментарий", СтруктураАдреса.Comment);
	ДанныеВыбора.Вставить("ВведеноВСвободнойФорме",
		УправлениеКонтактнойИнформациейСлужебный.АдресВведенВСвободнойФорме(СтруктураАдреса));
	ДанныеВыбора.Вставить("АдресВВидеГиперссылки", Ложь);
	// Подавляем перенос строк в возвращаемом отдельно представлении.
	ДанныеВыбора.Представление = СокрЛП(СтрЗаменить(ДанныеВыбора.Представление, Символы.ПС, " "));
	
	ДанныеВыбора.Вставить("Страна", СтруктураАдреса.country);
	ДанныеВыбора.Вставить("Регион", СтруктураАдреса.area);
	ДанныеВыбора.Вставить("Город", СтруктураАдреса.city);
	
	Возврат ДанныеВыбора;
Показать
10. de0nis 449 29.06.21 17:51 Сейчас в теме
(8) Если идентификатора улицы нет, то думаю проще будет в сторону какого-нт веб-сервиса покопать, на пример ahunter.ru - он правда платный. Или завести отдельный РС, куда извлечь данные из хранилища РС "Дома здания строения", на пример, соответствие идентификатора улицы или идентификатора дома, но на размере базы скорее всего негативно скажется.
+ ещё бывают варианты, когда нет улицы, тогда дома надо получать по идентификатору нас. пункта.
11. mvxyz 322 29.06.21 17:52 Сейчас в теме
2. nomadon 367 06.12.18 16:59 Сейчас в теме
В ФИАС данные это строка, проверяется по XDTO или через вэб сервис 1С. Этот механизм позволяет ответить на вопрос, если такой адрес в базе ФИАС или и нет. Идентификатор адреса - собственно строка адреса
user1694564; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот