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

#Область ПрограммныйИнтерфейс

// Определяет полное наименование региона по его коду.
//
// Параметры:
//    КодСубъектаРФ - Число
//                  - Строка - код региона. Например, 50.
//
// Возвращаемое значение:
//    Строка       - наименование региона согласно ГАР. Например, "Московская область" или "Московская обл".
//    Неопределено - если регион не существует.
//
Функция НаименованиеРегионаПоКоду(КодСубъектаРФ) Экспорт
	
	НаименованиеРегиона = "";
	
	Если ТипЗнч(КодСубъектаРФ) = Тип("Число") И КодСубъектаРФ > 0 Тогда
		НаименованиеРегиона = АдресныйКлассификаторСлужебный.ПолноеНаименованиеРегионаПоКоду(КодСубъектаРФ);
	ИначеЕсли ТипЗнч(КодСубъектаРФ) = Тип("Строка") Тогда
		ТипЧисло = Новый ОписаниеТипов("Число");
		НаименованиеРегиона = АдресныйКлассификаторСлужебный.ПолноеНаименованиеРегионаПоКоду(ТипЧисло.ПривестиЗначение(КодСубъектаРФ));
	КонецЕсли;
	
	Если ПустаяСтрока(НаименованиеРегиона) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат НаименованиеРегиона;
	
КонецФункции

// Возвращает код региона по наименованию.
//
// Параметры:
//    Название - Строка - наименование или полное наименование (с сокращением) региона.
//                        Например, "Московская" или Московская обл".
//
// Возвращаемое значение:
//    Число        - код региона, например, 50.
//    Неопределено - если указанный регион не существует.
//
Функция КодРегионаПоНаименованию(Название) Экспорт
	
	НаименованиеРегиона = АдресныйКлассификаторСлужебный.АдаптацияНазванияРегиона(Название);
	
	СписокРегионов = АдресныйКлассификаторПовтИсп.СписокРегионов();
	КодСубъектаРФ = СписокРегионов.Получить(ВРег(НаименованиеРегиона));
	
	Если КодСубъектаРФ <> Неопределено Тогда 
		Возврат КодСубъектаРФ;
	КонецЕсли;

	// Если не нашли, то подсмотрим еще и в классификаторе - макете.
	Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
	СписокРегионовИзКлассификатора = Новый Соответствие;
	Для Каждого ОписаниеРегиона Из Классификатор Цикл
		ПолноеНаименование = АдресныйКлассификаторСлужебный.СоединитьНаименованиеИТипАдресногоОбъекта(
			ОписаниеРегиона.Наименование , ОписаниеРегиона.ТипОбъекта, Истина);
		СписокРегионовИзКлассификатора.Вставить(ВРег(ПолноеНаименование), ОписаниеРегиона.КодСубъектаРФ); 
		СписокРегионовИзКлассификатора.Вставить(ВРег(ОписаниеРегиона.Наименование), ОписаниеРегиона.КодСубъектаРФ);
	КонецЦикла;
	
	КодСубъектаРФ = СписокРегионовИзКлассификатора.Получить(СтрЗаменить(ВРег(НаименованиеРегиона), ".", ""));
	
	Если КодСубъектаРФ <> Неопределено Тогда 
		Возврат КодСубъектаРФ;
	КонецЕсли; 
	
	ЧастиСлова = АдресныйКлассификаторСлужебный.НаименованиеИТипОбъекта(НаименованиеРегиона);
	
	Фильтр = Новый Структура;
	Фильтр.Вставить("Наименование", ЧастиСлова.Наименование);
	Фильтр.Вставить("ТипОбъекта",   ЧастиСлова.ТипОбъекта);
	Варианты = Классификатор.НайтиСтроки(Фильтр);
	
	Если Варианты.Количество() > 0 Тогда
		Возврат Варианты[0].КодСубъектаРФ;
	КонецЕсли;
	
	// Поиск по полному наименованию типу региона
	Если ЗначениеЗаполнено(ЧастиСлова.ТипОбъекта) Тогда
		ПолныеНаименованияТиповАдресныхОбъектов = АдресныйКлассификаторСлужебный.СокращенияАдресныхОбъектов(Новый Массив);
		Если ПолныеНаименованияТиповАдресныхОбъектов.Получить(ВРег(ЧастиСлова.ТипОбъекта)) <> Неопределено Тогда
			НаименованиеРегиона = ЧастиСлова.Наименование + " " + ПолныеНаименованияТиповАдресныхОбъектов.Получить(ВРег(ЧастиСлова.ТипОбъекта));
			КодСубъектаРФ = СписокРегионов.Получить(ВРег(НаименованиеРегиона));
			Если КодСубъектаРФ <> Неопределено Тогда
				Возврат КодСубъектаРФ;
			КонецЕсли;
			КодСубъектаРФ = СписокРегионов.Получить(ВРег(ЧастиСлова.Наименование));
			Если КодСубъектаРФ <> Неопределено Тогда
				Возврат КодСубъектаРФ;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Неопределено;

	
