КодыАдресаИКодыКЛАДР (БСП)

Автор: 1С
ОбщийМодуль.АдресныйКлассификаторСлужебный
БСП

Коды адреса коды. Определение кодов КЛАДР и ОКАТО, ОКТМО, налоговых инспекций ФНС и др. адреса.

// Определение кодов КЛАДР и ОКАТО, ОКТМО, налоговых инспекций ФНС и др. адреса.
//
// Параметры:
//  Адрес    - Строка - Адрес в формате XML или структура с полями адреса.
//  ИдентификаторАдресногоОбъекта - Строка - идентификатор адреса.
//  Источник - Строка - Источник получения кодов адреса, Варианты: "Сервис1С", "ЗагруженныеДанные".
// Возвращаемое значение:
//  Структура - Содержит 2 структуры: Коды адреса и Коды КЛАДР.
//
Функция КодыАдресаИКодыКЛАДР(Знач Адрес, Знач ИдентификаторАдресногоОбъекта = "", Источник = Неопределено) Экспорт
	
	Результат = КонструкторКодовАдреса();
	
	КодКЛАДРЗаполнены = Ложь;
	ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
	
	КешДомов = Новый Структура("НомерКорпуса, НомерСтроения, ТипСтроения");
	Для каждого Корпус Из Адрес.Buildings Цикл
		
		Если СтрСравнить(Корпус.Type, "Корпус") = 0 Тогда
			КешДомов.НомерКорпуса  = Корпус.Number;
		Иначе
			КешДомов.ТипСтроения   = Корпус.Type;
			КешДомов.НомерСтроения = Корпус.Number;
		КонецЕсли;
		
	КонецЦикла;
	
	Если ПустаяСтрока(ИдентификаторАдресногоОбъекта) Тогда
		Если Не ЗначениеЗаполнено(Адрес.ID) Тогда
			УстановитьИдентификаторыАдреса(Адрес, Источник);
		КонецЕсли;
		ИдентификаторАдресногоОбъекта = Адрес.ID;
	КонецЕсли;
	
	Результат.КодыАдреса.Идентификатор = ИдентификаторАдресногоОбъекта;
	
	Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] И Источник <> "Сервис1С" Тогда
		
		ОсновныеКодыЗаполнены = Ложь;
		// Основные коды 
		Если ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда
			
			СведенияОДоме = СведенияОДоме();
			
			СведенияОДоме.НомерДома     = Адрес.HouseNumber;
			СведенияОДоме.ТипДома       = Адрес.HouseType;
			СведенияОДоме.НомерКорпуса  = КешДомов.НомерКорпуса;
			СведенияОДоме.НомерСтроения = КешДомов.НомерСтроения;
			СведенияОДоме.ТипСтроения   = КешДомов.ТипСтроения;
			
			ОсновныеКодыЗаполнены = ЗаполнитьКодыАдреса(Результат.КодыАдреса, ИдентификаторАдресногоОбъекта, СведенияОДоме);
			
		КонецЕсли;
		
		КодКЛАДРЗаполнены = Ложь;
		Если ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда
			// Основные КЛАДР 
			Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
				|	АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР
				|ИЗ
				|	РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
				|ГДЕ
				|	АдресныеОбъекты.Идентификатор = &Идентификатор");
		
			Запрос.УстановитьПараметр("Идентификатор", ИдентификаторАдресногоОбъекта);
		
			РезультатЗапроса = Запрос.Выполнить();
			
			Если НЕ РезультатЗапроса.Пустой() Тогда
				
				КодКЛАДР = Формат(РезультатЗапроса.Выгрузить()[0].КодКЛАДР, "ЧГ=0");
				
				Если СтрДлина(КодКЛАДР) = 14 Тогда
					КодКЛАДР = "0" + КодКЛАДР + "00";
				ИначеЕсли СтрДлина(КодКЛАДР) = 15 Тогда
					КодКЛАДР = КодКЛАДР + "00"; // добавляем признак актуальности
				ИначеЕсли СтрДлина(КодКЛАДР) = 16 Тогда
					КодКЛАДР = "0" + КодКЛАДР;
				КонецЕсли;
				Результат.КодыАдреса.КодКЛАДР = КодКЛАДР;
				СформироватьКодыКЛАДР(КодКЛАДР, Адрес, Результат.КодыКЛАДР);
				КодКЛАДРЗаполнены = Истина;
				
			КонецЕсли;
		КонецЕсли;
		
		Если КодКЛАДРЗаполнены И ОсновныеКодыЗаполнены Тогда
			
			Возврат Результат;
			
		КонецЕсли;
	
	КонецЕсли;
	
	// Получаем код КЛАДР из веб-сервиса.
	Если ЗагруженныеАдресныеСведения["КлассификаторДоступен"] Или Источник = "Сервис1С" Тогда
		
		Если ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда
			ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("selectByCode?code=%1&codeType=ID",
			Строка(ИдентификаторАдресногоОбъекта));
			
			РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
			
			Если НЕ РезультатВебСервис.Отказ И РезультатВебСервис.Данные.Количество() > 0 Тогда
				
				Сведения = РезультатВебСервис.Данные[0];
				Если Не КодКЛАДРЗаполнены Тогда
					Результат.КодыАдреса.КодКЛАДР = Сведения.codeKLADR;
					СформироватьКодыКЛАДР(Результат.КодыАдреса.КодКЛАДР, Адрес, Результат.КодыКЛАДР);
				КонецЕсли;
				
				Результат.КодыАдреса.КодКЛАДР = Сведения.codeKLADR;
				Результат.КодыАдреса.Идентификатор = Сведения.Id;
				Результат.КодыАдреса.ОКАТО = Сведения.okato;
				Результат.КодыАдреса.ОКТМО = Сведения.oktmo;
				Результат.КодыАдреса.КодИФНСФЛ = Сведения.ifnsFlCode;
				Результат.КодыАдреса.КодИФНСЮЛ = Сведения.ifnsUlCode;
				Результат.КодыАдреса.КодУчасткаИФНСФЛ = Сведения.ifnsFlAreaCode;
				Результат.КодыАдреса.КодУчасткаИФНСЮЛ = Сведения.ifnsUlAreaCode;
				
			КонецЕсли;
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

КодыАдреса (БСП)

СведенияОбАдресах (БСП)

СведенияОбАдресе (БСП)

КодСериализацииОбъектаАдресации (БСП)

КодСериализацииПочтовогоИндекса (БСП)

ТипОбъектаПоКодуСериализации (БСП)

ИдентификаторыАдреса (БСП)

АдресЕАЭС (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз