КонтактнаяИнформацияВСтруктуруJSON (БСП)

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

Контактная информация структуру json. Преобразует формат из XML в JSON

// Преобразует формат из XML в JSON
//
Функция КонтактнаяИнформацияВСтруктуруJSON(КонтактнаяИнформация, Представление = "") Экспорт
	
	Результат = ОписаниеНовойКонтактнойИнформации();
	
	НаименованиеСтраны = "";
	
	Если ТипЗнч(КонтактнаяИнформация) = Тип("Строка") Тогда
		Если ЭтоКонтактнаяИнформацияВXML(КонтактнаяИнформация) Тогда
			XDTOАдрес = ДесериализацияАдресаXDTO(КонтактнаяИнформация);
			Если XDTOАдрес.Свойства().Получить("Представление") <> Неопределено Тогда
				Результат.Value   = XDTOАдрес.Представление;
			КонецЕсли;
			Если XDTOАдрес.Свойства().Получить("Комментарий") <> Неопределено И ТипЗнч(XDTOАдрес.Комментарий) = Тип("Строка") Тогда
				Результат.Comment = XDTOАдрес.Комментарий;
			КонецЕсли;
		ИначеЕсли ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда
			АдресИзJSON = JSONВКонтактнуюИнформациюПоПолям(КонтактнаяИнформация);
			ЗаполнитьЗначенияСвойств(Результат, АдресИзJSON);
			УстановитьИдентификаторыАдреса(Результат);
			Возврат Результат;
		Иначе
			Возврат Результат;
		КонецЕсли;
	Иначе
		Возврат Результат;
	КонецЕсли;
	
	ПространствоИмен = ПространствоИмен();
	Состав = XDTOАдрес.Состав;
	
	Если Состав = Неопределено Тогда
		Возврат Результат;
	КонецЕсли;
	
	XDTOТип = Состав.Тип();
	
	Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")
		 Или XDTOТип = ФабрикаXDTO.Тип("http://www.v8.1c.ru/ssl/contactinfo", "Адрес") Тогда
			
			Если Состав.Свойства().Получить("Страна") <> Неопределено И ЗначениеЗаполнено(Состав.Страна) Тогда
				НаименованиеСтраны = Состав.Страна;
			Иначе
				НаименованиеСтраны = ОсновнаяСтрана();
			КонецЕсли;
			
			АдресРФ = Состав.Состав;
		
	ИначеЕсли XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен(), "АдресРФ") Тогда
		АдресРФ = Состав;
	Иначе
		Возврат Результат;
	КонецЕсли;
	
	Если АдресРФ = Неопределено Тогда
		Возврат Результат;
	ИначеЕсли ТипЗнч(АдресРФ) = Тип("Строка") Тогда
		
		Если СтрЧислоВхождений(АдресРФ, ",") = 9 Тогда
			
			Результат.AddressType = АдминистративноТерриториальныйАдрес();
			
			ЧастиАдреса = СтрРазделить(АдресРФ, ",");
			Результат.ZIPCode = ЧастиАдреса[1];
			
			НаименованиеИСокращение = НаименованиеИСокращение(ЧастиАдреса[2]);
			Результат.Area     = НаименованиеИСокращение.Наименование;
			Результат.AreaType = НаименованиеИСокращение.Сокращение;
			
			НаименованиеИСокращение = НаименованиеИСокращение(ЧастиАдреса[3]);
			Результат.District     = НаименованиеИСокращение.Наименование;
			Результат.DistrictType = НаименованиеИСокращение.Сокращение;
			
			НаименованиеИСокращение = НаименованиеИСокращение(ЧастиАдреса[4]);
			Результат.City         = НаименованиеИСокращение.Наименование;
			Результат.CityType     = НаименованиеИСокращение.Сокращение;
			
			НаименованиеИСокращение = НаименованиеИСокращение(ЧастиАдреса[5]);
			Результат.Locality     = НаименованиеИСокращение.Наименование;
			Результат.LocalityType = НаименованиеИСокращение.Сокращение;
			
			НаименованиеИСокращение = НаименованиеИСокращение(ЧастиАдреса[6]);
			Результат.Street       = НаименованиеИСокращение.Наименование;
			Результат.StreetType   = НаименованиеИСокращение.Сокращение;
			
			НаименованиеИСокращение = НаименованиеИСокращение(ЧастиАдреса[7]);
			Результат.HouseNumber  = НаименованиеИСокращение.Сокращение;
			Результат.HouseType    = НаименованиеИСокращение.Наименование;
			
			Если ЗначениеЗаполнено(ЧастиАдреса[8]) Тогда
				НаименованиеИСокращение = НаименованиеИСокращение(ЧастиАдреса[8]);
				Результат.Buildings.Добавить(ЗначениеСтроенияИлиПомещения(НаименованиеИСокращение.Сокращение, НаименованиеИСокращение.Наименование));
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ЧастиАдреса[9]) Тогда
				НаименованиеИСокращение = НаименованиеИСокращение(ЧастиАдреса[9]);
				Результат.Apartments.Добавить(ЗначениеСтроенияИлиПомещения(
				НаименованиеИСокращение.Сокращение, НаименованиеИСокращение.Наименование));
			КонецЕсли;
		КонецЕсли;
	Иначе
		
		Если ЗначениеЗаполнено(АдресРФ.Адрес_по_документу) Тогда
			Результат.AddressType = АдресВСвободнойФорме();
		Иначе
			Результат.AddressType = АдминистративноТерриториальныйАдрес();
		КонецЕсли;
		
		Результат.Country = НаименованиеСтраны;
		Результат.ZIPCode = ПочтовыйИндексАдреса(АдресРФ);
		Результат.OKTMO = Формат(АдресРФ.ОКТМО, "ЧГ=0");
		Результат.OKATO = Формат(АдресРФ.ОКАТО, "ЧГ=0");
		
		СубъектРФ = НаименованиеИСокращение(АдресРФ.СубъектРФ);
		Результат.Area     = Строка(СубъектРФ.Наименование);
		Результат.AreaType = Строка(СубъектРФ.Сокращение);
		
		РайонАдреса = НаименованиеИСокращение(РайонАдреса(АдресРФ));
		Результат.District     = Строка(РайонАдреса.Наименование);
		Результат.DistrictType = Строка(РайонАдреса.Сокращение);
		
		Город = НаименованиеИСокращение(АдресРФ.Город);
		Результат.City     = Строка(Город.Наименование);
		Результат.CityType = Строка(Город.Сокращение);
		
		НаселПункт = НаименованиеИСокращение(АдресРФ.НаселПункт);
		Результат.Locality     = Строка(НаселПункт.Наименование);
		Результат.LocalityType = Строка(НаселПункт.Сокращение);
		
		Улица = НаименованиеИСокращение(АдресРФ.Улица);
		Результат.Street     = Строка(Улица.Наименование);
		Результат.StreetType = Строка(Улица.Сокращение);
		
		ВнутригРайон = НаименованиеИСокращение(АдресРФ.ВнутригРайон);
		Результат.CityDistrict     = Строка(ВнутригРайон.Наименование);
		Результат.CityDistrictType = Строка(ВнутригРайон.Сокращение);
		
		ЗначениеДополнительныхЭлементов = ЗначениеДополнительныхЭлементов(АдресРФ);
		Если ЗначениеЗаполнено(ЗначениеДополнительныхЭлементов.ДополнительныйЭлемент) Тогда
			ДополнительныйЭлемент = НаименованиеИСокращение(ЗначениеДополнительныхЭлементов.ДополнительныйЭлемент);
			Результат.Territory     = Строка(ДополнительныйЭлемент.Наименование);
			Результат.TerritoryType = Строка(ДополнительныйЭлемент.Сокращение);
		КонецЕсли;
		Если ЗначениеЗаполнено(ЗначениеДополнительныхЭлементов.ПодчиненныйЭлемент) Тогда
			ПодчиненныйЭлемент = НаименованиеИСокращение(ЗначениеДополнительныхЭлементов.ПодчиненныйЭлемент);
			Результат.Street     = Строка(ПодчиненныйЭлемент.Наименование);
			Результат.StreetType = Строка(ПодчиненныйЭлемент.Сокращение);
		КонецЕсли;
		
		ЗданияИПомещения = ЗданияИПомещенияАдреса(АдресРФ);
		Для каждого Здание Из ЗданияИПомещения.Здания Цикл
			Если Здание.Вид = 1 Тогда
				Результат.HouseType = Здание.Тип;
				Результат.HouseNumber = Здание.Значение;
			Иначе
				Результат.Buildings.Добавить(ЗначениеСтроенияИлиПомещения(Здание.Тип, Здание.Значение));
			КонецЕсли;
		КонецЦикла;
		
		Для каждого Помещение Из ЗданияИПомещения.Помещения Цикл
			Результат.Apartments.Добавить(ЗначениеСтроенияИлиПомещения(Помещение.Тип, Помещение.Значение));
		КонецЦикла;
		
		
	КонецЕсли;
	
	УстановитьИдентификаторыАдреса(Результат);
	
	Возврат Результат;
	
КонецФункции

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

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

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

СтруктураКонтактнойИнформацииПоТипу (БСП)

КонтактнаяИнформацияОрганизации (БСП)

ПриОпределенииКонтактнойИнформацииОрганизации (БСП)

КонтактнаяИнформацияИндивидуальногоПредпринимателя (БСП)

ПараметрыФормыКонтактнойИнформации (БСП)

СтруктураВидаКонтактнойИнформации (БСП)

ПриОпределенииКонтактнойИнформацииОбособленногоПодразделения (БСП)

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