КонецФункции

// Возвращает информацию о субъектах РФ определенных в федеральной информационной адресной системе.
//
// Возвращаемое значение:
//     ТаблицаЗначений - сведения о субъектах(регионах) РФ:
//       * КодСубъектаРФ  - Число                   - код субъекта, например 77 для Москвы.
//       * Наименование   - Строка                  - наименование субъекта. Например "Московская".
//       * ТипОбъекта     - Строка                  - сокращение субъекта. Например "обл".
//       * ПочтовыйИндекс - Число                   - индекс региона. Если 0 - то индекс не определен.
//       * Идентификатор  - УникальныйИдентификатор - уникальный идентификационный код адресного объекта.
//       * Сокращение     - Строка                  - устарело. Следует использовать свойство ТипОбъекта.
//
Функция СубъектыРФ() Экспорт
	
	Классификатор =  РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
	Классификатор.Колонки.Добавить("Сокращение", ОбщегоНазначения.ОписаниеТипаСтрока(10), "Сокращение");
	
	Для Каждого СубъектРФ Из Классификатор Цикл
		СубъектРФ.Сокращение = СубъектРФ.ТипОбъекта;
	КонецЦикла;
	
	Возврат Классификатор;
	
КонецФункции

// Возвращает количество загруженных в адресный классификатор субъектов РФ.
// Из-за проверки доступности веб-сервиса выполнение функции может занимать 7 секунд.
// Поэтому для исключения зависаний пользовательского интерфейса, например при открытии формы,
// следует вызвать в фоновом задании.
// Т.к. при использовании веб-сервиса фирмы "1С" предоставляющего через Интернет сведения об
// адресах РФ в формате адресного классификатора, всегда доступны адресные сведения по всем регионам РФ,
// то возвращает общее количество субъектов РФ.
//
// Возвращаемое значение:
//    Число - количество субъектов РФ, содержащих загруженные адресные сведения в адресном классификаторе.
//
Функция КоличествоЗагруженныхРегионов() Экспорт
	
	Если АдресныйКлассификаторПовтИсп.ИсточникДанныхАдресногоКлассификатораВебСервис() Тогда
		Возврат СубъектыРФ().Количество();
	КонецЕсли;
	
	Запрос = Новый Запрос("
		|ВЫБРАТЬ
		|	КОЛИЧЕСТВО(Регионы.КодСубъектаРФ) КАК КоличествоЗагруженных
		|ИЗ
		|	РегистрСведений.АдресныеОбъекты КАК Регионы
		|ГДЕ
		|	Регионы.Уровень = 1
		|	И 1 В (
		|		ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты
		|		ГДЕ Уровень = 2 И КодСубъектаРФ = Регионы.КодСубъектаРФ
		|		ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты
		|		ГДЕ Уровень = 3 И КодСубъектаРФ = Регионы.КодСубъектаРФ
		|		ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты
		|		ГДЕ Уровень = 4 И КодСубъектаРФ = Регионы.КодСубъектаРФ
		|		ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты
		|		ГДЕ Уровень = 5 И КодСубъектаРФ = Регионы.КодСубъектаРФ
		|		ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты
		|		ГДЕ Уровень = 6 И КодСубъектаРФ = Регионы.КодСубъектаРФ
		|		ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты
		|		ГДЕ Уровень = 7 И КодСубъектаРФ = Регионы.КодСубъектаРФ
		|		ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты
		|		ГДЕ Уровень = 90 И КодСубъектаРФ = Регионы.КодСубъектаРФ
		|		ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныеОбъекты
		|		ГДЕ Уровень = 91 И КодСубъектаРФ = Регионы.КодСубъектаРФ
		|	)
		|");
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.КоличествоЗагруженных;
	КонецЕсли;
	
	Возврат 0;
КонецФункции

// Определяет наличие адресных сведений в адресном классификаторе.
// Из-за проверки доступности веб-сервиса выполнение функции может занимать 7 секунд.
// Поэтому для исключения зависаний пользовательского интерфейса, например при открытии формы,
// функцию следует вызвать в фоновом задании.
// При использовании веб-сервиса фирмы "1С" предоставляющего через Интернет сведения об
// адресах РФ в формате адресного классификатора, всегда возвращает Истина, если подключена интернет-поддержка пользователей.
//
// Возвращаемое значение:
//     Булево - Истина, если адресный классификатор содержит сведения хотя бы по одному региону
//              или подключен и доступен веб-сервис.
//              Ложь, если адресные сведения отсутствуют, а веб-сервис недоступен.
//
Функция АдресныйКлассификаторЗагружен() Экспорт
	
	Запрос = Новый Запрос("
		|ВЫБРАТЬ ПЕРВЫЕ 1
		|	КодСубъектаРФ
		|ИЗ
		|	РегистрСведений.АдресныеОбъекты
		|ГДЕ
		|	Уровень > 1
		|");
	
	Если Не Запрос.Выполнить().Пустой() Тогда
		Возврат Истина;
	КонецЕсли;
	
	Возврат АдресныйКлассификаторПовтИсп.ИсточникДанныхАдресногоКлассификатораВебСервис();
	
КонецФункции

// Возвращает разрешение на доступ к веб-сервису адресов через сеть Интернет.
// Если доступ запрещен, то подбор и проверка адресов использует только загруженные данные в приложение.
// Изменение доступа выполняется в разделе Администрирование - Интернет-поддержка и сервисы.
//
// Возвращаемое значение:
//   Булево - если Истина, то доступ к веб-сервису разрешен.
//
Функция РазрешенДоступВИнтернет() Экспорт
	
	Возврат Не АдресныйКлассификаторПовтИсп.ИспользоватьТолькоЗагруженныеДанные();
	
КонецФункции 

// Проверяет адреса на соответствие адресному классификатору
// и возвращает подходящие варианты, содержащие сведения об адресе.
// При проверке адреса через веб-сервиса выполнение функции может занимать 20 секунд.
// Поэтому для исключения зависаний пользовательского интерфейса, например при открытии формы,
// функцию следует вызвать в фоновом задании.
//
// Параметры:
//     Адреса - Массив - проверяемые адреса. Содержит структуры с полями:
//         * Адрес                          - проверяемый адрес во внутреннем формате JSON или в XML,
//                                            соответствующем XDTO-пакету Адрес (http://www.v8.1c.ru/ssl/contactinfo),
//                                            или его XML-сериализация, соответствующая структуре XDTO-пакета.
//
// Возвращаемое значение:
//     Массив - результаты анализа. Каждый элемент массива содержит структуры с полями:
//       * Ошибки   - Массив     - описание ошибок поиска в классификаторе. Состоит из массива структур с полями:
//           ** Ключ      - Строка - служебный идентификатор места ошибки (путь XPath в объекте XDTO).
//           ** Текст     - Строка - текст ошибки.
//           ** Подсказка - Строка - текст возможного исправления ошибки.
//       * Варианты - Массив     - устарело. Содержит описание найденных вариантов в виде массива структур с полями:
//           ** Идентификатор    - УникальныйИдентификатор - уникальный идентификационный код адресного объекта.
//           ** Индекс           - Число - почтовый индекс адресного объекта.
//           ** КодКЛАДР         - Число - код КЛАДР ближайшего объекта.
//           ** OKATO            - Число - код общероссийского классификатора объектов административно-территориального деления.
//           ** ОКТМО            - Число - код общероссийского классификатора территорий муниципальных образований.
//           ** КодИФНСФЛ        - Строка - код инспекции ФНС обслуживающей физических лиц.
//           ** КодИФНСЮЛ        - Строка - код инспекции ФНС обслуживающей юридические лица.
//           ** КодУчасткаИФНСФЛ - Строка - код территориального участка инспекции ФНС обслуживающей физических лиц.
//           ** КодУчасткаИФНСЮЛ - Строка - код территориального участка инспекции ФНС обслуживающей юридические лица.
//
// Пример:
//     СтруктураПроверки = Новый Структура("Адрес", Адрес);
//     РезультатыПроверки = АдресныйКлассификатор.ПроверитьАдреса(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураПроверки));
//
//     Если РезультатыПроверки.Количество() > 0 И РезультатыПроверки.Варианты.Количество() > 0 Тогда
//      	КодКЛАДР = РезультатыПроверки.Варианты[0].КодКЛАДР;
//     КонецЕсли;
//
Функция ПроверитьАдреса(Адреса) Экспорт
	
	АдресаСтруктурой = Новый Массив;
	Для каждого ПроверяемыйАдрес Из Адреса Цикл
		Если ТипЗнч(ПроверяемыйАдрес) = Тип("Структура") Тогда
			Если ПроверяемыйАдрес.Свойство("Адрес") Тогда
				Адрес = Новый Структура("Адрес", АдресныйКлассификаторСлужебный.КонтактнаяИнформацияВСтруктуруJSON(ПроверяемыйАдрес.Адрес, ""))
			Иначе
				Адрес = "";
			КонецЕсли;
		Иначе
			Адрес = Новый Структура("Адрес", АдресныйКлассификаторСлужебный.КонтактнаяИнформацияВСтруктуруJSON(ПроверяемыйАдрес, ""))
		КонецЕсли;
	
		АдресаСтруктурой.Добавить(Адрес);
	КонецЦикла;
	
	Результат = АдресныйКлассификаторСлужебный.РезультатПроверкиАдресовПоКлассификатору(АдресаСтруктурой);
	Возврат Результат.Данные;
	
КонецФункции

// Возвращает полное наименование адресного объекта по его сокращению.
// Если уровень не указан, то возвращает первое найденное совпадение.
//
// Параметры:
//  АдресноеСокращение - Строка - сокращение адресного объекта. Например, "г".
//  Уровень            - Число - код уровня адресного объекта. Например, для уровня города 4.
//
// Возвращаемое значение:
//  Строка       - полное наименование адресного объекта. Например, "город".
//  Неопределено - если указанное сокращение не существует.
//
Функция ПолноеНаименованиеАдресногоСокращения(АдресноеСокращение, Уровень = Неопределено) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1 
		|	УровниСокращенийАдресныхСведений.Значение КАК Наименование
		|ИЗ
		|	РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений
		|ГДЕ
		|	УровниСокращенийАдресныхСведений.Сокращение = &Сокращение";
	
	Если ЗначениеЗаполнено(Уровень) Тогда 
		Запрос.Текст = Запрос.Текст + " И УровниСокращенийАдресныхСведений.Уровень = &Уровень";
		Запрос.УстановитьПараметр("Уровень", Уровень);
	КонецЕсли;
	Запрос.УстановитьПараметр("Сокращение", АдресноеСокращение);
	
	РезультатЗапроса = Запрос.Выполнить().Выбрать();
	
	Пока РезультатЗапроса.Следующий() Цикл
		Возврат РезультатЗапроса.Наименование;
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

// Возвращает коды адрес (ОКТМО, ОКАТО, налоговых инспекций ФНС и др.) и
// уникальные идентификационные коды адресного объекта и дома.
// Кода не будут заполнены, если адрес не соответствует адресному классификатору или содержит адресные поля без идентификаторов.
// При получении кодов через веб-сервиса выполнение функции может занимать 20 секунд.
// Поэтому для исключения зависаний пользовательского интерфейса, например при открытии формы,
// функцию следует вызвать в фоновом задании.
// Если при попытке получения кодов через веб-сервис он оказывается недоступен или доступ к нему запрещен пользователем,
// то функция возвращает структуру с пустыми полями.
// Проверить, разрешен ли администратором доступ к веб-сервису адресов можно с помощью функции РазрешенДоступВИнтернет.
//
// Параметры:
//  Адрес    - Строка - адрес во внутреннем формате JSON или XML, соответствующий структуре XDTO-пакета Адрес.
//  Источник - Строка - источник получения кодов адреса:
//             "Сервис1С" - коды будут получены через веб-сервис "1С" предоставляющий сведения об адресах РФ в формате
//                          адресного классификатора;
//             "ЗагруженныеДанные" - сначала будет попытка определить коды по загруженным данным адресного классификатора,
//                                   а затем, если коды не были определены, то они будут получены через веб-сервис "1С".
//             Если параметр не указан, то определение кодов будет аналогично параметру ЗагруженныеДанные.
// Возвращаемое значение:
//  Структура - коды адреса. Если адрес не существует, то поля структуры содержат пустые значения:
//      * Идентификатор - Строка - уникальный идентификационный код адресного объекта.
//      * ИдентификаторДома - Строка - уникальный идентификационный код дома(здания) адресного объекта.
//      * КодКЛАДР - Строка - код классификатор адресов России (КЛАДР).
//      * КодИФНСФЛ - Строка - код инспекции ФНС, обслуживающей физических лиц.
//      * КодИФНСЮЛ - Строка - код инспекции ФНС, обслуживающей юридические лица.
//      * КодУчасткаИФНСФЛ - Строка - код территориального участка инспекции ФНС, обслуживающей физических лиц.
//      * КодУчасткаИФНСЮЛ - Строка - код территориального участка инспекции ФНС, обслуживающей юридические лица.
//      * OKATO - Строка - код общероссийского классификатора объектов административно-территориального деления.
//      * ОКТМО - Строка - код общероссийского классификатора территорий муниципальных образований.
//      * ОКТМОБюджетополучателя- Строка - код бюджетополучателя общероссийского классификатора
//                                         территорий муниципальных образований.
//
Функция КодыАдреса(Адрес, Источник = Неопределено) Экспорт
	
	Коды = АдресныйКлассификаторСлужебный.КодыАдреса(Адрес, Источник);
	Если ТипЗнч(Коды) = Тип("Структура") И Коды.Свойство("КодыАдреса") Тогда
		Коды = Коды.КодыАдреса;
	КонецЕсли;
	Возврат Коды;
	
КонецФункции

// Возвращает соответствие полных наименований адресных объектов и их сокращения.
//
// Параметры:
//  НаименованияАдресныхОбъектов - Массив из Строка - полные наименования адресных объектов. 
//  	Если передан пустой массив, то будут возвращен полный список наименований и сокращений.
//
// Возвращаемое значение:
//  Соответствие из КлючИЗначение:
//   * Ключ - Строка - полное наименование адресного объекта.
//   * Значение - Строка - сокращение адресного объекта.
//
Функция СокращенияАдресныхОбъектов(НаименованияАдресныхОбъектов) Экспорт
	Возврат АдресныйКлассификаторСлужебный.СокращенияАдресныхОбъектов(НаименованияАдресныхОбъектов);
КонецФункции

// Возвращает сведения об адресе по коду ОКТМО, который состоит из 8 или 11 цифр.
//
// Параметры:
//   ОКТМО - Соответствие - код общероссийского классификатора территорий муниципальных образований.
//
// Возвращаемое значение:
//   Структура:
//   * КодРегиона       - Строка - код региона РФ.
//   * Регион           - Строка - текстовое представление региона РФ.
//   * РегионТипПолный  - Строка - полное наименование типа региона. Например: "область".
//   * РегионТипКраткий - Строка - краткое наименование типа региона. Например: "обл".
//   * ИдентификаторРегиона- УникальныйИдентификатор
//                         - Неопределено - идентификационный код региона.
//   * МуниципальныйРайон - Строка - текстовое представление муниципального района для адреса по муниципальному делению.
//   * МуниципальныйРайонТипПолный - Строка - полное наименование типа муниципального района по муниципальному
//                                                 делению. Например: "городской округ".
//   * МуниципальныйРайонТипКраткий - Строка - краткое наименование типа муниципального района для адреса по
//                                                  муниципальному делению. Например: "мун.р-н".
//   * ИдентификаторМуниципальногоРайона- УникальныйИдентификатор
//                                      - Неопределено - идентификационный код муниципального район.
//   * КодМуниципальногоРайона - Строка - код муниципального района: 1- муниципальный район; 2- городской округ;
//                           3 - внутригородская территория  города федерального значения; 4 - муниципальный округ.
//                                        Если не удалось определить код, то возвращается пустая строка.
//   * Поселение          - Строка - текстовое представление поселения у адресов по муниципальному делению.
//   * ПоселениеТипПолный - Строка - полное наименование типа сельского поселения по муниципальному делению.
//                                         Например: "сельское поселение".
//   * ПоселениеТипКраткий - Строка - краткое наименование типа муниципального района для адреса по муниципальному
//                                    делению. Например: "с. п.".
//   * ИдентификаторПоселения- УникальныйИдентификатор
//                           - Неопределено - идентификационный код поселения.
//   * КодПоселения - Строка - код поселения: 1 - городское поселение; 2 - сельское поселение; 3-  межселенная
//                             территория в составе муниципального района; 4 - внутригородской район городского округа;
//   * НаселенныйПункт - Строка - текстовое представление населенного пункта.
//   * НаселенныйПунктТипПолный - Строка - полное наименование типа населенного пункта. Например: "деревня".
//   * НаселенныйПунктТипКраткий - Строка - краткое наименование типа  населенного пункта. Например: "д".
//   * ИдентификаторНаселенногоПункта- УникальныйИдентификатор
//                                   - Неопределено - идентификационный код населенного пункта.
//   * Территория - Строка - текстовое представление территории (элемент планировочной структуры).
//   * ТерриторияТипПолный - Строка - полное наименование типа территории. Например: "Гаражно-строительный кооп.".
//   * ТерриторияТипКраткий - Строка - краткое наименование типа территории. Например: "гск".
//   * ИдентификаторТерритории- УникальныйИдентификатор
//                            - Неопределено - идентификационный код территории.
//   * ПочтовыйИндекс - Число -  почтовый индекс.
//   * OKATO - Строка - код общероссийского классификатора объектов административно-территориального деления.
//   * КодКЛАДР - Строка - код классификатор адресов России (КЛАДР).
//   * КодИФНСФЛ - Строка - код инспекции ФНС, обслуживающей физических лиц.
//   * КодИФНСЮЛ - Строка - код инспекции ФНС, обслуживающей юридические лица.
//   * КодУчасткаИФНСФЛ - Строка - код территориального участка инспекции ФНС, обслуживающей физических лиц.
//   * КодУчасткаИФНСЮЛ - Строка - код территориального участка инспекции ФНС, обслуживающей юридические лица.
//
Функция СведенияПоОКМТО(ОКТМО) Экспорт
	
	СписокОКТМО = Новый Соответствие;
	СписокОКТМО.Вставить(1, ОКТМО);
	
	Результат = АдресныйКлассификаторСлужебный.СведенияПоСпискуОКМТО(СписокОКТМО);
	
	Возврат Результат[1];
	
КонецФункции

// Проверяет корректность ОКМТО бюджетополучателей.
// 
// Для проверки ОКТМО бюджетополучателей требуется подключение к Интернет-поддержке пользователей и наличие
// постоянного соединения с интернетом, т.к. адресные сведения, загруженные в приложение, не используются.
// Проверка выполняется порциям по 100 значений за один запросу к веб-сервису, поэтому рекомендуется выполнять 
// ее в фоновом режиме.
// При получении ответа от веб-сервиса отличного от успешного (код 200 ОК) выполнение функции прерывается 
// и возвращается ошибка. Поэтому если в данных результата отсутствует ОКТМО бюджетополучателя, 
// то он не было проверен из-за ошибок работы с веб-сервисом. 
//
// Параметры:
//  ОКТМОБюджетополучателей - Массив из Строка - список ОКТМО бюджетополучателей.
//                          - Строка -  ОКТМО бюджетополучателя.
// 
// Возвращаемое значение:
//  Структура:
//    * Отказ - Булево - если Истина, то при получении ОКТМО бюджетополучателя через веб-сервис возникла ошибка.
//    * ПредставлениеОшибкиДляПользователя - Строка - текст ошибки для отображения пользователю.
//    * ИнформацияОбОшибке - ИнформацияОбОшибке - структурированная информация об ошибке.
//    * Данные - Соответствие из КлючИЗначение:
//      ** Ключ - Строка - ОКТМО бюджетополучателя.
//      ** Значение - Структура:
//         *** Успешно  - Булево - если Истина, то код ОКТМО бюджетополучателей корректный;
//         *** ТекстОшибки - Строка - текст ошибки, если ОКТМО некорректный;
//         *** МуниципальныеОбразования - Массив из Строка - список муниципальных образований, принадлежащих данному ОКТМО.
//
Функция ПроверитьОКТМОБюджетополучателя(ОКТМОБюджетополучателей) Экспорт
	
	СписокОКТМО = ?(ТипЗнч(ОКТМОБюджетополучателей) = Тип("Строка"), 
		ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ОКТМОБюджетополучателей), ОКТМОБюджетополучателей);
		
	Возврат АдресныйКлассификаторСлужебный.ПроверитьОКМТОБюджетополучателя(СписокОКТМО);
	 
КонецФункции

#Область УстаревшиеПроцедурыИФункции

// Возвращает идентификационный код дома и адресного объекта с помощью веб-сервиса фирмы 1С предоставляющего
// сведения об адресах РФ в формате адресного классификатора. Для получения идентификаторов требуется подключение
// к Интернет-поддержке пользователей и наличие постоянного соединения с интернетом,
// т.к. адресные сведения, загруженные в приложение, не используются.
//
// Параметры:
//   Адрес                               - Строка - XML соответствующий структуре XDTO-пакета Адрес, содержащий адрес,
//                                                  для которого требуется определить идентификационные коды.
// Возвращаемое значение:
//   Структура:
//       * ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - идентификационный код адресного объекта (улицы,
//                                                                   нас. пункта).
//       * ИдентификаторДома             - УникальныйИдентификатор - идентификационный код дома адресного объекта.
//       * Отказ                         - Булево - если Истина, то при работе с веб-сервисом возникла ошибка.
//       * ПодробноеПредставлениеОшибки  - Строка - полное описание ошибки, если при работе с веб-сервисом возникла
//                                                  ошибка, иначе Неопределено.
//       * КраткоеПредставлениеОшибки    - Строка - краткое описание ошибки, если при работе с веб-сервисом возникла
//                                                  ошибка, иначе Неопределено.
//
Функция ИдентификаторыАдреса(Адрес) Экспорт
	Возврат АдресныйКлассификаторСлужебный.ОпределитьИдентификаторыАдреса(Адрес);
КонецФункции

#КонецОбласти

#КонецОбласти