Files
SSL/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl
T
2021-10-29 12:32:00 +03:00

10697 lines
709 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2021, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область СлужебныйПрограммныйИнтерфейс
// Возвращает информацию о доступности адресных сведений.
//
// Возвращаемое значение:
// ФиксированноеСоответствие:
// * КлассификаторДоступен - Булево - классификатор доступен через веб-сервис.
// * ИспользоватьЗагруженные - Булево - в программу загружен классификатор.
//
Функция СведенияОДоступностиАдресныхСведений() Экспорт
Возврат АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
КонецФункции
// Проверка доступности поставщика - локальной базы или сервиса.
//
// Возвращаемое значение:
// Структура:
// * Отказ - Булево - поставщик не доступен.
// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * Данные - Строка - описание версии поставщика.
//
Функция ВерсияПоставщикаДанных() Экспорт
Результат = Новый Структура("Данные");
СтруктураОписанияОшибкиПоставщика(Результат);
// В модели сервиса веб-сервис доступен всегда.
Если Не ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки() Тогда
Возврат Результат; // ИПП не подключена.
КонецЕсли;
Попытка
ЗаполнитьВерсиюПоставщикаДанныхСервис1С(Результат);
Исключение
// Веб сервис 1С, может быть на обслуживании.
СтруктураОписанияОшибкиПоставщика(Результат, ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,,
Результат.ПодробноеПредставлениеОшибки);
КонецПопытки;
Возврат Результат;
КонецФункции
// Возвращает описание последней загрузки классификатора.
//
// Возвращаемое значение:
// Структура:
// * ДатаПоследнейЗагрузки - Дата - дата последней загрузки (часовой пояс сеанса).
// * УниверсальнаяДатаПоследнейЗагрузки - Дата - дата последней загрузки (UTC).
// * ДнейНазад - Число - количество дней от последней загрузки.
// * Представление - Строка - описание, например "Адресный классификатор был загружен
// сегодня.";
// * НеобходимоОбновление - Булево - Истина, если количество дней от последней загрузки превышает
// период актуальности.
//
Функция ОписаниеПоследнейЗагрузки(ИдентификаторРегиона = Неопределено) Экспорт
Результат = Новый Структура("ДнейНазад, ДатаПоследнейЗагрузки, УниверсальнаяДатаПоследнейЗагрузки, Представление, НеобходимоОбновление");
Запрос = Новый Запрос();
// Определяем дату последней загрузки.
Если ЗначениеЗаполнено(ИдентификаторРегиона) Тогда
ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаЗагрузки
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПРАВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений
| ПО АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ
| ГДЕ АдресныеОбъекты.Идентификатор = &ИдентификаторРегиона
|
|УПОРЯДОЧИТЬ ПО
| ДатаВерсии";
Запрос.УстановитьПараметр("ИдентификаторРегиона", Новый УникальныйИдентификатор(ИдентификаторРегиона));
Иначе
ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаЗагрузки
|ИЗ
| РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений
|УПОРЯДОЧИТЬ ПО
| ДатаЗагрузки УБЫВ";
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ДатаПоследнейЗагрузки = Выборка.ДатаЗагрузки;
Иначе
Результат.НеобходимоОбновление = Ложь;
Результат.Представление = НСтр("ru = 'Адресный классификатор еще не загружался.'");
Возврат Результат;
КонецЕсли;
Результат.УниверсальнаяДатаПоследнейЗагрузки = ДатаПоследнейЗагрузки;
Результат.ДатаПоследнейЗагрузки = МестноеВремя(ДатаПоследнейЗагрузки, ЧасовойПоясСеанса());
НачалоПериода = НачалоДня(ТекущаяУниверсальнаяДата());
КонецПериода = НачалоДня(ДатаПоследнейЗагрузки);
ДнейРазницы = Цел((НачалоПериода - КонецПериода) / 86400);
Представление = "";
Если ДнейРазницы = 0 Тогда
Представление = НСтр("ru = 'Адресный классификатор был загружен сегодня.'");
ИначеЕсли ДнейРазницы = 1 Тогда
Представление = НСтр("ru = 'Адресный классификатор был загружен вчера.'");
ИначеЕсли ДнейРазницы = 2 Тогда
Представление = НСтр("ru = 'Адресный классификатор был загружен позавчера.'");
ИначеЕсли ДнейРазницы > 2 Тогда
Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Адресный классификатор был загружен %1 назад.'"),
ОбщегоНазначения.ИнтервалВремениСтрокой(КонецПериода, НачалоПериода));
КонецЕсли;
Результат.НеобходимоОбновление = ДнейРазницы > 30; // 1 месяц
Результат.ДнейНазад = ДнейРазницы;
Результат.Представление = Представление;
Возврат Результат;
КонецФункции
// Возвращает данные классификатора по почтовому индексу.
//
// Параметры:
// Индекс - Число - почтовый индекс, для которого необходимо получать данные.
// ДополнительныеПараметры - Структура - описание настроек поиска. Поля:
// * ФорматАдреса - Строка - тип используемого классификатора.
//
// Возвращаемое значение:
// Структура - найденные варианты. Содержит поля:
// * Отказ - Булево - поставщик не доступен.
// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * ОбщаяЧастьПредставления - Строка - общая часть представлений адреса.
// * Данные - ТаблицаЗначений - содержит данные для выбора. Колонки:
// ** Неактуален - Булево - флаг неактуальности строки данных.
// ** Идентификатор - УникальныйИдентификатор - код классификатора для поиска вариантов по индексу.
// ** Представление - Строка - представление варианта.
//
Функция АдресаПоПочтовомуИндексуКлассификатора(Индекс, ДополнительныеПараметры) Экспорт
Результат = Новый Структура("Данные, ОбщаяЧастьПредставления", ТаблицаДанныхДляВыбораПоПочтовомуИндексу());
СтруктураОписанияОшибкиПоставщика(Результат);
ЗаполнитьАдресаПоПочтовомуИндексуКлассификатораВнутр(Результат, Индекс, ДополнительныеПараметры);
Если Результат.Данные.Количество() = 0 И Не Результат.Отказ Тогда
Попытка
ЗаполнитьАдресаПоПочтовомуИндексуКлассификатораСервис1С(Результат, Индекс);
Исключение
СтруктураОписанияОшибкиПоставщика(Результат, ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации( СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки);
КонецПопытки;
КонецЕсли;
Возврат Результат;
КонецФункции
// Определить регион по индексу.
//
// Параметры:
// Индекс - Строка - почтовый индекс определимого региона.
//
// Возвращаемое значение:
// Структура - код и наименование региона, Неопределенно - если регион не найден:
// * КодСубъектаРФ - Число - код субъекта РФ.
// * Представление - Строка - представление субъекта РФ.
//
Функция ОпределитьРегионПоИндексу(Индекс) Экспорт
Сведения = СведенияОСубъектахРФ();
Результат = Новый Структура("Представление, КодСубъектаРФ");
ПервыйТриЦифрыИндекса = Число(Лев(Индекс, 3));
Для каждого Регион Из Сведения Цикл
ДиапазонПочтовыхИндексов = Регион.ДиапазонПочтовыхИндексов;
Диапазоны = СтрРазделить(ДиапазонПочтовыхИндексов, ",");
Для каждого Диапазон Из Диапазоны Цикл
Интервалы = СтрРазделить(Диапазон, "-");
Если Интервалы.Количество() = 1 Тогда
Если Число(Интервалы[0]) = ПервыйТриЦифрыИндекса Тогда
Результат.КодСубъектаРФ = Регион.КодСубъектаРФ;
Результат.Представление = ПредставлениеРегиона(Регион.Наименование, Регион.Сокращение);
Возврат Результат;
КонецЕсли;
Иначе
Если Число(Число(Интервалы[1])) >= ПервыйТриЦифрыИндекса
И Число(Интервалы[0]) <= ПервыйТриЦифрыИндекса Тогда
Результат.КодСубъектаРФ = Регион.КодСубъектаРФ;
Результат.Представление = ПредставлениеРегиона(Регион.Наименование, Регион.Сокращение);
Возврат Результат;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Неопределено;
КонецФункции
// Локальная проверка одного адреса.
//
Процедура УстановитьИдентификаторыАдреса(Адрес, Источник = "") Экспорт
Адреса = Новый Соответствие;
Адреса.Вставить(1, Адрес);
УстановитьИдентификаторыАдресов(Адреса, Источник);
КонецПроцедуры
Процедура УстановитьИдентификаторыАдресов(Адреса, Источник = "") Экспорт
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
АдресаВебСервис = Новый Соответствие;
АдресаЗагруженныеДанные = Новый Соответствие;
Для каждого КлючЗначение Из Адреса Цикл
Адрес = КлючЗначение.Значение;
КодРегиона = АдресныйКлассификатор.КодРегионаПоНаименованию(СоединитьНаименованиеИТипАдресногоОбъекта(
Адрес.Area, Адрес.AreaType, Истина));
Если ТипЗнч(КодРегиона) = Тип("Число") Тогда
Если Источник <> "Сервис1С" И ЗагруженныеАдресныеСведения.Получить(КодРегиона) <> Неопределено
И ЗагруженныеАдресныеСведения.Получить(КодРегиона).ИспользоватьЗагруженные Тогда
АдресаЗагруженныеДанные.Вставить(КлючЗначение.Ключ, Адрес);
ИначеЕсли ЗагруженныеАдресныеСведения.Получить("КлассификаторДоступен") = Истина Или Источник ="Сервис1С" Тогда
АдресаВебСервис.Вставить(КлючЗначение.Ключ, Адрес);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если АдресаЗагруженныеДанные.Количество() > 0 Тогда
УстановитьИдентификаторыАдресовПоЗагруженнымДанным(АдресаЗагруженныеДанные);
КонецЕсли;
Если АдресаВебСервис.Количество() > 0 Тогда
УстановитьИдентификаторыАдресаЧерезВебСервис(АдресаВебСервис);
КонецЕсли;
КонецПроцедуры
Процедура УстановитьМуниципальныеСведения(Адрес, ОКТМО) Экспорт
Если Не ЭтоГородФедеральногоЗначения(ПолноеНаименованиеРегиона(Адрес.Area, Адрес.AreaType)) Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(АдресныеОбъекты.Идентификатор, """") КАК Идентификатор,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК Наименование,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК Сокращение,
| ЕСТЬNULL(АдресныеОбъекты.Уровень, 0) КАК Уровень
|ИЗ
| РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО ДополнительныеСведения.Идентификатор = АдресныеОбъекты.ДополнительныеАдресныеСведения
|ГДЕ
| ДополнительныеСведения.ОКТМО = &ОКТМО
| И (АдресныеОбъекты.Уровень = &УровеньРайона
| ИЛИ АдресныеОбъекты.Уровень = &УровеньПоселения)";
Запрос.УстановитьПараметр("ОКТМО", ОКТМО);
Запрос.УстановитьПараметр("УровеньРайона", 31);
Запрос.УстановитьПараметр("УровеньПоселения", 41);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
СловарьИменПолей = СловарьКлючейПолейАдресВСоответствииСУровнем();
Для каждого ЗаписьУровня Из РезультатЗапроса.Выгрузить() Цикл
ИмяУровня = СловарьИменПолей[ЗаписьУровня.Уровень];
Адрес[ИмяУровня] = ЗаписьУровня.Наименование;
Адрес[ИмяУровня + "Type"] = ЗаписьУровня.Сокращение;
Адрес[ИмяУровня + "Id"] = ЗаписьУровня.Идентификатор;
КонецЦикла;
КонецПроцедуры
Функция РаспознатьАдрес(ЧастиАдреса, Представление, ВСтруктуру = Ложь) Экспорт
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
КодРегиона = ОпределитьКодРегионаПоЧастямАдреса(ЧастиАдреса);
Если ЗагруженныеАдресныеСведения.Получить("ИспользоватьЗагруженные") = Истина
И ТипЗнч(ЗагруженныеАдресныеСведения.Получить(КодРегиона)) = Тип("Структура")
И ЗагруженныеАдресныеСведения.Получить(КодРегиона).ИспользоватьЗагруженные Тогда
Адрес = РаспознатьАдресЗагруженныеДанные(ЧастиАдреса);
Если СтрСравнить(Адрес.addressType, АдресВСвободнойФорме()) <> 0 Тогда
Возврат Адрес;
КонецЕсли;
ИначеЕсли ЗагруженныеАдресныеСведения.Получить("КлассификаторДоступен") = Истина Тогда
Адрес = РаспознатьАдресВебСервис(ЧастиАдреса, Представление, ВСтруктуру);
Возврат Адрес;
КонецЕсли;
Возврат Неопределено;
КонецФункции
// Проверка адрес на соответствие адресному классификатору
//
// Параметры:
// Адреса - Соответствие из КлючИЗначение:
// * Ключ - Число - уникальный ключ адреса,
// * Значение - Строка - строка в формате JSON с адресом.
// ПроверятьУстареваниеАдресов - Булево
//
// Возвращаемое значение:
// см. РезультатПроверкиАдресов
//
Функция АнализАдресовПоКлассификатору(Знач Адреса, ПроверятьУстареваниеАдресов = Ложь) Экспорт
АдресаJSON = Новый Соответствие;
Для каждого Адрес Из Адреса Цикл
АдресаJSON.Вставить(Адрес.Ключ, JSONВКонтактнуюИнформациюПоПолям(Адрес.Значение));
КонецЦикла;
Возврат РезультатПроверкиАдресов(АдресаJSON, ПроверятьУстареваниеАдресов);
КонецФункции
// Возвращает данные классификатора поля выбора по уровню.
//
// Параметры:
// Родитель - УникальныйИдентификатор - родительский объект.
// Уровень - Число - уровень данных для выбора
// ТипАдреса - Строка - варианты: Муниципальный, Административно-территориальный
// ДополнительныеПараметры - Структура - описание настроек поиска:
// * ФорматАдреса - Строка - тип используемого классификатора.
// * РазмерПорции - Число - необязательный размер порции возвращаемых данных. Если не указано
// или 0, то возвращает все элементы.
// * ПерваяЗапись - УникальныйИдентификатор - элемент, с которого начинается порция данных. Сам элемент не
// входит в выборку.
// * Сортировка - Строка - направление сортировки для порции.
//
// Возвращаемое значение:
// Структура - найденные варианты. Содержит поля:
// * Отказ - Булево - поставщик не доступен.
// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * Заголовок - Строка - строка с предложением выбора.
// * Данные - ТаблицаЗначений - содержит данные для выбора. Колонки:
// ** Неактуален - Булево - флаг неактуальности строки данных.
// ** Идентификатор - УникальныйИдентификатор - код классификатора для поиска вариантов по индексу.
// ** Представление - Строка - представление варианта.
// ** РегионЗагружен - Булево - имеет смысл только для регионов. Истина, если есть записи.
//
Функция АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ТипАдреса, ДополнительныеПараметры) Экспорт
Результат = Новый Структура("Данные, Заголовок", ТаблицаДанныхДляИнтерактивногоВыбора());
СтруктураОписанияОшибкиПоставщика(Результат);
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] Или Уровень = 1 Тогда
ЗаполнитьАдресаДляИнтерактивногоВыбораВнутр(Результат, Родитель, Уровень, ТипАдреса, ДополнительныеПараметры);
КонецЕсли;
Если Результат.Данные.Количество() = 0 И ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина Тогда
// Веб сервис 1С, может быть на обслуживании.
Попытка
Если ДополнительныеПараметры.Свойство("КоличествоЗаписей") Тогда
КоличествоЗаписей = Формат(ДополнительныеПараметры.КоличествоЗаписей,"ЧГ=0");
Иначе
КоличествоЗаписей = "20";
КонецЕсли;
ДополнительныеПараметрыПоиска = "";
Если ДополнительныеПараметры.Свойство("Позиция") Тогда
Позиция = Формат(ДополнительныеПараметры.Позиция,"ЧГ=0");
ДополнительныеПараметрыПоиска = ДополнительныеПараметрыПоиска + "&from=" + Позиция;
КонецЕсли;
Если ДополнительныеПараметры.Свойство("СтрокаПоиска")
И ЗначениеЗаполнено(ДополнительныеПараметры.СтрокаПоиска) Тогда
ДополнительныеПараметрыПоиска = ДополнительныеПараметрыПоиска + "&text=" + ДополнительныеПараметры.СтрокаПоиска;
КонецЕсли;
Если Уровень > 1 Тогда
ШаблонаЗапроса = "select?level=%1&base=0&limit=%2&parentId=%3" + ДополнительныеПараметрыПоиска;
Иначе
ШаблонаЗапроса = "select?level=%1&base=0&limit=%2" + ДополнительныеПараметрыПоиска;
КонецЕсли;
ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонаЗапроса,
Строка(Уровень), КоличествоЗаписей, Строка(Родитель));
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
Если РезультатВебСервис.Отказ Тогда
Возврат Результат;
КонецЕсли;
ИмяПоля = ?(ЭтоМуниципальныйАдрес(ТипАдреса), "munName", "name");
ИмяИдентификатора = ?(ЭтоМуниципальныйАдрес(ТипАдреса), "munId", "id");
Для каждого СтрокаРезультатаВебСервис Из РезультатВебСервис.Данные Цикл
НоваяСтрока = Результат.Данные.Добавить();
Если ЗначениеЗаполнено(СтрокаРезультатаВебСервис[ИмяПоля]) Тогда
НоваяСтрока.Идентификатор = СтрокаРезультатаВебСервис[ИмяИдентификатора];
НоваяСтрока.Представление = СтрокаРезультатаВебСервис[ИмяПоля];
Иначе
ИмяПоля1 = ?(ИмяПоля = "munName", "name", "munName");
ИмяИдентификатора1 = ?(ИмяПоля = "munName", "id", "munId");
НоваяСтрока.Идентификатор = СтрокаРезультатаВебСервис[ИмяИдентификатора1];
НоваяСтрока.Представление = СтрокаРезультатаВебСервис[ИмяПоля1];
КонецЕсли;
НоваяСтрока.РегионЗагружен = Ложь;
НоваяСтрока.Неактуален = Ложь;
КонецЦикла;
Исключение
СтруктураОписанияОшибкиПоставщика(Результат, ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации( СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки);
КонецПопытки;
КонецЕсли;
Если Уровень = 1 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите регион'");
ИначеЕсли Уровень = 2 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите округ'");
ИначеЕсли Уровень = 3 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите район'");
ИначеЕсли Уровень = 4 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите город'");
ИначеЕсли Уровень = 5 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите внутригородской район'");
ИначеЕсли Уровень = 6 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите населенный пункт'");
ИначеЕсли Уровень = 7 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите улицу'");
ИначеЕсли Уровень = 65 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите территорию'");
ИначеЕсли Уровень = 41 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите поселение'");
ИначеЕсли Уровень = 31 Тогда
Результат.Заголовок = НСтр("ru = 'Выберите муниципальный район'");
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает данные классификатора поля выбора по уровню.
//
// Параметры:
// Родитель - УникальныйИдентификатор - родительский адресный объект.
// Уровень - Число - уровень данных для выбора.
// ТипАдреса - Строка -Варианты: Муниципальный, Административно-территориальный.
// СтрокаПоиска - Строка - если указана, то будут отобраны адресные сведения совпадающей со строкой.
//
// Возвращаемое значение:
// Структура - найденные варианты. Содержит поля:
// * Отказ - Булево - поставщик не доступен.
// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * Заголовок - Строка - строка с предложением выбора.
// * Данные - ТаблицаЗначений - содержит данные для выбора. Колонки:
// ** Неактуален - Булево - флаг неактуальности строки данных.
// ** Идентификатор - УникальныйИдентификатор - код классификатора для поиска вариантов по индексу.
// ** Представление - Строка - представление варианта.
// ** РегионЗагружен - Булево - имеет смысл только для регионов. Истина, если есть записи.
//
Функция АдресныеОбъектыУровня(Родитель, Уровень, ТипАдреса, Знач СтрокаПоиска = "") Экспорт
ДанныеВыбора = Новый Структура("Данные, Отказ", Новый СписокЗначений, Ложь);
ДанныеВыбора.Вставить("ПодробноеПредставлениеОшибки", "");
ДанныеВыбора.Вставить("КраткоеПредставлениеОшибки", "");
Результат = Новый Структура("Данные", ТаблицаДанныхДляИнтерактивногоВыбора());
СтруктураОписанияОшибкиПоставщика(Результат);
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
ПредлагатьЗагрузкуСведений = (Уровень = 1 И ЗагруженныеАдресныеСведения.Получить("КлассификаторДоступен") = Ложь);
Если ЗначениеЗаполнено(СтрокаПоиска) Тогда
ПреобразоватьВводАдреса(СтрокаПоиска);
КонецЕсли;
Если ЗагруженныеАдресныеСведения.Получить("ИспользоватьЗагруженные") Или Уровень = 1 Тогда
ДополнительныеПараметры = Новый Структура("СтрокаПоиска", СтрокаПоиска);
ЗаполнитьАдресаДляИнтерактивногоВыбораВнутр(Результат, Родитель, Уровень, ТипАдреса, ДополнительныеПараметры);
Для каждого СведенияОбАдресе Из Результат.Данные Цикл
Сведения = Новый Структура();
Сведения.Вставить("Идентификатор", СведенияОбАдресе.Идентификатор);
Сведения.Вставить("Родитель", Родитель);
Сведения.Вставить("Представление", СведенияОбАдресе.Представление);
Сведения.Вставить("Отказ", Ложь);
Сведения.Вставить("ЗагруженныеДанные", Истина);
Если ПредлагатьЗагрузкуСведений Тогда
Сведения.Вставить("ПредлагатьЗагрузкуКлассификатора",
Не СведенияОбАдресе.РегионЗагружен);
Иначе
Сведения.Вставить("ПредлагатьЗагрузкуКлассификатора", Ложь);
КонецЕсли;
ДанныеВыбора.Данные.Добавить(Сведения, СведенияОбАдресе.Представление);
КонецЦикла;
КонецЕсли;
Если Результат.Данные.Количество() = 0 И ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина Тогда
// Веб сервис 1С, может быть на обслуживании.
Попытка
СтрокаЗапроса = "select?level=%1&base=0&limit=20";
Если ЗначениеЗаполнено(Родитель) Тогда
СтрокаЗапроса = СтрокаЗапроса + "&parentId=" + СокрЛП(Родитель);
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаПоиска) Тогда
СтрокаЗапроса = СтрокаЗапроса + "&text=" + СокрЛП(СтрокаПоиска);
КонецЕсли;
ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаЗапроса, XMLСтрока(Уровень));
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
ИмяПоля = ?(ЭтоМуниципальныйАдрес(ТипАдреса), "munName", "name");
ИмяПоляИдентификатор = ?(ЭтоМуниципальныйАдрес(ТипАдреса), "munId", "id");
Для каждого СтрокаДанных Из РезультатВебСервис.Данные Цикл
Если ЗначениеЗаполнено(СтрокаДанных[ИмяПоляИдентификатор]) Тогда
ДанныеВыбора.Данные.Добавить(СтрокаДанных[ИмяПоляИдентификатор], СтрокаДанных[ИмяПоля]);
Иначе
ИмяПоля1 = ?(ИмяПоля = "munName", "name", "munName");
ИмяПоляИдентификатор1 = ?(ИмяПоля = "munName", "id", "munId");
Если ЗначениеЗаполнено(СтрокаДанных[ИмяПоляИдентификатор1]) Тогда
ДанныеВыбора.Данные.Добавить(СтрокаДанных[ИмяПоляИдентификатор1], СтрокаДанных[ИмяПоля1]);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если РезультатВебСервис.Отказ Тогда
ДанныеВыбора.Отказ = Истина;
Возврат ДанныеВыбора;
КонецЕсли;
Исключение
СтруктураОписанияОшибкиПоставщика(Результат, ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, Результат.ПодробноеПредставлениеОшибки);
ДанныеВыбора.ПодробноеПредставлениеОшибки = Результат.ПодробноеПредставлениеОшибки;
ДанныеВыбора.КраткоеПредставлениеОшибки = Результат.КраткоеПредставлениеОшибки;
КонецПопытки;
КонецЕсли;
Возврат ДанныеВыбора;
КонецФункции
// Возвращает список для автоподбора элемента адреса, поиск по подобию.
//
// Параметры:
// Текст - Строка - текст, введенный в поле.
// Родитель - УникальныйИдентификатор - родительский объект.
// Уровни - Массив
// - ФиксированныйМассив - набор требуемых уровней данных. 1-7, 90, 91 - адресные
// объекты, -1 - ориентиры.
// ДополнительныеПараметры - Структура - описание настройке поиска. Поля:
// * ТолькоВебСервис - Булево - автоподбор только через веб-сервис.
// * ТипАдреса - Строка - тип используемого классификатора.
//
// Возвращаемое значение:
// Структура - найденные варианты. Содержит поля:
// * Отказ - Булево - поставщик не доступен.
// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * Данные - СписокЗначений - содержит данные для выбора. Колонки:
// ** Представление - Строка - представление варианта.
// ** Значение - Структура - с полями Идентификатор, Муниципальный, ЗагруженныеДанные.
//
Функция ВариантыАвтоподбора(Текст, ДополнительныеПараметры) Экспорт
Результат = Новый СписокЗначений;
КешПредставлений = Новый Соответствие;
ТолькоВебСервис = ДополнительныеПараметры.ТолькоВебСервис;
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
Если Не ТолькоВебСервис Тогда
ЗаполнитьСписокАвтоподбораЧастиАдресаВнутр(Результат, КешПредставлений, Текст, ДополнительныеПараметры, ЗагруженныеАдресныеСведения);
Если Результат.Количество() >= 20 Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
// Веб сервис 1С
Если ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина Тогда
Родитель = Неопределено;
Если ДополнительныеПараметры.Свойство("Уровень") Тогда
Если ДополнительныеПараметры.Уровень > 1 Тогда
Родитель = ДополнительныеПараметры.Идентификатор;
КонецЕсли;
КонецЕсли;
// Адаптация текста под поиск
ЧастиАдреса = СтрРазделить(Текст, ",");
Если ЧастиАдреса.Количество() > 0 Тогда
Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(СокрЛП(ЧастиАдреса[0])) Тогда
ЧастиАдреса.Удалить(0);
КонецЕсли;
ТекстПоиска = СокрЛП(СтрСоединить(ЧастиАдреса, ","));
ЗаполнитьСписокАвтоподбораЧастиАдресаСервис1С(Результат, КешПредставлений, ТекстПоиска, Родитель, 20, ДополнительныеПараметры);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает список домов по идентификатору адресного объекта, поиск по подобию.
//
// Параметры:
// ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - родительский объект.
// СтрокаПоиска - Строка - текст, отбора в списке домов.
// ПорцияПриПоиске - Число - кол-во получаемых вариантов за один запрос.
//
// Возвращаемое значение:
// см. КонструкторСпискаДомов
//
Функция СписокДомов(ИдентификаторАдресногоОбъекта, Знач СтрокаПоиска, ПорцияПриПоиске = 20) Экспорт
ВариантыДомов = КонструкторСпискаДомов();
Если СтрЗаканчиваетсяНа(СтрокаПоиска, "%") Тогда
ТочноеСовпадение = Ложь;
СтрокаПоиска = Лев(СтрокаПоиска, СтрДлина(СтрокаПоиска) - 1);
Иначе
ТочноеСовпадение = Истина;
КонецЕсли;
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] Тогда
СписокДомовИзЗагруженныхСведений(ВариантыДомов, ИдентификаторАдресногоОбъекта, СтрокаПоиска, ТочноеСовпадение);
КонецЕсли;
Если ВариантыДомов.Количество() = 0 И ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина Тогда
ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("selectHouse?parentId=%1&limit=%2",
Строка(ИдентификаторАдресногоОбъекта), Формат(ПорцияПриПоиске, "ЧГ=0"));
Если ЗначениеЗаполнено(СтрокаПоиска) Тогда
ТекстGETЗапроса = ТекстGETЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("&text=%1",
СокрЛП(СтрокаПоиска));
КонецЕсли;
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
Если РезультатВебСервис.Отказ Тогда
Возврат ВариантыДомов;
КонецЕсли;
НаименованиеЗданийИСтроений = АдресныйКлассификаторПовтИсп.НаименованиеВладенийИСтроений();
Для каждого СведенияОДоме Из РезультатВебСервис.Данные Цикл
ОписаниеДома = ОписаниеДомаИЗемельногоУчастка();
Если СведенияОДоме.buildings.Количество() > 0 Тогда
Для каждого СведенияОСтроении Из СведенияОДоме.buildings Цикл
Если СтрСравнить(СведенияОСтроении.Type, "Корпус") = 0 Тогда
ОписаниеДома.Корпус= СведенияОСтроении.Number;
Иначе
ОписаниеДома.НазваниеСтроения = СведенияОСтроении.Type;
ОписаниеДома.Строение = СведенияОСтроении.Number;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ОписаниеДома.Идентификатор = СведенияОДоме.id;
ОписаниеДома.Дом = СведенияОДоме.number;
ОписаниеДома.НазваниеВладения = СведенияОДоме.type;
ОписаниеДома.Индекс = Формат(СведенияОДоме.ZipCode, "ЧГ=0");
ОписаниеДома.ОКТМО = Формат(СведенияОДоме.oktmo, "ЧГ=0");
ОписаниеДома.ОКАТО = Формат(СведенияОДоме.okato, "ЧГ=0");
ОписаниеДома.КодИФНСФЛ = Формат(СведенияОДоме.ifnsFlCode, "ЧГ=0");
ОписаниеДома.КодИФНСЮЛ = Формат(СведенияОДоме.ifnsUlCode, "ЧГ=0");
ОписаниеДома.КодУчасткаИФНСФЛ = Формат(СведенияОДоме.ifnsFlAreaCode, "ЧГ=0");
ОписаниеДома.КодУчасткаИФНСЮЛ = Формат(СведенияОДоме.ifnsUlAreaCode, "ЧГ=0");
ДобавитьИнформациюОДоме(ВариантыДомов, ОписаниеДома, НаименованиеЗданийИСтроений, СтрокаПоиска);
КонецЦикла;
КонецЕсли;
ВариантыДомов.Индексы.Добавить("ДомЧислом, Дом, Корпус, Строение");
ВариантыДомов.Сортировать("ДомЧислом, Дом, Строение, Корпус");
Возврат ВариантыДомов;
КонецФункции
// Возвращает есть ли список домов по идентификатору адресного объекта, поиск по подобию.
//
// Параметры:
// ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - родительский объект.
//
// Возвращаемое значение:
// Булево - Истина, если есть информация о домах.
//
Функция ЕстьСписокДомов(ИдентификаторАдресногоОбъекта) Экспорт
Если Не ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда
Возврат Ложь;
КонецЕсли;
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ДомаЗданияСтроения.Строения КАК Строения
|ИЗ
| РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
|ГДЕ
| ДомаЗданияСтроения.АдресныйОбъект = &АдресныйОбъект";
Запрос.УстановитьПараметр("АдресныйОбъект", ИдентификаторАдресногоОбъекта);
ДомаНайдены = НЕ Запрос.Выполнить().Пустой();
Если ДомаНайдены Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Если ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина Тогда
ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("selectHouse?&parentId=%1&limit=1",
Строка(ИдентификаторАдресногоОбъекта));
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
Если РезультатВебСервис.Отказ Тогда
Возврат Ложь;
КонецЕсли;
Возврат РезультатВебСервис.Данные.Количество() > 0;
КонецЕсли;
Возврат Ложь;
КонецФункции
// Возвращает список номеров земельных участков по идентификатору адресного объекта, поиск по подобию.
//
// Параметры:
// ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - родительский объект.
// СтрокаПоиска - Строка - текст, отбора в списке земельных участков.
// ПорцияПриПоиске - Число - кол-во получаемых вариантов за один запрос.
//
// Возвращаемое значение:
// ТаблицаЗначений - найденные варианты.
//
Функция СписокЗемельныхУчастков(ИдентификаторАдресногоОбъекта, Знач СтрокаПоиска, ПорцияПриПоиске = 20) Экспорт
ВариантыЗемельныхУчастков = Новый ТаблицаЗначений;
ВариантыЗемельныхУчастков.Колонки.Добавить("Значение");
ВариантыЗемельныхУчастков.Колонки.Добавить("Представление", ОбщегоНазначения.ОписаниеТипаСтрока(250));
ВариантыЗемельныхУчастков.Колонки.Добавить("Идентификатор");
Если СтрЗаканчиваетсяНа(СтрокаПоиска, "%") Тогда
ТочноеСовпадение = Ложь;
СтрокаПоиска = Лев(СтрокаПоиска, СтрДлина(СтрокаПоиска) - 1);
Иначе
ТочноеСовпадение = Истина;
КонецЕсли;
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] Тогда
СписокЗемельныхУчастковИзЗагруженныхСведений(ВариантыЗемельныхУчастков, ИдентификаторАдресногоОбъекта, СтрокаПоиска, ТочноеСовпадение);
КонецЕсли;
Если ВариантыЗемельныхУчастков.Количество() = 0 И ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина Тогда
ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("select?parentId=%1&limit=%2&level=75",
Строка(ИдентификаторАдресногоОбъекта), Формат(ПорцияПриПоиске, "ЧГ=0"));
Если ЗначениеЗаполнено(СтрокаПоиска) Тогда
ТекстGETЗапроса = ТекстGETЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("&text=%1",
СокрЛП(СтрокаПоиска));
КонецЕсли;
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
Если РезультатВебСервис.Отказ Тогда
Возврат ВариантыЗемельныхУчастков;
КонецЕсли;
Для каждого СведенияОДоме Из РезультатВебСервис.Данные Цикл
ОписаниеУчастка = ОписаниеДомаИЗемельногоУчастка();
ОписаниеУчастка.Идентификатор = СведенияОДоме.id;
ОписаниеУчастка.Дом = СведенияОДоме.steadNumber;
ОписаниеУчастка.Индекс = Формат(СведенияОДоме.ZipCode, "ЧГ=0");
ОписаниеУчастка.ОКТМО = Формат(СведенияОДоме.oktmo, "ЧГ=0");
ОписаниеУчастка.ОКАТО = Формат(СведенияОДоме.okato, "ЧГ=0");
ОписаниеУчастка.КодИФНСФЛ = Формат(СведенияОДоме.ifnsFlCode, "ЧГ=0");
ОписаниеУчастка.КодИФНСЮЛ = Формат(СведенияОДоме.ifnsUlCode, "ЧГ=0");
ОписаниеУчастка.КодУчасткаИФНСФЛ = Формат(СведенияОДоме.ifnsFlAreaCode, "ЧГ=0");
ОписаниеУчастка.КодУчасткаИФНСЮЛ = Формат(СведенияОДоме.ifnsUlAreaCode, "ЧГ=0");
НовыйУчасток = ВариантыЗемельныхУчастков.Добавить();
НовыйУчасток.Значение = ОписаниеУчастка;
НовыйУчасток.Представление = СведенияОДоме.steadNumber;
НовыйУчасток.Идентификатор = СведенияОДоме.id;
КонецЦикла;
КонецЕсли;
ВариантыЗемельныхУчастков.Сортировать("Представление");
Возврат ВариантыЗемельныхУчастков;
КонецФункции
// Возвращает актуальные данные адресного объекта или ориентира с точностью доя подчиненного (без домов).
//
// Параметры:
// СведенияОбАдресномОбъекте - Структура:
// * ЗагруженныеДанные - Булево - признак, что источник адресных сведений загруженные в программу данные.
// * Муниципальный - Булево - признак, что адрес муниципальный.
// * Идентификатор - УникальныйИдентификатор - идентификатор адресного объекта или ориентира.
//
// Возвращаемое значение:
// Структура - найденные варианты. Содержит поля:
// * Отказ - Булево - поставщик не доступен.
// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * Данные - Структура - адрес.
//
Функция АктуальныеАдресныеСведения(СведенияОбАдресномОбъекте) Экспорт
Данные = Новый Структура;
Результат = Новый Структура("Данные", Данные);
СтруктураОписанияОшибкиПоставщика(Результат);
Если СведенияОбАдресномОбъекте.Свойство("ЗагруженныеДанные") Тогда
ЗагруженныеДанные = СведенияОбАдресномОбъекте.ЗагруженныеДанные;
Иначе
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
ЗагруженныеДанные = ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"]; // Если неизвестен источник, то сначала ищем в загруженные данных.
КонецЕсли;
Если СведенияОбАдресномОбъекте.Свойство("Муниципальный") Тогда
ЭтоМуниципальныйАдрес = СведенияОбАдресномОбъекте.Муниципальный;
Иначе
ЭтоМуниципальныйАдрес = Истина;
КонецЕсли;
Если ЗагруженныеДанные = Истина Тогда
ЗаполнитьАктуальныеАдресныеСведенияВнутр(Результат.Данные, СведенияОбАдресномОбъекте);
КонецЕсли;
Если АдресПустой(Результат.Данные) Тогда
ЗаполнитьАктуальныеАдресныеСведенияСервис1С(Результат, СведенияОбАдресномОбъекте.Идентификатор, ЭтоМуниципальныйАдрес);
Если АдресПустой(Результат.Данные) Тогда
Результат.Данные = ОписаниеНовойКонтактнойИнформации();
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
// Проверяет данные на соответствие классификатору.
//
// Параметры:
// Адреса - Массив - проверяемые адреса. Содержит структуры с полями:
// * Адрес - ОбъектXDTO
// - Строка - проверяемый адрес
// ((http://www.v8.1c.ru/ssl/AddressSystem) АдресРФ) или его
// XML-сериализация.
// * ФорматАдреса - Строка - тип используемого классификатора для проверки.
//
// Возвращаемое значение:
// Структура - найденные варианты. Содержит поля:
// * Отказ - Булево - поставщик не доступен.
// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ
// = Ложь.
// * Данные - Массив из Структура - результаты проверки. Индекс результата совпадает с индексом параметра Адреса:
// ** Ошибки - Массив из Структура - описание ошибок поиска в классификаторе. Состоит из структур с полями:
// *** Ключ - Строка - служебный идентификатор места ошибки - путь XPath в объекте XDTO.
// *** Текст - Строка - текст ошибки.
// *** Подсказка - Строка - текст возможного исправления ошибки.
// ** Варианты - Массив из Структура - содержит описание найденных вариантов. Каждый элемент - структура с полями:
// *** Идентификатор - УникальныйИдентификатор - код классификатора объекта - варианта.
// *** Индекс - Число - почтовый индекс объекта - варианта.
// *** КодКЛАДР - Число - код КЛАДР ближайшего объекта.
// *** OKATO - Число - данные ФНС.
// *** ОКТМО - Число - данные ФНС.
// *** КодИФНСФЛ - Число - данные ФНС.
// *** КодИФНСЮЛ - Число - данные ФНС.
// *** КодУчасткаИФНСФЛ - Число - данные ФНС.
// *** КодУчасткаИФНСЮЛ - Число - данные ФНС.
//
Функция РезультатПроверкиАдресовПоКлассификатору(Адреса) Экспорт
Результат = Новый Структура("Данные", Новый Массив);
СтруктураОписанияОшибкиПоставщика(Результат);
// Приводим типы
АдресаВебСервис = Новый Соответствие;
АдресаЗагруженныеДанные = Новый Соответствие;
НаборАдресов = Новый Соответствие;
Если ТипЗнч(Адреса) <> Тип("Массив") Тогда
Если ТипЗнч(Адреса) <> Тип("Структура") Или Не Адреса.Свойство("Area") Тогда
Возврат Результат;
КонецЕсли;
Адреса = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Адреса);
КонецЕсли;
Для ПорядковыйНомер = 0 По Адреса.ВГраница() Цикл
НаборАдресов.Вставить(ПорядковыйНомер, Адреса[ПорядковыйНомер].Адрес);
КонецЦикла;
ПервичнаяПроверка = ПервичнаяПроверкаАдресов(НаборАдресов);
Для каждого АдресПроверки Из ПервичнаяПроверка.Адреса Цикл
УникальныйКлюч = АдресПроверки.Ключ;
СведенияОАдресе = АдресПроверки.Значение;
Адрес = НаборАдресов[УникальныйКлюч];
Если СведенияОАдресе.АдресПроверен И Не СведенияОАдресе.АдресКорректный Тогда
Результат.Данные.Добавить(СведенияОАдресе);
Продолжить;
КонецЕсли;
ЗагруженныеСведения = СведенияОРегионе(Адрес.Area + " " + Адрес.AreaType);
Если ЗагруженныеСведения.Загружен Тогда
АдресаЗагруженныеДанные.Вставить(УникальныйКлюч, Адрес);
Иначе
АдресаВебСервис.Вставить(УникальныйКлюч, Адрес);
КонецЕсли;
КонецЦикла;
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
РезультатЗагруженныеДанные = Новый Соответствие;
РезультатВебСервис = Новый Соответствие;
Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] И АдресаЗагруженныеДанные.Количество() > 0 Тогда
РезультатЗагруженныеДанные = ПроверитьАдресаПоКлассификатору(АдресаЗагруженныеДанные, Истина);
КонецЕсли;
Если ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина И АдресаВебСервис.Количество() > 0 Тогда
ДанныеИзВебСервиса = ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С(АдресаВебСервис);
Если Не ДанныеИзВебСервиса.Отказ Тогда
РезультатВебСервис = ДанныеИзВебСервиса.Данные;
КонецЕсли;
КонецЕсли;
ТаблицаДляСортировки = Новый ТаблицаЗначений;
ТаблицаДляСортировки.Колонки.Добавить("ПорядковыйНомер", ОбщегоНазначения.ОписаниеТипаЧисло(10));
ТаблицаДляСортировки.Колонки.Добавить("Адрес");
Для каждого АдресВНаборе Из НаборАдресов Цикл
НоваяСтрока = ТаблицаДляСортировки.Добавить();
НоваяСтрока.ПорядковыйНомер = АдресВНаборе.Ключ;
НоваяСтрока.Адрес = АдресВНаборе.Значение;
КонецЦикла;
ТаблицаДляСортировки.Сортировать("ПорядковыйНомер");
Для Каждого Строка Из ТаблицаДляСортировки Цикл
РезультатПроверки = РезультатЗагруженныеДанные[Строка.ПорядковыйНомер];
Если РезультатПроверки = Неопределено Тогда
РезультатПроверки = РезультатВебСервис[Строка.ПорядковыйНомер];
Если РезультатПроверки = Неопределено Тогда
РезультатПроверки = Новый Структура();
РезультатПроверки.Вставить("id", Строка.ПорядковыйНомер);
РезультатПроверки.Вставить("АдресПроверен", Ложь);
РезультатПроверки.Вставить("Варианты", Новый Массив);
РезультатПроверки.Вставить("Ошибки", Новый Массив);
КонецЕсли;
КонецЕсли;
Результат.Данные.Добавить(РезультатПроверки);
КонецЦикла;
Возврат Результат;
КонецФункции
// Параметры:
// НаборАдресов - Соответствие
// ПроверятьУстареваниеАдресов - Булево
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Число
// * Значение - см. РезультатПроверкиАдреса
//
Функция ПроверкаАдресов(Знач НаборАдресов, ПроверятьУстареваниеАдресов = Ложь) Экспорт
Результат = Новый Соответствие;
РезультатыЗагруженныеДанные = Новый Соответствие;
РезультатыВебСервис = Новый Соответствие;
АдресаВебСервис = Новый Соответствие;
АдресаЗагруженныеДанные = Новый Соответствие;
ПервичнаяПроверка = ПервичнаяПроверкаАдресов(НаборАдресов);
Для каждого АдресПроверки Из ПервичнаяПроверка.Адреса Цикл
УникальныйКлюч = АдресПроверки.Ключ;
СведенияОАдресе = АдресПроверки.Значение;
Адрес = НаборАдресов[УникальныйКлюч];
Если СведенияОАдресе.АдресПроверен И Не СведенияОАдресе.АдресКорректный Тогда
Результат.Вставить(УникальныйКлюч, СведенияОАдресе);
Продолжить;
КонецЕсли;
ЗагруженныеСведения = СведенияОРегионе(Адрес.Area + " " + Адрес.AreaType);
Если ЗагруженныеСведения.Загружен Тогда
АдресаЗагруженныеДанные.Вставить(УникальныйКлюч, Адрес);
Иначе
АдресаВебСервис.Вставить(УникальныйКлюч, Адрес);
КонецЕсли;
КонецЦикла;
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] И АдресаЗагруженныеДанные.Количество() > 0 Тогда
РезультатыЗагруженныеДанные = ПроверитьАдресаПоКлассификатору(АдресаЗагруженныеДанные, ПроверятьУстареваниеАдресов);
Для Каждого РезультатЗагруженныеДанные Из РезультатыЗагруженныеДанные Цикл
Результат.Вставить(РезультатЗагруженныеДанные.Ключ, РезультатЗагруженныеДанные.Значение);
КонецЦикла;
КонецЕсли;
Если ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина И АдресаВебСервис.Количество() > 0 Тогда
ДанныеИзВебСервиса = ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С(АдресаВебСервис);
Если Не ДанныеИзВебСервиса.Отказ Тогда
РезультатыВебСервис = ДанныеИзВебСервиса.Данные;
КонецЕсли;
Для Каждого РезультатВебСервис Из РезультатыВебСервис Цикл
Результат.Вставить(РезультатВебСервис.Ключ, РезультатВебСервис.Значение);
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
// Преобразует формат из 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.Добавить(ЗначениеСтроенияИлиПомещения(Помещение.Тип, Помещение.Значение));
КонецЦикла;
КонецЕсли;
УстановитьИдентификаторыАдреса(Результат);
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Число
// * Значение - Структура:
// ** Отказ - Булево - поставщик не доступен.
// ** ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ=Ложь.
// ** КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен. Неопределено, если Отказ=Ложь.
// ** Данные - Массив из Структура - результаты проверки. где:
// *** Ошибки - Массив из Структура - описание ошибок поиска в классификаторе. Состоит из структур с полями:
// **** Ключ - Строка - служебный идентификатор места ошибки - путь XPath в объекте XDTO.
// **** Текст - Строка - текст ошибки.
// **** Подсказка - Строка - текст возможного исправления ошибки.
// *** Варианты - Массив из Структура - содержит описание найденных вариантов. Каждый элемент структура с полями:
// **** Идентификатор - УникальныйИдентификатор - код классификатора объекта - варианта.
// **** Индекс - Число - почтовый индекс объекта - варианта.
// **** КодКЛАДР - Число - код КЛАДР ближайшего объекта.
// **** OKATO - Число - данные ФНС.
// **** ОКТМО - Число - данные ФНС.
// **** КодИФНСФЛ - Число - данные ФНС.
// **** КодИФНСЮЛ - Число - данные ФНС.
// **** КодУчасткаИФНСФЛ - Число - данные ФНС.
// **** КодУчасткаИФНСЮЛ - Число - данные ФНС.
//
Функция РезультатПроверкиАдресов(НаборАдресов, ПроверятьУстареваниеАдресов = Ложь) Экспорт
АдресаВебСервис = Новый Соответствие;
АдресаЗагруженныеДанные = Новый Соответствие;
РезультатыВебСервис = Новый Соответствие;
РезультатЗагруженныеДанные = Новый Соответствие;
ПервичнаяПроверка = ПервичнаяПроверкаАдресов(НаборАдресов);
Для каждого АдресПроверки Из ПервичнаяПроверка.Адреса Цикл
УникальныйКлюч = АдресПроверки.Ключ;
СведенияОАдресе = АдресПроверки.Значение;
Адрес = НаборАдресов[УникальныйКлюч];
Если СведенияОАдресе.АдресПроверен Тогда
РезультатЗагруженныеДанные.Вставить(УникальныйКлюч, СведенияОАдресе);
Продолжить;
КонецЕсли;
ЗагруженныеСведения = СведенияОРегионе(Адрес.Area + " " + Адрес.AreaType);
Если ЗагруженныеСведения.Загружен Тогда
АдресаЗагруженныеДанные.Вставить(УникальныйКлюч, Адрес);
Иначе
АдресаВебСервис.Вставить(УникальныйКлюч, Адрес);
КонецЕсли;
КонецЦикла;
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] И АдресаЗагруженныеДанные.Количество() > 0 Тогда
РезультатЗагруженныеДанные = ПроверитьАдресаПоКлассификатору(АдресаЗагруженныеДанные, ПроверятьУстареваниеАдресов);
КонецЕсли;
Если ЗагруженныеАдресныеСведения["КлассификаторДоступен"] = Истина И АдресаВебСервис.Количество() > 0 Тогда
ДанныеИзВебСервиса = ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С(АдресаВебСервис, Ложь);
Если Не ДанныеИзВебСервиса.Отказ Тогда
РезультатыВебСервис = ДанныеИзВебСервиса.Данные;
КонецЕсли;
КонецЕсли;
Для каждого РезультатВебСервис Из РезультатыВебСервис Цикл
РезультатЗагруженныеДанные.Вставить(РезультатВебСервис.Ключ, РезультатВебСервис.Значение);
КонецЦикла;
Возврат РезультатЗагруженныеДанные;
КонецФункции
// Возвращает соответствие полных наименований адресных объектов и их сокращения.
//
// Параметры:
// НаименованияАдресныхОбъектов - Массив - полные наименования адресных объектов. Если передан пустой массив,
// то будут возвращен полный список наименований и сокращений.
//
// Возвращаемое значение:
// Соответствие - соответствие найденных полных наименований адресных объектов их сокращениям.
//
Функция СокращенияАдресныхОбъектов(НаименованияАдресныхОбъектов = Неопределено) Экспорт
Результат = Новый Соответствие;
Источник = ИсточникДанныхАдресногоКлассификатора();
Если ПустаяСтрока(Источник) Тогда
ТаблицаАдресныхСокращений = ТаблицаАдресныхСокращений(НаименованияАдресныхОбъектов);
Для каждого СтрокаТаблицы Из ТаблицаАдресныхСокращений Цикл
Результат.Вставить(ВРег(СтрокаТаблицы.Наименование), СтрокаТаблицы.Сокращение);
КонецЦикла;
Если Результат.Количество() > 0 Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
// Веб сервис 1С или классификатор не загружен, получаем данные о сокращениях из макета.
ТаблицаАдресныхСокращений = АдресныеСокращения();
Если ТипЗнч(НаименованияАдресныхОбъектов) = Тип("Массив") И НаименованияАдресныхОбъектов.Количество() > 0 Тогда
Для каждого ПолноеНаименование Из НаименованияАдресныхОбъектов Цикл
СтрокаТаблицы = ТаблицаАдресныхСокращений.Найти(ПерваяБукваЗаглавная(ПолноеНаименование), "Наименование");
Если СтрокаТаблицы <> Неопределено Тогда
Результат.Вставить(ВРег(СтрокаТаблицы.Наименование), СтрокаТаблицы.Сокращение);
КонецЕсли;
КонецЦикла;
Иначе
Для каждого СтрокаТаблицы Из ТаблицаАдресныхСокращений Цикл
Результат.Вставить(ВРег(СтрокаТаблицы.Наименование), СтрокаТаблицы.Сокращение);
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция АдресныеСокращения() Экспорт
Возврат РегистрыСведений.АдресныеОбъекты.АдресныеСокращения();
КонецФункции
Функция АдресныеСокращенияПриказМинфинаРФ171н() Экспорт
Возврат АдресныйКлассификаторПовтИсп.АдресныеСокращенияПриказМинфинаРФ171н();
КонецФункции
// Обратная совместимость
//
Функция КраткоеНаписаниеМуниципальныхРайонов(Наименование, Сокращение) Экспорт
МуниципальныеРайоны = АдресныйКлассификаторПовтИсп.МуниципальныеРайоны();
ВырезаемаяПодстрока = МуниципальныеРайоны.Получить(ВРег(Сокращение));
Если ЗначениеЗаполнено(ВырезаемаяПодстрока) Тогда
Наименование = ОбрезанноеНазвание(Наименование, ВырезаемаяПодстрока);
КонецЕсли;
Возврат Наименование;
КонецФункции
// Обратная совместимость
//
// Параметры:
// Наименование - Строка
// Сокращение - Строка
//
// Возвращаемое значение:
// Строка - краткое написание поселений
//
Функция КраткоеНаписаниеПоселений(Знач Наименование, Сокращение) Экспорт
Поселения = АдресныйКлассификаторПовтИсп.Поселения();
ВырезаемаяПодстрока = Поселения.Получить(ВРег(Сокращение));
Если ЗначениеЗаполнено(ВырезаемаяПодстрока) Тогда
Наименование = ОбрезанноеНазвание(Наименование, ВырезаемаяПодстрока);
КонецЕсли;
Возврат Наименование;
КонецФункции
// Определение кодов ОКАТО, ОКТМО, налоговых инспекций ФНС и др. адреса
//
// Параметры:
// Адрес - Строка - адрес в формате JSON или XML
// Источник - Строка - устарело. Код сначала ищется в загруженных данных и если не найден, то в веб-сервисе.
//
// Возвращаемое значение:
// Структура - коды адреса.
//
Функция КодыАдреса(Знач Адрес, Источник = Неопределено) Экспорт
Если ЭтоКонтактнаяИнформацияВXML(Адрес) Тогда
АдресСтруктура = КонтактнаяИнформацияВСтруктуруJSON(Адрес);
ИначеЕсли ЭтоКонтактнаяИнформацияВJSON(Адрес) Тогда
АдресСтруктура = JSONВКонтактнуюИнформациюПоПолям(Адрес);
ИначеЕсли ЭтоКонтактнаяИнформацияВФорматеКлючЗначение(Адрес) Тогда
АдресСтруктура = КонтактнаяИнформацияВФорматеКлючЗначениеВJSON(Адрес);
Иначе
ОписаниеПричиныОшибки = НСтр("ru = 'Передано недопустимое значение адреса в функцию получения кодов адреса'");
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(),
УровеньЖурналаРегистрации.Предупреждение,,Адрес, ОписаниеПричиныОшибки);
Возврат КонструкторКодовАдреса();
КонецЕсли;
ИдентификаторАдресногоОбъекта = "";
Если ТипЗнч(АдресСтруктура) = Тип("Структура") И АдресСтруктура.Свойство("ID") И ЗначениеЗаполнено(АдресСтруктура.ID) Тогда
ИдентификаторАдресногоОбъекта = АдресСтруктура.ID;
КонецЕсли;
Возврат КодыАдресаИКодыКЛАДР(АдресСтруктура, ИдентификаторАдресногоОбъекта, Источник)
КонецФункции
// Определение кодов КЛАДР и ОКАТО, ОКТМО, налоговых инспекций ФНС и др. адреса.
//
// Параметры:
// Адрес - Строка - адрес в формате XML или структура с полями адреса.
// ИдентификаторАдресногоОбъекта - Строка - идентификатор адреса.
// Источник - Строка - источник получения кодов адреса, Варианты: "Сервис1С", "ЗагруженныеДанные".
// Возвращаемое значение:
// Структура - содержит 2 структуры: Коды адреса и Коды КЛАДР.
//
Функция КодыАдресаИКодыКЛАДР(Знач Адрес, Знач ИдентификаторАдресногоОбъекта = "", Источник = Неопределено) Экспорт
Результат = КонструкторКодовАдреса();
КодКЛАДРЗаполнены = Ложь;
ЗагруженныеАдресныеСведения = АдресныйКлассификаторПовтИсп.СведенияОЗагрузкеСубъектовРФ();
КешДомов = Новый Структура("НомерКорпуса, НомерСтроения, ТипСтроения");
Для каждого Корпус Из Адрес.Buildings Цикл
Если СтрСравнить(Корпус.Type, "Корпус") = 0 Тогда
КешДомов.НомерКорпуса = Корпус.Number;
Иначе
КешДомов.ТипСтроения = Корпус.Type;
КешДомов.НомерСтроения = Корпус.Number;
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(ИдентификаторАдресногоОбъекта) Тогда
Если Не ЗначениеЗаполнено(Адрес.ID) Тогда
УстановитьИдентификаторыАдреса(Адрес, Источник);
КонецЕсли;
ИдентификаторАдресногоОбъекта = Адрес.ID;
КонецЕсли;
Результат.КодыАдреса.Идентификатор = ИдентификаторАдресногоОбъекта;
Если ЗагруженныеАдресныеСведения["ИспользоватьЗагруженные"] И Источник <> "Сервис1С" Тогда
ОсновныеКодыЗаполнены = Ложь;
// Основные коды
Если ЗаполненыВсеИдентификаторыОбъекта(Адрес) И ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда
СведенияОДоме = СведенияОДоме();
СведенияОДоме.НомерДома = Адрес.HouseNumber;
СведенияОДоме.ТипДома = Адрес.HouseType;
СведенияОДоме.НомерКорпуса = КешДомов.НомерКорпуса;
СведенияОДоме.НомерСтроения = КешДомов.НомерСтроения;
СведенияОДоме.ТипСтроения = КешДомов.ТипСтроения;
ОсновныеКодыЗаполнены = ЗаполнитьКодыАдреса(Результат.КодыАдреса, ИдентификаторАдресногоОбъекта, СведенияОДоме);
КонецЕсли;
КодКЛАДРЗаполнены = Ложь;
Если ЗаполненыВсеИдентификаторыОбъекта(Адрес) И ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда
// Основные КЛАДР
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
| АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
|ГДЕ
| АдресныеОбъекты.Идентификатор = &Идентификатор");
Запрос.УстановитьПараметр("Идентификатор", ИдентификаторАдресногоОбъекта);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
КодКЛАДР = КодКЛАДРСтрокой(РезультатЗапроса.Выгрузить()[0].КодКЛАДР);
Результат.КодыАдреса.КодКЛАДР = КодКЛАДР;
СформироватьКодыКЛАДР(КодКЛАДР, Адрес, Результат.КодыКЛАДР);
КодКЛАДРЗаполнены = Истина;
КонецЕсли;
КонецЕсли;
Если КодКЛАДРЗаполнены И ОсновныеКодыЗаполнены Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
// Получаем коды из веб-сервиса.
Если ЗагруженныеАдресныеСведения["КлассификаторДоступен"] Или Источник = "Сервис1С" Тогда
Адреса = Новый Соответствие;
Адреса.Вставить(1, Адрес);
РезультатВебСервис = ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С(Адреса);
Если НЕ РезультатВебСервис.Отказ Тогда
АдресПослеПроверки = РезультатВебСервис.Данные.Получить(1);
Если Не АдресПослеПроверки.АдресКорректный Или АдресПослеПроверки.Варианты.Количество() = 0 Тогда
Возврат Результат;
КонецЕсли;
Сведения = АдресПослеПроверки.Варианты[0];
Если Не КодКЛАДРЗаполнены Тогда
Результат.КодыАдреса.КодКЛАДР = Сведения.codeKLADR;
СформироватьКодыКЛАДР(Результат.КодыАдреса.КодКЛАДР, Адрес, Результат.КодыКЛАДР);
КонецЕсли;
Результат.КодыАдреса.КодКЛАДР = Сведения.codeKLADR;
Результат.КодыАдреса.Идентификатор = ИдентификаторАдресногоОбъекта(Сведения, Адрес.addressType);
Результат.КодыАдреса.ИдентификаторДома = ?(ЗначениеЗаполнено(Сведения.houseId), Сведения.houseId, "");
Результат.КодыАдреса.ОКАТО = Сведения.okato;
Результат.КодыАдреса.ОКТМО = Сведения.oktmo;
Результат.КодыАдреса.КодИФНСФЛ = Сведения.ifnsFlCode;
Результат.КодыАдреса.КодИФНСЮЛ = Сведения.ifnsUlCode;
Результат.КодыАдреса.КодУчасткаИФНСФЛ = Сведения.ifnsFlAreaCode;
Результат.КодыАдреса.КодУчасткаИФНСЮЛ = Сведения.ifnsUlAreaCode;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
// Полные наименования сокращений.
//
// Параметры:
// СоответствиеСокращений - Соответствие - сокращения адреса.
//
Процедура ПолныеНаименованияСокращений(СоответствиеСокращений) Экспорт
СписокСокращений = АдресныйКлассификаторПовтИсп.СписокСокращений();
АдресныеСокращения = АдресныеСокращения();
Для Каждого ОписаниеСокращения Из СоответствиеСокращений Цикл
Если ПустаяСтрока(ОписаниеСокращения.Значение) Тогда
Продолжить;
КонецЕсли;
ПолноеНаименование = Строка(СписокСокращений.Получить(Строка(ОписаниеСокращения.Ключ) + ОписаниеСокращения.Значение));
Если ЗначениеЗаполнено(ПолноеНаименование) Тогда
СоответствиеСокращений[ОписаниеСокращения.Ключ] = ПолноеНаименование;
Иначе
Отбор = Новый Структура();
Отбор.Вставить("Уровень", ОписаниеСокращения.Ключ);
Отбор.Вставить("Сокращение", ОписаниеСокращения.Значение);
НайденныеСокращения = АдресныеСокращения.НайтиСтроки(Отбор);
Если НайденныеСокращения.Количество() > 0 Тогда
СоответствиеСокращений[ОписаниеСокращения.Ключ] = НайденныеСокращения[0].Наименование;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Проверяет наличие записей о регионах в регистре сведений АдресныеОбъекты и заполняет их в случае отсутствия.
//
// Возвращаемое значение:
// Булево
//
Функция ПроверитьНачальноеЗаполнение() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| АдресныеОбъекты.Уровень
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
|ГДЕ
| АдресныеОбъекты.Уровень = 1";
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() = 0 Тогда
Если ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты) Тогда
ВыполнитьНачальноеЗаполнение();
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Истина;
КонецФункции
// Возвращает код региона и проверяет наличие загруженных адресных сведений по региону.
//
// Параметры:
// НаименованиеРегиона - Строка
//
// Возвращаемое значение:
// см. АдресныйКлассификаторПовтИсп.СведенияОРегионе
//
Функция СведенияОРегионе(НаименованиеРегиона) Экспорт
Результат = АдресныйКлассификаторПовтИсп.СведенияОРегионе(АдаптацияНазванияРегиона(НаименованиеРегиона));
Возврат Результат;
КонецФункции
// Возвращает информацию о состоянии загруженности регионов.
//
// Возвращаемое значение:
// ТаблицаЗначений - описание состояния. Содержит колонки::
// * КодСубъектаРФ - Число - код региона.
// * Идентификатор - УникальныйИдентификатор - идентификатор региона.
// * Представление - Строка - наименование и сокращение региона.
// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен.
// * ДатаВерсии - Дата - UTC версия загруженных данных.
//
Функция СведенияОЗагрузкеСубъектовРФ() Экспорт
Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
// Выбираем все возможные данные - и из регистра, и из классификатора.
// Считаем, что уникальность обеспечивается не идентификатором (что правильно), а кодом субъекта
// из-за особенностей платформы по передаче уникального идентификатора в таблицу-параметр запроса.
Запрос = Новый Запрос("ВЫБРАТЬ
| Параметр.Наименование КАК Наименование,
| Параметр.Сокращение КАК Сокращение,
| Параметр.ОКТМО КАК ОКТМО,
| Параметр.КодСубъектаРФ КАК КодСубъектаРФ
|ПОМЕСТИТЬ Классификатор
|ИЗ
| &Классификатор КАК Параметр
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Классификатор.Наименование КАК Наименование,
| Классификатор.Сокращение КАК Сокращение,
| Классификатор.КодСубъектаРФ КАК КодСубъектаРФ,
| Классификатор.ОКТМО КАК ОКТМО,
| ЗагруженныеВерсииАдресныхСведений.Версия КАК Версия,
| ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаВерсии, ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)) КАК ДатаВерсии,
| ЕСТЬNULL(ЗагруженныеВерсииАдресныхСведений.ДатаЗагрузки, ДАТАВРЕМЯ(1, 1, 1, 1, 1, 1)) КАК ДатаЗагрузки,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| НЕ ЗагруженныеВерсииАдресныхСведений.Версия ЕСТЬ NULL КАК Загружено,
| ДОБАВИТЬКДАТЕ(ЗагруженныеВерсииАдресныхСведений.ДатаЗагрузки, МЕСЯЦ, 1) < &ТекущаяДата КАК Устарело
|ИЗ
| Классификатор КАК Классификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты.КодСубъектаРФ = Классификатор.КодСубъектаРФ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений
| ПО (Классификатор.КодСубъектаРФ = ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ)
|ГДЕ
| АдресныеОбъекты.Уровень = 1
|УПОРЯДОЧИТЬ ПО
| КодСубъектаРФ");
Запрос.УстановитьПараметр("Классификатор", Классификатор);
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
РезультатВыборкиЗагруженныхСведений = Запрос.Выполнить();
Если РезультатВыборкиЗагруженныхСведений.Пустой() Тогда
ВыполнитьНачальноеЗаполнение();
РезультатВыборкиЗагруженныхСведений = Запрос.Выполнить();
ЗагруженныеСведения = РезультатВыборкиЗагруженныхСведений.Выгрузить();
Иначе
ЗагруженныеСведения = РезультатВыборкиЗагруженныхСведений.Выгрузить();
ТребуетсяВосстановлениеРегиона = Ложь;
Для каждого РегионИзКлассификатора Из Классификатор Цикл
НайденныйРегион = ЗагруженныеСведения.Найти(РегионИзКлассификатора.Идентификатор, "Идентификатор");
Если НайденныйРегион = Неопределено Тогда
ТребуетсяВосстановлениеРегиона = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ТребуетсяВосстановлениеРегиона Тогда
ВыполнитьНачальноеЗаполнение();
РезультатВыборкиЗагруженныхСведений = Запрос.Выполнить();
ЗагруженныеСведения = РезультатВыборкиЗагруженныхСведений.Выгрузить();
КонецЕсли;
КонецЕсли;
ЗагруженныеСведения.Индексы.Добавить("Идентификатор");
ЗагруженныеСведения.Индексы.Добавить("КодСубъектаРФ");
ЗагруженныеСведения.Индексы.Добавить("Загружено");
ЗагруженныеСведения.Индексы.Добавить("ОКТМО");
ЗагруженныеСведения.Колонки.Добавить("Представление", ОбщегоНазначения.ОписаниеТипаСтрока(250));
// Корректируем идентификаторы из-за особенностей платформы по передаче уникального
// идентификатора в таблицу-параметр запроса.
// Формируем наименования регионов по правилам их написания.
Для Каждого Строка Из ЗагруженныеСведения Цикл
Строка.Представление = СоединитьНаименованиеИТипАдресногоОбъекта(Строка.Наименование, Строка.Сокращение, Истина);
Если Не ЗначениеЗаполнено(Строка.Идентификатор) Тогда
СтрокаКлассификатора = Классификатор.Найти(Строка.КодСубъектаРФ, "КодСубъектаРФ");
Если СтрокаКлассификатора <> Неопределено Тогда
Строка.Идентификатор = СтрокаКлассификатора.Идентификатор;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат ЗагруженныеСведения;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.
Функция НавигационнаяСсылкаЗагрузкиАдресногоКлассификатора() Экспорт
Возврат "e1cib/command/РегистрСведений.АдресныеОбъекты.Команда.ЗагрузитьАдресныйКлассификатор";
КонецФункции
// Параметры:
// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей
//
Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт
// ТолькоДляПользователейСистемы.
НазначениеРолей.ТолькоДляПользователейСистемы.Добавить(
Метаданные.Роли.ДобавлениеИзменениеАдресныхСведений.Имя);
КонецПроцедуры
// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента.
Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт
Параметры.Вставить("АдресныйКлассификаторУстарел", УстаревшийКлассификаторСодержитСведения());
КонецПроцедуры
// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам
Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт
Если ОбщегоНазначения.РазделениеВключено() Тогда
Возврат;
КонецЕсли;
// Разрешение на проверку обновления.
АдресФайлаВерсий = ОбщегоНазначенияКлиентСервер.СтруктураURI(
АдресФайлаОписанияДоступныхВерсий());
Протокол = ВРег(АдресФайлаВерсий.Схема);
Адрес = АдресФайлаВерсий.Хост;
Порт = АдресФайлаВерсий.Порт;
Описание = НСтр("ru = 'Загрузка обновлений адресного классификатора.'");
МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
Разрешения = Новый Массив;
Разрешения.Добавить(
МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание));
ВладелецРазрешения = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.РегистрыСведений.АдресныеОбъекты.ПолноеИмя());
ЗапросРазрешений = МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ВладелецРазрешения, Истина);
ЗапросыРазрешений.Добавить(ЗапросРазрешений);
// Веб-сервис
АдресВебСервиса = ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресВебСервисаКонтактнойИнформации());
Протокол = ВРег(АдресВебСервиса.Схема);
Адрес = АдресВебСервиса.Хост;
Порт = АдресВебСервиса.Порт;
Описание = НСтр("ru = 'Веб-сервис адресного классификатора.'");
Разрешения = Новый Массив;
Разрешения.Добавить(
МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, Адрес, Порт, Описание));
ВладелецРазрешения = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Метаданные.РегистрыСведений.АдресныеОбъекты.ПолноеИмя());
ЗапросРазрешений = МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения, ВладелецРазрешения, Истина);
ЗапросыРазрешений.Добавить(ЗапросРазрешений);
КонецПроцедуры
// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
// Заполнение начальных данных.
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "3.0.1.223";
Обработчик.Процедура = "АдресныйКлассификаторСлужебный.ВыполнитьНачальноеЗаполнение";
Обработчик.НачальноеЗаполнение = Истина;
Обработчик.ОбщиеДанные = Истина;
Обработчик.РежимВыполнения = "Оперативно";
КонецПроцедуры
// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел
Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
Если ОбщегоНазначения.РазделениеВключено() Тогда
Возврат; // Модель сервиса.
КонецЕсли;
Если Не ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты) Тогда
Возврат; // Нет прав.
КонецЕсли;
МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер");
Подсистема = Метаданные.Подсистемы.Найти("Администрирование");
Если Подсистема = Неопределено
Или Не ПравоДоступа("Просмотр", Подсистема)
Или Не ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(Подсистема) Тогда
Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта("РегистрСведений.АдресныеОбъекты");
Иначе
Разделы = Новый Массив;
Разделы.Добавить(Подсистема);
КонецЕсли;
// 1. Необходимость актуализировать адресный классификатор - в старом классификаторе больше нет записей о регионах.
УстаревшийКлассификатор = ЗаполненныеРегионыУстаревшегоКлассификатора();
Для Каждого Раздел Из Разделы Цикл
Дело = ТекущиеДела.Добавить();
Дело.Идентификатор = "АктуализацияАдресногоКлассификатора";
Дело.ЕстьДела = УстаревшийКлассификатор;
Дело.Важное = Истина;
Дело.СкрыватьВНастройках = Истина;
Дело.Владелец = Раздел;
Дело.Представление = НСтр("ru = 'Адресный классификатор устарел'");
Дело.Количество = 0;
Дело.Подсказка = НСтр("ru = 'Автоподбор и проверка корректности адресов временно недоступны.'");
Дело.ПараметрыФормы = Новый Структура;
Дело.Форма = "РегистрСведений.АдресныеОбъекты.Форма.АктуализацияУстаревшегоКлассификатора";
Если Дело.ЕстьДела = Истина Тогда
Возврат;
КонецЕсли;
КонецЦикла;
// 2. Необходимость обновления адресного классификатора.
ПоследнееОбновление = ОписаниеПоследнейЗагрузки();
Подсказка = ПоследнееОбновление.Представление;
Подсказка = Подсказка + Символы.ПС + НСтр("ru = 'Необходимо проверить наличие обновлений.'");
Для Каждого Раздел Из Разделы Цикл
Дело = ТекущиеДела.Добавить();
Дело.Идентификатор = "ОбновлениеАдресногоКлассификатора";
Дело.ЕстьДела = ПоследнееОбновление.НеобходимоОбновление;
Дело.Важное = ПоследнееОбновление.НеобходимоОбновление;
Дело.Владелец = Раздел;
Дело.Представление = НСтр("ru = 'Адресный классификатор устарел'");
Дело.Количество = 0;
Дело.Подсказка = Подсказка;
Дело.ПараметрыФормы = Новый Структура("Режим", "ПроверкаОбновления");
Дело.Форма = "РегистрСведений.АдресныеОбъекты.Форма.ЗагрузкаАдресногоКлассификатора";
КонецЦикла;
КонецПроцедуры
Функция ЕстьПравоДобавлениеИзменениеАдресныхСведений() Экспорт
Возврат ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты);
КонецФункции
#Область АдресныйКлассификаторВМоделиСервиса
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.
// См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных.
Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт
ЗарегистрироватьОбработчикиПоставляемыхДанных(Обработчики);
КонецПроцедуры
// Параметры:
// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.Типы
//
Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт
Типы.Добавить(Метаданные.Константы.ИсточникДанныхАдресногоКлассификатора);
МетаданныеРегистров = Метаданные.РегистрыСведений;
Типы.Добавить(МетаданныеРегистров.АдресныеОбъекты);
Типы.Добавить(МетаданныеРегистров.ДомаЗданияСтроения);
Типы.Добавить(МетаданныеРегистров.ДополнительныеАдресныеСведения);
Типы.Добавить(МетаданныеРегистров.ЗагруженныеВерсииАдресныхСведений);
Типы.Добавить(МетаданныеРегистров.ИсторияАдресныхОбъектов);
Типы.Добавить(МетаданныеРегистров.ОриентирыАдресныхОбъектов);
Типы.Добавить(МетаданныеРегистров.ПричиныИзмененияАдресныхСведений);
Типы.Добавить(МетаданныеРегистров.СлужебныеАдресныеСведения);
Типы.Добавить(МетаданныеРегистров.УровниСокращенийАдресныхСведений);
КонецПроцедуры
// Вызывается при получении уведомления о новых данных.
// В теле следует проверить, необходимы ли эти данные приложению,
// и если да - установить флажок Загружать.
//
// Параметры:
// Дескриптор - ОбъектXDTO - дескриптор.
// Загружать - Булево - Истина, если загружать, Ложь - иначе.
//
Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт
Если Дескриптор.DataType = "ФИАС30" Тогда
Загружать = ПроверитьНаличиеНовыхДанных(Дескриптор);
КонецЕсли;
КонецПроцедуры
// Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные.
//
// Параметры:
// Дескриптор - ОбъектXDTO - дескриптор.
// ПутьКФайлу - Строка - полное имя извлеченного файла. Файл будет автоматически удален
// после завершения процедуры. Если в менеджере сервиса не был
// указан файл - значение аргумента равно Неопределено.
//
Процедура ОбработатьНовыеДанные(Знач Дескриптор, Знач ПутьКФайлу) Экспорт
Если Дескриптор.DataType = "ФИАС30" Тогда
ОбработатьАдресныйКлассификатор(Дескриптор, ПутьКФайлу);
КонецЕсли;
КонецПроцедуры
// Вызывается при отмене обработки данных в случае сбоя.
//
// Параметры:
// Дескриптор - ОбъектXDTO - дескриптор
//
Процедура ОбработкаДанныхОтменена(Знач Дескриптор) Экспорт
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция АдаптацияНазванияРегиона(Название) Экспорт
Если СтрСравнить(Название, "Кемеровская область - Кузбасс обл") = 0
Или СтрСравнить(Название, "Кемеровская область - Кузбасс область") = 0
Или СтрСравнить(Название, "Кемеровская область") = 0 Тогда
Возврат "Кемеровская область - Кузбасс";
КонецЕсли;
Возврат СокрЛП(Название);
КонецФункции
// Параметры:
// НаименованияАдресныхОбъектов - Массив
// Возвращаемое значение:
// ТаблицаЗначений:
// * Наименование - Строка
// * Сокращение - Строка
//
Функция ТаблицаАдресныхСокращений(НаименованияАдресныхОбъектов)
СтрокаЗапросГде = "";
Если ТипЗнч(НаименованияАдресныхОбъектов) = Тип("Массив") И НаименованияАдресныхОбъектов.Количество() > 0 Тогда
СтрокаЗапросГде = " ГДЕ УровниСокращенийАдресныхСведений.Значение В(&АдресныеСокращения) ";
КонецЕсли;
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| УровниСокращенийАдресныхСведений.Значение КАК Наименование,
| УровниСокращенийАдресныхСведений.Сокращение КАК Сокращение
|ИЗ
| РегистрСведений.УровниСокращенийАдресныхСведений КАК УровниСокращенийАдресныхСведений
| " + СтрокаЗапросГде + "
|
|СГРУППИРОВАТЬ ПО
| УровниСокращенийАдресныхСведений.Значение,
| УровниСокращенийАдресныхСведений.Сокращение
|
|УПОРЯДОЧИТЬ ПО
| Наименование";
Если НЕ ПустаяСтрока(СтрокаЗапросГде) Тогда
Запрос.УстановитьПараметр("АдресныеСокращения", НаименованияАдресныхОбъектов);
КонецЕсли;
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Функция ИдентификаторАдресногоОбъекта(Адрес, Знач ТипАдреса)
Идентификатор = "";
ИменаУровнейАдреса = ИменаУровнейАдреса(ТипАдреса, Истина);
Для каждого УровеньАдреса Из ИменаУровнейАдреса Цикл
Если ЗначениеЗаполнено(Адрес[УровеньАдреса + "Id"]) Тогда
Идентификатор = Адрес[УровеньАдреса + "Id"];
КонецЕсли;
КонецЦикла;
Возврат Идентификатор;
КонецФункции
// Возвращает настройку текущего источника данных адресов.
//
// Возвращаемое значение:
// Строка - описание источника. Пустая строка - используются загружаемые в регистр данные.
//
Функция ИсточникДанныхАдресногоКлассификатора()
Возврат ПолучитьФункциональнуюОпцию("ИсточникДанныхАдресногоКлассификатора");
КонецФункции
Функция РаспознатьАдресВебСервис(ЧастиАдреса, Знач Представление, ВСтруктуру)
Адрес = ОписаниеНовойКонтактнойИнформации();
АдресДляПроверки = Новый Массив;
Помещения = Новый Массив;
ТипыЗданий = СписокТиповЗданий();
Для каждого ЧастьАдреса Из ЧастиАдреса Цикл
Если ЧастьАдреса.Уровень < 0 Тогда
Продолжить;
КонецЕсли;
Если СтрСравнить(СтрСоединить(СтрРазделить(ЧастьАдреса.Сокращение, "0123456789")), ЧастьАдреса.Сокращение) <> 0 Тогда
Если ТипыЗданий.Получить(ВРег(ЧастьАдреса.Наименование)) =Неопределено Тогда
Помещения.Добавить(ЗначениеСтроенияИлиПомещения(ТРег(ЧастьАдреса.Наименование), ЧастьАдреса.Сокращение));
Продолжить; // Помещение.
КонецЕсли;
КонецЕсли;
АдресДляПроверки.Добавить(ЧастьАдреса.Значение);
КонецЦикла;
Представление = СтрЗаменить(Представление, "№", ""); // Обратная совместимость
Представление = СтрЗаменить(Представление, " ", " ");
ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("recognize?text=%1&limit=20",
КодироватьСтроку(Представление, СпособКодированияСтроки.КодировкаURL));
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
Если РезультатВебСервис.Отказ Или РезультатВебСервис.Количество() = 0 Или РезультатВебСервис.Данные = Неопределено Тогда
Возврат Адрес;
КонецЕсли;
Если РезультатВебСервис.Данные.status = "COMPLETELY_RECOGNIZED" Тогда
Адрес = АдресДляСохраненияВБазе(РезультатВебСервис.Данные.value, Ложь);
Иначе
Если РезультатВебСервис.Данные.status = "PARTIALLY_RECOGNIZED" И ВСтруктуру Тогда
Адрес = АдресДляСохраненияВБазе(РезультатВебСервис.Данные.value, Ложь);
Адрес.comment = НСтр("ru = 'Нераспознанная часть адреса'") + ": " + РезультатВебСервис.Данные.unrecognizedPart;
Иначе
Адрес = ОписаниеНовойКонтактнойИнформации();
Адрес.street = Представление;
Адрес.value = Представление;
Адрес.country = ОсновнаяСтрана();
КонецЕсли;
Возврат Адрес;
КонецЕсли;
Если СтрСравнить(РезультатВебСервис.Данные.addressType, "MUNICIPAL") = 0 Тогда
Адрес.addressType = МуниципальныйАдрес();
Иначе
Адрес.addressType = АдминистративноТерриториальныйАдрес();
КонецЕсли;
Возврат Адрес;
КонецФункции
Функция СписокТиповЗданий()
ТипыЗданий = Новый Соответствие();
Для каждого ТипОбъектовАдресации Из ТипыОбъектовАдресацииАдресаРФ() Цикл
Если ТипОбъектовАдресации.Тип = 1 Или ТипОбъектовАдресации.Тип = 2 Тогда
ТипыЗданий.Вставить(ВРег(ТипОбъектовАдресации.Наименование), ТипОбъектовАдресации.Код);
КонецЕсли;
КонецЦикла;
Возврат ТипыЗданий;
КонецФункции
Функция ОпределитьКодРегионаПоЧастямАдреса(Знач ЧастиАдреса)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеАдреса.Уровень КАК Уровень,
| ДанныеАдреса.Позиция КАК Позиция,
| ДанныеАдреса.Значение КАК Значение,
| ДанныеАдреса.Наименование КАК Наименование,
| ДанныеАдреса.Сокращение КАК Сокращение
|ПОМЕСТИТЬ ДанныеАдреса
|ИЗ
| &ДанныеАдреса КАК ДанныеАдреса
|ГДЕ
| ДанныеАдреса.Уровень >= 0
|
|ИНДЕКСИРОВАТЬ ПО
| Уровень,
| Позиция,
| Наименование,
| Сокращение
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ
|ИЗ
| ДанныеАдреса КАК ДанныеАдреса
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование
| И ДанныеАдреса.Сокращение = АдресныеОбъекты.Сокращение
|ГДЕ
| АдресныеОбъекты.Уровень = 1";
Запрос.УстановитьПараметр("ДанныеАдреса", ЧастиАдреса);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() > 0 Тогда
КодРегиона = РезультатЗапроса[0].КодСубъектаРФ;
КонецЕсли;
Возврат КодРегиона;
КонецФункции
// Параметры:
// ЧастиАдреса - см. УправлениеКонтактнойИнформациейСлужебный.ЧастиАдреса
// Возвращаемое значение:
// Структура:
// * Country - Строка
// * ID - Строка
// * AddressType - Строка
// * AreaCode - Строка
// * AreaID - Строка
// * District - Строка
// * DistrictType - Строка
// * DistrictID - Строка
// * MunDistrict - Строка
// * MunDistrictType - Строка
// * MunDistrictID - Строка
// * CityID - Строка
// * Settlement - Строка
// * SettlementType - Строка
// * SettlementID - Строка
// * CityDistrict - Строка
// * CityDistrictType - Строка
// * CityDistrictID - Строка
// * Territory - Строка
// * TerritoryType - Строка
// * TerritoryID - Строка
// * Locality - Строка
// * LocalityType - Строка
// * LocalityID - Строка
// * StreetID - Строка
// * HouseType - Строка
// * HouseNumber - Строка
// * HouseID - Строка
// * Buildings - Массив
// * Apartments - Массив
// * CodeKLADR - Строка
// * OKTMO - Строка
// * OKATO - Строка
// * IFNSFLCode - Строка
// * IFNSULCode - Строка
// * IFNSFLAreaCode - Строка
// * IFNSULAreaCode - Строка
//
Функция РаспознатьАдресЗагруженныеДанные(ЧастиАдреса)
ОбработатьОбщепринятыеСокращения(ЧастиАдреса);
Адрес = ОписаниеНовойКонтактнойИнформации();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ДанныеАдреса.Уровень КАК Уровень,
| ДанныеАдреса.Позиция КАК Позиция,
| ДанныеАдреса.Значение КАК Значение,
| ДанныеАдреса.Наименование КАК Наименование,
| ДанныеАдреса.Сокращение КАК Сокращение
|ПОМЕСТИТЬ ДанныеАдреса
|ИЗ
| &ДанныеАдреса КАК ДанныеАдреса
|ГДЕ ДанныеАдреса.Уровень >= 0
|
|ИНДЕКСИРОВАТЬ ПО
| Уровень,
| Позиция,
| Наименование,
| Сокращение
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10
| МАКСИМУМ(АдресныеОбъекты.Уровень) КАК Уровень,
| ДанныеАдреса.Позиция КАК Позиция,
| ДанныеАдреса.Наименование КАК Наименование,
| ДанныеАдреса.Сокращение КАК Сокращение
|ИЗ
| ДанныеАдреса КАК ДанныеАдреса
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование)
| И (ДанныеАдреса.Сокращение = АдресныеОбъекты.Сокращение)
|ГДЕ
| НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
|ДанныеАдреса.Наименование,
| ДанныеАдреса.Сокращение,
| ДанныеАдреса.Позиция
|
|УПОРЯДОЧИТЬ ПО ДанныеАдреса.Позиция
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеАдреса.Позиция КАК Позиция,
| ДанныеАдреса.Значение КАК Значение,
| ДанныеАдреса.Наименование КАК Наименование,
| ДанныеАдреса.Сокращение КАК Сокращение
|
|ИЗ
| ДанныеАдреса КАК ДанныеАдреса
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование
| И ДанныеАдреса.Сокращение = АдресныеОбъекты.Сокращение
|ГДЕ
| АдресныеОбъекты.Идентификатор ЕСТЬ NULL
|
|УПОРЯДОЧИТЬ ПО ДанныеАдреса.Позиция
|";
Запрос.УстановитьПараметр("ДанныеАдреса", ЧастиАдреса);
РезультатЗапроса = Запрос.ВыполнитьПакет();
СопоставленныеЧастиАдреса = СопоставленныеЧастиАдреса(РезультатЗапроса);
ДомаЗдания = ДомаЗдания(РезультатЗапроса);
// дома здания
КодыДомовВладенийИСтроений = КодыДомовВладенийИСтроений();
Квартиры = Новый Массив;
Строения = Новый Массив;
СведенияОДоме = СведенияОДоме();
Для каждого ЭлементАдреса Из ДомаЗдания Цикл
Тип = ВРег(СокрЛП(СтрЗаменить(ЭлементАдреса.Наименование, "№", "")));
Значение = ЭлементАдреса.Сокращение;
Если КодыДомовВладенийИСтроений.Дома[Тип] <> Неопределено Тогда
СведенияОДоме.ТипДома = ТРег(ЭлементАдреса.Наименование);
СведенияОДоме.НомерДома = Значение;
ИначеЕсли КодыДомовВладенийИСтроений.Строения[Тип] <> Неопределено Тогда
Строения.Добавить(ЗначениеСтроенияИлиПомещения(ТРег(ЭлементАдреса.Наименование), Значение));
Если КодыДомовВладенийИСтроений.Строения[Тип] = -1 Тогда
СведенияОДоме.НомерКорпуса = Значение;
Иначе
СведенияОДоме.ТипСтроения = ТРег(ЭлементАдреса.Наименование);
СведенияОДоме.НомерСтроения = Значение;
КонецЕсли;
Иначе
Квартиры.Добавить(ЗначениеСтроенияИлиПомещения(ТРег(ЭлементАдреса.Наименование), Значение));
КонецЕсли;
КонецЦикла;
// Ищем по сопоставленным частям адреса
ШаблонВыбор = " ВЫБОР
| КОГДА НЕ АдресныеОбъекты%1.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты%1.Наименование + "" "" + АдресныеОбъекты%1.Сокращение
| ИНАЧЕ """"
| КОНЕЦ";
ШаблонСоединение = "ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты%1
| ПО АдресныеОбъекты%1.%3РодительскийИдентификатор = АдресныеОбъекты%2.Идентификатор";
ШаблонГде = "АдресныеОбъекты%1.Наименование = &ЧастьАдреса%2 И АдресныеОбъекты%1.Сокращение = &ЧастьАдресаСокращение%2";
ЗапросСопоставитьЧастиАдреса = Новый Запрос();
Выбор = Новый Массив;
Соединение = Новый Массив;
СоединениеМуниципальный = Новый Массив;
Где = Новый Массив;
Если СопоставленныеЧастиАдреса.Количество() = 0 Тогда
Возврат Адрес;
КонецЕсли;
Для Счетчик = 1 По СопоставленныеЧастиАдреса.Количество() Цикл
Выбор.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонВыбор, Счетчик));
Соединение.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСоединение, Счетчик, Счетчик - 1, ""));
СоединениеМуниципальный.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСоединение, Счетчик, Счетчик - 1, "Муниципальный"));
Где.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонГде, Счетчик -1, Счетчик));
ЗапросСопоставитьЧастиАдреса.УстановитьПараметр("ЧастьАдреса" + Счетчик, СопоставленныеЧастиАдреса[Счетчик - 1].Наименование);
ЗапросСопоставитьЧастиАдреса.УстановитьПараметр("ЧастьАдресаСокращение" + Счетчик, СопоставленныеЧастиАдреса[Счетчик - 1].Сокращение);
КонецЦикла;
ТекстЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 10
| АдресныеОбъекты0.Наименование + "" "" + АдресныеОбъекты0.Сокращение + %1 КАК Представление,
| АдресныеОбъекты%2.Идентификатор КАК Идентификатор,
| ИСТИНА КАК Муниципальный,
| АдресныеОбъекты0.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| ВЫБОР
| КОГДА АдресныеОбъекты0.Уровень < 10
| ТОГДА АдресныеОбъекты0.Уровень * 10
| ИНАЧЕ АдресныеОбъекты0.Уровень
| КОНЕЦ КАК Уровень
|ПОМЕСТИТЬ МуниципальныеАдреса
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты0
| %3
|ГДЕ
| %5
|
|УПОРЯДОЧИТЬ ПО
| АдресныеОбъекты0.Уровень
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 10
| АдресныеОбъекты0.Наименование + "" "" + АдресныеОбъекты0.Сокращение + %1 КАК Представление,
| АдресныеОбъекты%2.Идентификатор КАК Идентификатор,
| ЛОЖЬ КАК Муниципальный,
| АдресныеОбъекты0.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| ВЫБОР
| КОГДА АдресныеОбъекты0.Уровень < 10
| ТОГДА АдресныеОбъекты0.Уровень * 10
| ИНАЧЕ АдресныеОбъекты0.Уровень
| КОНЕЦ КАК Уровень
|ПОМЕСТИТЬ АдминистративныеАдреса
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты0
| %4
|ГДЕ
| %5
|
|УПОРЯДОЧИТЬ ПО
| АдресныеОбъекты0.Уровень
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЕСТЬNULL(МуниципальныеАдреса.Представление, """") КАК Представление,
| ЕСТЬNULL(МуниципальныеАдреса.Идентификатор, """") КАК Идентификатор,
| МуниципальныеАдреса.Муниципальный КАК Муниципальный,
| МуниципальныеАдреса.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс,
| МуниципальныеАдреса.Уровень КАК Уровень
|ИЗ
| МуниципальныеАдреса КАК МуниципальныеАдреса
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО МуниципальныеАдреса.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЕСТЬNULL(АдминистративныеАдреса.Представление, """"),
| ЕСТЬNULL(АдминистративныеАдреса.Идентификатор, """"),
| АдминистративныеАдреса.Муниципальный,
| АдминистративныеАдреса.ДополнительныеАдресныеСведения,
| ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """"),
| АдминистративныеАдреса.Уровень
|ИЗ
| АдминистративныеАдреса КАК АдминистративныеАдреса
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдминистративныеАдреса.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
|
|УПОРЯДОЧИТЬ ПО
| Уровень";
ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстЗапроса, СтрСоединить(Выбор, " + "),
СопоставленныеЧастиАдреса.Количество() - 1, СтрСоединить(СоединениеМуниципальный, Символы.ПС), СтрСоединить(Соединение, Символы.ПС), СтрСоединить(Где, " И "));
ЗапросСопоставитьЧастиАдреса.Текст = ТекстЗапроса;
НайденныеАдреса = ЗапросСопоставитьЧастиАдреса.Выполнить();
Если НайденныеАдреса.Пустой() Тогда
// Не удалось распознать адрес.
Возврат Адрес;
КонецЕсли;
СтрокаИндекс = ЧастиАдреса.Найти(-1, "Уровень");
Индекс = ?(СтрокаИндекс <> Неопределено, СтрокаИндекс.Значение, "");
Сведения = Новый Структура("ЗагруженныеДанные", Истина);
ВариантыАдресов = ДополнительныеСведенияНайденныхАдресов(НайденныеАдреса);
Если ВариантыАдресов.Количество() = 1 Тогда
Сведения.Вставить("Идентификатор", ВариантыАдресов[0].Идентификатор);
АдресДанные = АктуальныеАдресныеСведения(Сведения);
Муниципальный = ВариантыАдресов[0].Муниципальный;
Иначе
Для каждого ВариантАдреса Из ВариантыАдресов Цикл
Сведения.Вставить("Идентификатор", ВариантАдреса.Идентификатор);
Муниципальный = ВариантАдреса.Муниципальный;
АдресДанные = АктуальныеАдресныеСведения(Сведения);
Если Не АдресДанные.Отказ
И ТипЗнч(АдресДанные.Данные) = Тип("Структура")
И АдресДанные.Данные.Свойство("ZIPCode")
И СтрСравнить(АдресДанные.Данные.ZIPCode, Индекс) = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Адрес = СформироватьАдресПоДаннымИзКлассификатора(АдресДанные.Данные);
Адрес.AddressType = ?(Муниципальный,
МуниципальныйАдрес(),
АдминистративноТерриториальныйАдрес());
ИдентификаторДомаИДополнительныеСведения = КодыПоИдентификаторуАдресногоОбъекта(Адрес.ID, СведенияОДоме);
Если ИдентификаторДомаИДополнительныеСведения <> Неопределено Тогда
Адрес.HouseID = ИдентификаторДомаИДополнительныеСведения.ИдентификаторДома;
Адрес.HouseType = ТРег(СведенияОДоме.ТипДома);
Адрес.HouseNumber = ТРег(СведенияОДоме.НомерДома);
Адрес.Buildings = Строения;
Адрес.Apartments = Квартиры;
Адрес.OKTMO = Формат(ИдентификаторДомаИДополнительныеСведения.ОКТМО, "ЧГ=0");
Адрес.OKATO = Формат(ИдентификаторДомаИДополнительныеСведения.ОКАТО, "ЧГ=0");
Адрес.IFNSFLCode = ИдентификаторДомаИДополнительныеСведения.КодИФНСФЛ;
Адрес.IFNSULCode = ИдентификаторДомаИДополнительныеСведения.КодИФНСЮЛ;
Адрес.IFNSFLAreaCode = ИдентификаторДомаИДополнительныеСведения.КодУчасткаИФНСФЛ;
Адрес.IFNSULAreaCode = ИдентификаторДомаИДополнительныеСведения.КодУчасткаИФНСЮЛ;
Если ПустаяСтрока(Индекс) Тогда
Индекс = Формат(ИдентификаторДомаИДополнительныеСведения.ПочтовыйИндекс, "ЧГ=0");
КонецЕсли;
Иначе
Помещения = КодыПомещений();
// Дома не были найдены в классификаторе. Воссоздаем их по названиям строений.
Для каждого ЭлементАдреса Из ЧастиАдреса Цикл
// Проверка на квартиру или здание.
Тип =СокрЛП(СтрЗаменить(ЭлементАдреса.Наименование, "№", ""));
Если КодыДомовВладенийИСтроений.Дома[ВРег(Тип)] <> Неопределено Тогда
Адрес.HouseType = ТРег(СведенияОДоме.ТипДома);
Адрес.HouseNumber = СокрЛП(СтрЗаменить(ЭлементАдреса.Сокращение, "№", ""));
ИначеЕсли КодыДомовВладенийИСтроений.Строения[ВРег(Тип)] <> Неопределено Тогда
Адрес.Buildings.Добавить(ЗначениеСтроенияИлиПомещения(ТРег(Тип), СокрЛП(СтрЗаменить(ЭлементАдреса.Сокращение, "№", ""))));
ИначеЕсли Помещения[ВРег(Тип)] <> Неопределено Тогда
Адрес.Apartments.Добавить(ЗначениеСтроенияИлиПомещения(ТРег(Тип), СокрЛП(СтрЗаменить(ЭлементАдреса.Сокращение, "№", ""))));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Адрес.ZIPcode = Индекс;
Возврат Адрес;
КонецФункции
// Параметры:
// РезультатЗапроса - Массив
//
// Возвращаемое значение:
// ТаблицаЗначений:
// * Позиция - Число
// * Значение - Строка
// * Наименование - Строка
// * Сокращение - Строка
//
Функция ДомаЗдания(Знач РезультатЗапроса)
ДомаЗдания = РезультатЗапроса[2].Выгрузить();
Возврат ДомаЗдания
КонецФункции
// Параметры:
// РезультатЗапроса - Массив
//
// Возвращаемое значение:
// ТаблицаЗначений:
// * Уровень - Число
// * Позиция - Число
// * Наименование - Строка
// * Сокращение - Строка
//
Функция СопоставленныеЧастиАдреса(Знач РезультатЗапроса)
СопоставленныеЧастиАдреса = РезультатЗапроса[1].Выгрузить();
Возврат СопоставленныеЧастиАдреса
КонецФункции
// Параметры:
// НайденныеАдреса - РезультатЗапроса
//
// Возвращаемое значение:
// ТаблицаЗначений:
// * Идентификатор - Строка
// * Представление - Строка
// * Муниципальный - Булево
// * ДополнительныеАдресныеСведения - Строка
// * ПочтовыйИндекс - Строка
// * Уровень - Число
//
Функция ДополнительныеСведенияНайденныхАдресов(НайденныеАдреса)
Возврат НайденныеАдреса.Выгрузить();
КонецФункции
Функция АдминистративноТерриториальныйАдрес()
Возврат "Административно-территориальный";
КонецФункции
Функция МуниципальныйАдрес()
Возврат "Муниципальный";
КонецФункции
Функция СоединитьНаименованиеИТипАдресногоОбъекта(Знач Наименование, Знач ТипАдресногоОбъекта, ЭтоРегион = Ложь) Экспорт
Если ПустаяСтрока(ТипАдресногоОбъекта) Тогда
Возврат Наименование;
КонецЕсли;
Если ЭтоРегион Тогда
Если НаименованиеРегионаБезТипа(Наименование) Тогда
Возврат Наименование;
КонецЕсли;
Возврат Наименование + " " + ТипАдресногоОбъекта;
КонецЕсли;
Возврат ТипАдресногоОбъекта + " " + Наименование;
КонецФункции
// Локальная проверка одного адреса.
//
Процедура УстановитьИдентификаторыАдресаПоЗагруженнымДанным(Адрес)
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|
| ПОМЕСТИТЬ АдресныеОбъектыУровень0
| ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
| ГДЕ
| АдресныеОбъекты.Наименование = &Наименование0
| И АдресныеОбъекты.Сокращение = &Сокращение0
| И АдресныеОбъекты.Уровень = 1
| ;
|
| ////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
| ПОМЕСТИТЬ АдресныеОбъектыУровень1
| ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор
| ГДЕ
| АдресныеОбъекты.Наименование = &Наименование1
| И АдресныеОбъекты.Сокращение = &Сокращение1
|
| ;
|
| ////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
| ПОМЕСТИТЬ АдресныеОбъектыУровень2
| ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор
| ГДЕ
| АдресныеОбъекты.Наименование = &Наименование2
| И АдресныеОбъекты.Сокращение = &Сокращение2
|
| ;
|
| ////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
| ПОМЕСТИТЬ АдресныеОбъектыУровень3
| ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор
| ГДЕ
| АдресныеОбъекты.Наименование = &Наименование3
| И АдресныеОбъекты.Сокращение = &Сокращение3
|
| ;
|
| ////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
| ПОМЕСТИТЬ АдресныеОбъектыУровень4
| ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор
| ГДЕ
| АдресныеОбъекты.Наименование = &Наименование4
| И АдресныеОбъекты.Сокращение = &Сокращение4
|
| ;
|
| ////////////////////////////////////////////////////////////////////////////////
| ВЫБРАТЬ
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
| ПОМЕСТИТЬ АдресныеОбъектыУровень5
| ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор
| ГДЕ
| АдресныеОбъекты.Наименование = &Наименование5
| И АдресныеОбъекты.Сокращение = &Сокращение5
| ;
|
| ВЫБРАТЬ ПЕРВЫЕ 20
| АдресныеОбъектыУровень0.Наименование КАК НаименованиеУровень0,
| АдресныеОбъектыУровень0.Сокращение КАК СокращениеУровень0,
| АдресныеОбъектыУровень0.Идентификатор КАК ИдентификаторУровень0,
| АдресныеОбъектыУровень0.ДополнительныеСведения КАК ДополнительныеСведения0,
| АдресныеОбъектыУровень1.Наименование КАК НаименованиеУровень1,
| АдресныеОбъектыУровень1.Сокращение КАК СокращениеУровень1,
| АдресныеОбъектыУровень1.Идентификатор КАК ИдентификаторУровень1,
| АдресныеОбъектыУровень1.ДополнительныеСведения КАК ДополнительныеСведения1,
| АдресныеОбъектыУровень2.Наименование КАК НаименованиеУровень2,
| АдресныеОбъектыУровень2.Сокращение КАК СокращениеУровень2,
| АдресныеОбъектыУровень2.Идентификатор КАК ИдентификаторУровень2,
| АдресныеОбъектыУровень2.ДополнительныеСведения КАК ДополнительныеСведения2,
| АдресныеОбъектыУровень3.Наименование КАК НаименованиеУровень3,
| АдресныеОбъектыУровень3.Сокращение КАК СокращениеУровень3,
| АдресныеОбъектыУровень3.Идентификатор КАК ИдентификаторУровень3,
| АдресныеОбъектыУровень3.ДополнительныеСведения КАК ДополнительныеСведения3,
| АдресныеОбъектыУровень4.Наименование КАК НаименованиеУровень4,
| АдресныеОбъектыУровень4.Сокращение КАК СокращениеУровень4,
| АдресныеОбъектыУровень4.Идентификатор КАК ИдентификаторУровень4,
| АдресныеОбъектыУровень4.ДополнительныеСведения КАК ДополнительныеСведения4,
| АдресныеОбъектыУровень5.Наименование КАК НаименованиеУровень5,
| АдресныеОбъектыУровень5.Сокращение КАК СокращениеУровень5,
| АдресныеОбъектыУровень5.Идентификатор КАК ИдентификаторУровень5,
| АдресныеОбъектыУровень5.ДополнительныеСведения КАК ДополнительныеСведения5,
| ЕСТЬNULL(АдресныеОбъектыУровень5.Идентификатор,
| ЕСТЬNULL(АдресныеОбъектыУровень4.Идентификатор,
| ЕСТЬNULL(АдресныеОбъектыУровень3.Идентификатор,
| ЕСТЬNULL(АдресныеОбъектыУровень2.Идентификатор,АдресныеОбъектыУровень1.Идентификатор)))) КАК Идентификатор
| ПОМЕСТИТЬ АдресныеОбъекты
|
| ИЗ
| АдресныеОбъектыУровень0 КАК АдресныеОбъектыУровень0
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень1 КАК АдресныеОбъектыУровень1
| ПО АдресныеОбъектыУровень0.Идентификатор = АдресныеОбъектыУровень1.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень0.Идентификатор = АдресныеОбъектыУровень1.СвязиМуниципальныйРодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень2 КАК АдресныеОбъектыУровень2
| ПО АдресныеОбъектыУровень1.Идентификатор = АдресныеОбъектыУровень2.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень1.Идентификатор = АдресныеОбъектыУровень2.СвязиМуниципальныйРодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень3 КАК АдресныеОбъектыУровень3
| ПО АдресныеОбъектыУровень2.Идентификатор = АдресныеОбъектыУровень3.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень2.Идентификатор = АдресныеОбъектыУровень3.СвязиМуниципальныйРодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень4 КАК АдресныеОбъектыУровень4
| ПО АдресныеОбъектыУровень3.Идентификатор = АдресныеОбъектыУровень4.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень3.Идентификатор = АдресныеОбъектыУровень4.СвязиМуниципальныйРодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень5 КАК АдресныеОбъектыУровень5
| ПО АдресныеОбъектыУровень4.Идентификатор = АдресныеОбъектыУровень5.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень4.Идентификатор = АдресныеОбъектыУровень5.СвязиМуниципальныйРодительскийИдентификатор
| ;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 50
| ДомаЗданияСтроения.АдресныйОбъект КАК АдресныйОбъект,
| ДомаЗданияСтроения.КодСубъектаРФ КАК КодСубъектаРФ,
| ДомаЗданияСтроения.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| ДомаЗданияСтроения.Строения КАК Строения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор
|ИЗ
| АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
| ПО ДомаЗданияСтроения.АдресныйОбъект = АдресныеОбъекты.Идентификатор";
ЭтоМуниципальныйАдрес = ЭтоМуниципальныйАдрес(Адрес.AddressType);
Если ЭтоМуниципальныйАдрес Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, ".РодительскийИдентификатор", ".МуниципальныйРодительскийИдентификатор");
КонецЕсли;
ИменаУровнейАдреса = ИменаУровнейАдреса(Адрес.AddressType, Истина);
Счетчик = 0;
КакиеУровниПроверять = Новый Соответствие;
Для каждого УровеньАдреса Из ИменаУровнейАдреса Цикл
Если Не ЭтоМуниципальныйАдрес
И СтрСравнить(УровеньАдреса, "Locality") = 0
И СтрСравнить(Адрес.city, Адрес.locality) = 0
И СтрСравнить(Адрес.cityType, Адрес.localityType) = 0 Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(Адрес[УровеньАдреса]) Тогда
Запрос.УстановитьПараметр("Наименование" + XMLСтрока(Счетчик), Адрес[УровеньАдреса]);
Запрос.УстановитьПараметр("Сокращение" + XMLСтрока(Счетчик), Адрес[УровеньАдреса + "Type"]);
КакиеУровниПроверять.Вставить(УровеньАдреса, Счетчик);
Счетчик = Счетчик + 1;
Если Счетчик = 6 Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Заполняем пустые адресные сведения
Для ИндексСчетчик = Счетчик По 5 Цикл
Запрос.УстановитьПараметр("Наименование" + XMLСтрока(ИндексСчетчик), "");
Запрос.УстановитьПараметр("Сокращение" + XMLСтрока(ИндексСчетчик), "");
КонецЦикла;
РезультатЗапроса = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
Адреса = РезультатЗапроса[6];
Дома = РезультатЗапроса[7];
Если Адреса.Пустой() Тогда
Возврат;
КонецЕсли;
ПолученныйАдрес = Адреса.Выгрузить()[0];
ИдентификаторАдресногоОбъекта = Неопределено;
МаксимальныйУровень = -1;
Для каждого Уровни Из КакиеУровниПроверять Цикл
НайденныйИдентификатор = ПолученныйАдрес["ИдентификаторУровень" + Уровни.Значение];
Если ЗначениеЗаполнено(НайденныйИдентификатор) Тогда
Адрес[Уровни.Ключ + "Id"] = НайденныйИдентификатор;
Если МаксимальныйУровень < Уровни.Значение Тогда
ИдентификаторАдресногоОбъекта = НайденныйИдентификатор;
МаксимальныйУровень = Уровни.Значение;
КонецЕсли;
Иначе
Адрес[Уровни.Ключ + "Id"] = "";
КонецЕсли;
КонецЦикла;
Адрес["id"] = ИдентификаторАдресногоОбъекта;
Если Не ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда
Возврат;
КонецЕсли;
// Проверяем дома
СведенияОДоме = СведенияОДоме();
СведенияОДоме.НомерДома = Адрес.HouseNumber;
СведенияОДоме.ТипДома = ?(ЗначениеЗаполнено(СведенияОДоме.НомерДома), Адрес.HouseType, "");
Для каждого ОписаниеСтроения Из Адрес.Buildings Цикл
Если СтрСравнить(ОписаниеСтроения.Type, "Корпус") = 0 Тогда
СведенияОДоме.НомерКорпуса = ОписаниеСтроения.Number;
Иначе
СведенияОДоме.НомерСтроения = ОписаниеСтроения.Number;
СведенияОДоме.ТипСтроения = ОписаниеСтроения.Type;
КонецЕсли;
КонецЦикла;
Если Дома.Пустой() Тогда
Возврат;
КонецЕсли;
Результат = НайтиСтрокуСДомом(Дома.Выгрузить(), СведенияОДоме);
Если Результат <> Неопределено Тогда
Адрес.HouseID = Результат.ИдентификаторДома;
КонецЕсли;
КонецПроцедуры
Процедура УстановитьИдентификаторыАдресаЧерезВебСервис(АдресаДляПроверки)
Результат = ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С(АдресаДляПроверки);
Если Результат.Отказ = Ложь Тогда
Если Результат.Данные.Количество() > 0 Тогда
Для каждого АдресДляПроверки Из АдресаДляПроверки Цикл
АдресИзСервиса = Результат.Данные[АдресДляПроверки.Ключ]; // см. РезультатПроверкиАдреса
Если АдресИзСервиса.Варианты.Количество() > 0 Тогда
ВариантИзСервиса = АдресИзСервиса.Варианты[0];
Адрес = АдресДляПроверки.Значение;
Для каждого КлючЗначение Из Адрес Цикл
Если СтрЗаканчиваетсяНа(ВРег(КлючЗначение.Ключ), "ID") Тогда
Адрес[КлючЗначение.Ключ] = ?(ВариантИзСервиса.Свойство(КлючЗначение.Ключ),
ВариантИзСервиса[КлючЗначение.Ключ], "");
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура УстановитьИдентификаторыАдресовПоЗагруженнымДанным(Адреса)
ПодготовленныеДанные = ПервичнаяПроверкаАдресов(Адреса);
Результаты = ПодготовленныеДанные.Адреса;
КодыРегионов = ПодготовленныеДанные.КодыРегионов;
Запрос = Новый Запрос();
ДанныеДляПроверкиАдресов = СформироватьДанныеДляПроверкиАдресов(Адреса, Результаты);
Запрос.УстановитьПараметр("Наборы", ДанныеДляПроверкиАдресов.АдресаПоПолям);
Запрос.УстановитьПараметр("КодыРегионов", КодыРегионов);
Запрос.Текст = ТекстЗапросаУстановкиИдентификаторовАдресов();
РезультатЗапроса = Запрос.ВыполнитьПакет();
РезультатЗапросаАдреса = РезультатЗапроса[8];;
РезультатЗапросаДома = РезультатЗапроса[9];
Если РезультатЗапросаАдреса.Пустой() Тогда
Возврат;
КонецЕсли;
ПолученныйАдрес = РезультатЗапросаАдреса.Выбрать();
Пока ПолученныйАдрес.Следующий() Цикл
Адрес = Адреса[ПолученныйАдрес.Ключ];
КакиеУровниПроверять = ДанныеДляПроверкиАдресов.ПроверяемыеУровни[ПолученныйАдрес.Ключ];
ИдентификаторАдресногоОбъекта = Неопределено;
МаксимальныйУровень = -1;
Для каждого Уровни Из КакиеУровниПроверять Цикл
НайденныйИдентификатор = ПолученныйАдрес["ИдентификаторУровень" + Уровни.Значение];
Если ЗначениеЗаполнено(НайденныйИдентификатор) Тогда
Адрес[Уровни.Ключ + "Id"] = НайденныйИдентификатор;
Если МаксимальныйУровень < Уровни.Значение Тогда
ИдентификаторАдресногоОбъекта = НайденныйИдентификатор;
МаксимальныйУровень = Уровни.Значение;
КонецЕсли;
Иначе
Адрес[Уровни.Ключ + "Id"] = "";
КонецЕсли;
КонецЦикла;
Адрес["id"] = ИдентификаторАдресногоОбъекта;
Если Не ЗначениеЗаполнено(ИдентификаторАдресногоОбъекта) Тогда
Продолжить;
КонецЕсли;
Если ЭтоГородФедеральногоЗначения(ПолноеНаименованиеРегиона(Адрес.Area, Адрес.AreaType)) = Истина
И ЭтоМуниципальныйАдрес(Адрес.addressType) Тогда
УстановитьИдентификаторыДляМуниципальногоАдреса(Адрес);
КонецЕсли;
// Проверяем дома
СведенияОДоме = СведенияОДоме();
СведенияОДоме.НомерДома = Адрес.HouseNumber;
СведенияОДоме.ТипДома = ?(ЗначениеЗаполнено(СведенияОДоме.НомерДома), Адрес.HouseType, "");
Для каждого ОписаниеСтроения Из Адрес.Buildings Цикл
Если СтрСравнить(ОписаниеСтроения.Type, "Корпус") = 0 Тогда
СведенияОДоме.НомерКорпуса = ОписаниеСтроения.Number;
Иначе
СведенияОДоме.НомерСтроения = ОписаниеСтроения.Number;
СведенияОДоме.ТипСтроения = ОписаниеСтроения.Type;
КонецЕсли;
КонецЦикла;
Если РезультатЗапросаДома.Пустой() Тогда
Продолжить;
КонецЕсли;
Результат = НайтиСтрокуСДомом(РезультатЗапросаДома.Выгрузить(), СведенияОДоме);
Если Результат <> Неопределено Тогда
Адрес.HouseID = Результат.ИдентификаторДома;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Начальное заполнение данных адресного классификатора при первом запуске.
//
Процедура ВыполнитьНачальноеЗаполнение() Экспорт
РегистрыСведений.АдресныеОбъекты.ОбновитьСоставСубъектовРФПоКлассификатору(Истина);
КонецПроцедуры
// Конструктор таблицы - результата выбора по почтовому индексу.
//
// Возвращаемое значение:
// ТаблицаЗначений:
// * Неактуален - Булево
// * Идентификатор - УникальныйИдентификатор
// * Представление - Строка
// * Уровень - Число
// * ТипАдресногоЭлемента - Строка
//
Функция ТаблицаДанныхДляВыбораПоПочтовомуИндексу()
Данные = Новый ТаблицаЗначений;
Колонки = Данные.Колонки;
Колонки.Добавить("Неактуален", Новый ОписаниеТипов("Булево"));
Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор"));
Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Данные.Индексы.Добавить("Идентификатор");
Данные.Индексы.Добавить("Представление");
Колонки.Добавить("Уровень", Новый ОписаниеТипов("Число"));
Колонки.Добавить("ТипАдресногоЭлемента", Новый ОписаниеТипов("Строка"));
Возврат Данные;
КонецФункции
Функция ОпределитьИдентификаторыАдреса(АдресДляПроверки) Экспорт
Результат = Новый Структура("Отказ, ИдентификаторАдресногоОбъекта, ИдентификаторДома, ПодробноеПредставлениеОшибки, КраткоеПредставлениеОшибки", Ложь);
Попытка
ОпределитьИдентификаторыАдресаСервис1С(Результат, АдресДляПроверки);
Исключение
СтруктураОписанияОшибкиПоставщика(Результат, ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, Результат.ПодробноеПредставлениеОшибки);
КонецПопытки;
Возврат Результат;
КонецФункции
// Заполнение актуальных данных адресного объекта или ориентира из загруженных данных.
//
Процедура ЗаполнитьАктуальныеАдресныеСведенияВнутр(Результат, Значение)
Если НЕ ЗначениеЗаполнено(Значение.Идентификатор) Тогда
Возврат;
КонецЕсли;
ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| АдресныеОбъекты.Наименование КАК НаименованиеУровень0,
| АдресныеОбъекты.Сокращение КАК СокращениеУровень0,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень0,
| АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
| АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты.Уровень КАК Уровень0,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения
|ПОМЕСТИТЬ АдресныеОбъекты0
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор
|ГДЕ
| АдресныеОбъекты.Идентификатор = &Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень1,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень1,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень1,
| АдресныеОбъекты.Уровень КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0,
| АдресныеОбъекты0.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ
|ПОМЕСТИТЬ АдресныеОбъекты1
|ИЗ
| АдресныеОбъекты0 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень2,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень2,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень2,
| АдресныеОбъекты.Уровень КАК Уровень2,
| АдресныеОбъекты0.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъекты0.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъекты0.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты0.Уровень1 КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0,
| АдресныеОбъекты0.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ
|ПОМЕСТИТЬ АдресныеОбъекты2
|ИЗ
| АдресныеОбъекты1 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень3,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень3,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень3,
| АдресныеОбъекты.Уровень КАК Уровень3,
| АдресныеОбъекты0.НаименованиеУровень2 КАК НаименованиеУровень2,
| АдресныеОбъекты0.СокращениеУровень2 КАК СокращениеУровень2,
| АдресныеОбъекты0.ИдентификаторУровень2 КАК ИдентификаторУровень2,
| АдресныеОбъекты0.Уровень2 КАК Уровень2,
| АдресныеОбъекты0.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъекты0.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъекты0.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты0.Уровень1 КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0,
| АдресныеОбъекты0.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ
|ПОМЕСТИТЬ АдресныеОбъекты3
|ИЗ
| АдресныеОбъекты2 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень4,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень4,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень4,
| АдресныеОбъекты.Уровень КАК Уровень4,
| АдресныеОбъекты0.НаименованиеУровень3 КАК НаименованиеУровень3,
| АдресныеОбъекты0.СокращениеУровень3 КАК СокращениеУровень3,
| АдресныеОбъекты0.ИдентификаторУровень3 КАК ИдентификаторУровень3,
| АдресныеОбъекты0.Уровень3 КАК Уровень3,
| АдресныеОбъекты0.НаименованиеУровень2 КАК НаименованиеУровень2,
| АдресныеОбъекты0.СокращениеУровень2 КАК СокращениеУровень2,
| АдресныеОбъекты0.ИдентификаторУровень2 КАК ИдентификаторУровень2,
| АдресныеОбъекты0.Уровень2 КАК Уровень2,
| АдресныеОбъекты0.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъекты0.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъекты0.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты0.Уровень1 КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0,
| АдресныеОбъекты0.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ
|ПОМЕСТИТЬ АдресныеОбъекты4
|ИЗ
| АдресныеОбъекты3 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| &ПредставлениеМуниципальный КАК ТипАдреса,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень5,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень5,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень5,
| АдресныеОбъекты.Уровень КАК Уровень5,
| АдресныеОбъекты0.НаименованиеУровень4 КАК НаименованиеУровень4,
| АдресныеОбъекты0.СокращениеУровень4 КАК СокращениеУровень4,
| АдресныеОбъекты0.ИдентификаторУровень4 КАК ИдентификаторУровень4,
| АдресныеОбъекты0.Уровень4 КАК Уровень4,
| АдресныеОбъекты0.НаименованиеУровень3 КАК НаименованиеУровень3,
| АдресныеОбъекты0.СокращениеУровень3 КАК СокращениеУровень3,
| АдресныеОбъекты0.ИдентификаторУровень3 КАК ИдентификаторУровень3,
| АдресныеОбъекты0.Уровень3 КАК Уровень3,
| АдресныеОбъекты0.НаименованиеУровень2 КАК НаименованиеУровень2,
| АдресныеОбъекты0.СокращениеУровень2 КАК СокращениеУровень2,
| АдресныеОбъекты0.ИдентификаторУровень2 КАК ИдентификаторУровень2,
| АдресныеОбъекты0.Уровень2 КАК Уровень2,
| АдресныеОбъекты0.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъекты0.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъекты0.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты0.Уровень1 КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0,
| АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты0.КодСубъектаРФ КАК КодСубъектаРФ,
| ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс,
| ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО,
| ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК OKATO,
| ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ
|ИЗ
| АдресныеОбъекты4 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъекты0.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
| &ПредставлениеАдминистративный,
| ЕСТЬNULL(АдресныеОбъектыУровень5.Наименование, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень5.Сокращение, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень5.Идентификатор, """"),
| АдресныеОбъектыУровень5.Уровень,
| ЕСТЬNULL(АдресныеОбъектыУровень4.Наименование, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень4.Сокращение, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень4.Идентификатор, """"),
| АдресныеОбъектыУровень4.Уровень,
| ЕСТЬNULL(АдресныеОбъектыУровень3.Наименование, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень3.Сокращение, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень3.Идентификатор, """"),
| АдресныеОбъектыУровень3.Уровень,
| ЕСТЬNULL(АдресныеОбъектыУровень2.Наименование, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень2.Сокращение, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень2.Идентификатор, """"),
| АдресныеОбъектыУровень2.Уровень,
| ЕСТЬNULL(АдресныеОбъектыУровень1.Наименование, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень1.Сокращение, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень1.Идентификатор, """"),
| АдресныеОбъектыУровень1.Уровень,
| ЕСТЬNULL(АдресныеОбъектыУровень0.Наименование, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень0.Сокращение, """"),
| ЕСТЬNULL(АдресныеОбъектыУровень0.Идентификатор, """"),
| АдресныеОбъектыУровень0.Уровень,
| АдресныеОбъектыУровень0.КодКЛАДР,
| АдресныеОбъектыУровень0.КодСубъектаРФ,
| ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """"),
| ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """"),
| ЕСТЬNULL(ДополнительныеСведения.OKATO, """"),
| ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """"),
| ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """"),
| ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """"),
| ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """")
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1
| ПО АдресныеОбъектыУровень0.РодительскийИдентификатор = АдресныеОбъектыУровень1.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.РодительскийИдентификатор = АдресныеОбъектыУровень2.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.РодительскийИдентификатор = АдресныеОбъектыУровень3.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.РодительскийИдентификатор = АдресныеОбъектыУровень4.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.РодительскийИдентификатор = АдресныеОбъектыУровень5.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъектыУровень0.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
|ГДЕ
| АдресныеОбъектыУровень0.Идентификатор = &Идентификатор";
Результат = ОписаниеНовойКонтактнойИнформации();
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("ПредставлениеМуниципальный", МуниципальныйАдрес());
Запрос.УстановитьПараметр("ПредставлениеАдминистративный", АдминистративноТерриториальныйАдрес());
Запрос.УстановитьПараметр("Идентификатор", Новый УникальныйИдентификатор(Значение.Идентификатор));
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выгрузить();
Если Значение.Свойство("Муниципальный") Тогда
Результат["addressType"] = ?(Значение.Муниципальный, МуниципальныйАдрес(), АдминистративноТерриториальныйАдрес());
Иначе
Результат["addressType"] = МуниципальныйАдрес();
КонецЕсли;
Если Результат["addressType"] = АдминистративноТерриториальныйАдрес() И Выборка.Количество() = 2 Тогда
СтрокаКодов = Выборка[1];
Иначе
СтрокаКодов = Выборка[0];
КонецЕсли;
Результат.ZipCode = Формат(СтрокаКодов.ПочтовыйИндекс, "ЧГ=0");
Результат.OKTMO = Формат(СтрокаКодов.ОКТМО, "ЧГ=0");
Результат.OKATO = Формат(СтрокаКодов.OKATO, "ЧГ=0");
Результат.IFNSULAreaCode = СтрокаКодов.КодУчасткаИФНСЮЛ;
Результат.IFNSFLAreaCode = СтрокаКодов.КодУчасткаИФНСФЛ;
Результат.IFNSULCode = СтрокаКодов.КодИФНСЮЛ;
Результат.IFNSFLCode = СтрокаКодов.КодИФНСФЛ;
СловарьИменПолей = СловарьКлючейПолейАдресВСоответствииСУровнем();
Если Выборка.Количество() > 1 Тогда
Индекс = 5;
Пока Индекс >= 0 Цикл
ЗаполнитьПоляВСоответствииСУровнемАдреса(Результат, Выборка[1], Индекс, СловарьИменПолей, ЭтоМуниципальныйАдрес(Выборка[1].ТипАдреса));
Индекс = Индекс - 1;
КонецЦикла;
КонецЕсли;
// Муниципальный
Индекс = 5;
Пока Индекс >= 0 Цикл
ЗаполнитьПоляВСоответствииСУровнемАдреса(Результат, Выборка[0], Индекс, СловарьИменПолей, ЭтоМуниципальныйАдрес(Выборка[0].ТипАдреса));
Индекс = Индекс - 1;
КонецЦикла;
Если ЗначениеЗаполнено(СтрокаКодов.ОКТМО) Тогда
УстановитьМуниципальныеСведения(Результат, СтрокаКодов.ОКТМО);
КонецЕсли;
КонецПроцедуры
Функция АктуальныеАдресДляИсторического(Адрес)
РезультатПоиска = Новый Структура;
РезультатПоиска.Вставить("АдресНайден", Ложь);
РезультатПоиска.Вставить("Варианты", Новый Массив);
РезультатПоиска.Вставить("Представление", "");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИсторияАдресныхОбъектов0.Идентификатор КАК Идентификатор,
| ИсторияАдресныхОбъектов0.АдресныйОбъект КАК АдресныйОбъект,
| ИсторияАдресныхОбъектов0.ОкончаниеДействияЗаписи КАК ОкончаниеДействияЗаписи
|ПОМЕСТИТЬ Адреса
|ИЗ
| РегистрСведений.ИсторияАдресныхОбъектов КАК ИсторияАдресныхОбъектов0
| &ТекстСоединения
|ГДЕ
| ИсторияАдресныхОбъектов0.Наименование = &Наименование0
| И ИсторияАдресныхОбъектов0.КодСубъектаРФ = &КодСубъектаРФ
| И ИсторияАдресныхОбъектов0.Сокращение = &Сокращение0
| &Отбор
|
|УПОРЯДОЧИТЬ ПО
| ОкончаниеДействияЗаписи УБЫВ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ВЫБОР
| КОГДА НЕ АдресныеОбъектыУровень5.Наименование ЕСТЬ NULL
| ТОГДА АдресныеОбъектыУровень5.Наименование + "" "" + АдресныеОбъектыУровень5.Сокращение + "", ""
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъектыУровень4.Наименование ЕСТЬ NULL
| ТОГДА АдресныеОбъектыУровень4.Наименование + "" "" + АдресныеОбъектыУровень4.Сокращение + "", ""
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъектыУровень3.Наименование ЕСТЬ NULL
| ТОГДА АдресныеОбъектыУровень3.Наименование + "" "" + АдресныеОбъектыУровень3.Сокращение + "", ""
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъектыУровень2.Наименование ЕСТЬ NULL
| ТОГДА АдресныеОбъектыУровень2.Наименование + "" "" + АдресныеОбъектыУровень2.Сокращение + "", ""
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъектыУровень1.Наименование ЕСТЬ NULL
| ТОГДА АдресныеОбъектыУровень1.Наименование + "" "" + АдресныеОбъектыУровень1.Сокращение + "", ""
| ИНАЧЕ """"
| КОНЕЦ + АдресныеОбъектыУровень0.Наименование + "" "" + АдресныеОбъектыУровень0.Сокращение КАК Представление,
| АдресныеОбъектыУровень0.Идентификатор КАК Идентификатор0,
| АдресныеОбъектыУровень0.Наименование КАК Наименование0,
| АдресныеОбъектыУровень0.Сокращение КАК Сокращение0,
| АдресныеОбъектыУровень0.Уровень КАК Уровень0,
| АдресныеОбъектыУровень1.Идентификатор КАК Идентификатор1,
| АдресныеОбъектыУровень1.Наименование КАК Наименование1,
| АдресныеОбъектыУровень1.Сокращение КАК Сокращение1,
| АдресныеОбъектыУровень1.Уровень КАК Уровень1,
| АдресныеОбъектыУровень2.Идентификатор КАК Идентификатор2,
| АдресныеОбъектыУровень2.Наименование КАК Наименование2,
| АдресныеОбъектыУровень2.Сокращение КАК Сокращение2,
| АдресныеОбъектыУровень2.Уровень КАК Уровень2,
| АдресныеОбъектыУровень3.Идентификатор КАК Идентификатор3,
| АдресныеОбъектыУровень3.Наименование КАК Наименование3,
| АдресныеОбъектыУровень3.Сокращение КАК Сокращение3,
| АдресныеОбъектыУровень3.Уровень КАК Уровень3,
| АдресныеОбъектыУровень4.Идентификатор КАК Идентификатор4,
| АдресныеОбъектыУровень4.Наименование КАК Наименование4,
| АдресныеОбъектыУровень4.Сокращение КАК Сокращение4,
| АдресныеОбъектыУровень4.Уровень КАК Уровень4,
| АдресныеОбъектыУровень5.Идентификатор КАК Идентификатор5,
| АдресныеОбъектыУровень5.Наименование КАК Наименование5,
| АдресныеОбъектыУровень5.Сокращение КАК Сокращение5,
| АдресныеОбъектыУровень5.Уровень КАК Уровень5
|ИЗ
| Адреса КАК Адреса
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень0
| ПО Адреса.АдресныйОбъект = АдресныеОбъектыУровень0.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1
| ПО (АдресныеОбъектыУровень0.РодительскийИдентификатор = АдресныеОбъектыУровень1.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.РодительскийИдентификатор = АдресныеОбъектыУровень2.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.РодительскийИдентификатор = АдресныеОбъектыУровень3.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.РодительскийИдентификатор = АдресныеОбъектыУровень4.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.РодительскийИдентификатор = АдресныеОбъектыУровень5.Идентификатор)";
КодСубъектаРФ = АдресныйКлассификатор.КодРегионаПоНаименованию(СокрЛП(Адрес.Area + " " + Адрес.AreaType));
Запрос.УстановитьПараметр("КодСубъектаРФ", КодСубъектаРФ);
ИменаУровнейАдреса = ИменаУровнейАдреса(Адрес.AddressType, Истина);
Счетчик = 0;
КакиеУровниПроверять = Новый Соответствие;
Если ЭтоМуниципальныйАдрес(Адрес.AddressType) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, ".РодительскийИдентификатор", ".МуниципальныйРодительскийИдентификатор");
КонецЕсли;
ШаблонаСоединения = "
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияАдресныхОбъектов КАК ИсторияАдресныхОбъектов%1
| ПО (ИсторияАдресныхОбъектов%2.РодительскийИдентификатор = ИсторияАдресныхОбъектов%1.АдресныйОбъект)
| И (ИсторияАдресныхОбъектов%1.Наименование = &Наименование%1)
| И (ИсторияАдресныхОбъектов%1.Сокращение = &Сокращение%1)";
ТекстСоединения = "";
КоличествоУровней = ИменаУровнейАдреса.Количество() - 1;
Пока КоличествоУровней >= 0 Цикл
УровеньАдреса = ИменаУровнейАдреса[КоличествоУровней];
Если Адрес.Свойство(УровеньАдреса) И ЗначениеЗаполнено(Адрес[УровеньАдреса]) Тогда
Запрос.УстановитьПараметр("Наименование" + XMLСтрока(Счетчик), Адрес[УровеньАдреса]);
Запрос.УстановитьПараметр("Сокращение" + XMLСтрока(Счетчик), Адрес[УровеньАдреса + "Type"]);
КакиеУровниПроверять.Вставить(УровеньАдреса, Счетчик);
Если Счетчик > 0 Тогда
ТекстСоединения = ТекстСоединения + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонаСоединения, Счетчик, Счетчик - 1);
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЕсли;
КоличествоУровней = КоличествоУровней - 1;
КонецЦикла;
ТекстОтбор = ?(Счетчик > 2, " И НЕ ИсторияАдресныхОбъектов1.Наименование ЕСТЬ NULL", "");
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекстСоединения", ТекстСоединения);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Отбор", ТекстОтбор);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат РезультатПоиска;
КонецЕсли;
ИменаУровней = ИменаУровнейАдресаПоКоду();
Результат = РезультатЗапроса.Выбрать();
Варианты = Новый Массив;
Пока Результат.Следующий() Цикл
НовыйАдрес = ОбщегоНазначения.СкопироватьРекурсивно(Адрес);
Для Каждого ИмяУровня Из ИменаУровней Цикл
НовыйАдрес[ИмяУровня.Значение] = "";
НовыйАдрес[ИмяУровня.Значение + "Type"] = "";
НовыйАдрес[ИмяУровня.Значение + "Id"] = "";
КонецЦикла;
Для Индекс = 0 По 5 Цикл
Уровень = Результат["Уровень" + Индекс];
Если ЗначениеЗаполнено(Уровень) Тогда
НовыйАдрес[ИменаУровней[Уровень]] = Результат["Наименование" + Индекс];
НовыйАдрес[ИменаУровней[Уровень] + "Type"] = Результат["Сокращение" + Индекс];
НовыйАдрес[ИменаУровней[Уровень] + "Id"] = Результат["Идентификатор" + Индекс];
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Варианты.Добавить(НовыйАдрес);
Представление = Результат.Представление;
НовыйАдрес.value = "";
КонецЦикла;
РезультатПоиска.АдресНайден = Истина;
РезультатПоиска.Варианты = Варианты;
РезультатПоиска.Представление = Представление;
Возврат РезультатПоиска;
КонецФункции
// Параметры:
// Результат - см. СведенияОЗагруженномРегионе
// СведенияОРегионе - см. АдресныйКлассификаторСлужебный.НаименованиеИСокращение
//
Процедура ПроверкаНаУстаревшийРегион(Результат, СведенияОРегионе) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИсторияАдресныхОбъектов.КодСубъектаРФ КАК КодСубъектаРФ
|ИЗ
| РегистрСведений.ИсторияАдресныхОбъектов КАК ИсторияАдресныхОбъектов
|ГДЕ
| ИсторияАдресныхОбъектов.Наименование = &Наименование
| И ИсторияАдресныхОбъектов.Сокращение = &Сокращение
| И ИсторияАдресныхОбъектов.Уровень = 1
|
|УПОРЯДОЧИТЬ ПО
| ИсторияАдресныхОбъектов.ОкончаниеДействияЗаписи УБЫВ";
Запрос.УстановитьПараметр("Наименование", СведенияОРегионе.Наименование);
Запрос.УстановитьПараметр("Сокращение", СведенияОРегионе.Сокращение);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
Результат.Устарел = Истина;
Результат.КодСубъектаРФ = РезультатЗапроса.КодСубъектаРФ;
КонецЦикла;
КонецПроцедуры
// Возвращаемое значение:
// Структура:
// * Загружен - Булево
// * Устарел - Булево
// * КодСубъектаРФ - Неопределено
//
Функция СведенияОЗагруженномРегионе() Экспорт
Результат = Новый Структура("Загружен, Устарел, КодСубъектаРФ", Ложь, Ложь, Неопределено);
Возврат Результат;
КонецФункции
// Параметры:
// СведенияОРегионе - см. АдресныйКлассификаторСлужебный.НаименованиеИСокращение
//
// Возвращаемое значение:
// РезультатЗапроса
// Неопределено
//
Функция АктуальныеДанныеОРегионе(Знач СведенияОРегионе) Экспорт
Запрос = Новый Запрос;
Если ЗначениеЗаполнено(СведенияОРегионе.Сокращение) Тогда
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
| ВЫБОР
| КОГДА НЕ ЗагруженныеДанные.Идентификатор ЕСТЬ NULL
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК РегионЗагружен
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК ЗагруженныеДанные
| ПО (ЗагруженныеДанные.Уровень > 1)
| И АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеДанные.КодСубъектаРФ
|ГДЕ
| АдресныеОбъекты.Наименование = &Наименование
| И АдресныеОбъекты.Сокращение = &Сокращение
| И АдресныеОбъекты.Уровень = 1";
Запрос.УстановитьПараметр("Сокращение", СведенияОРегионе.Сокращение);
Иначе
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
| ВЫБОР
| КОГДА НЕ ЗагруженныеДанные.Идентификатор ЕСТЬ NULL
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК РегионЗагружен
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК ЗагруженныеДанные
| ПО (ЗагруженныеДанные.Уровень > 1)
| И АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеДанные.КодСубъектаРФ
|ГДЕ
| АдресныеОбъекты.Наименование = &Наименование
| И АдресныеОбъекты.Уровень = 1";
КонецЕсли;
Запрос.УстановитьПараметр("Наименование", СведенияОРегионе.Наименование);
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса;
КонецФункции
Функция КодыПоИдентификаторуАдресногоОбъекта(АдресныйОбъект, СведенияОДоме)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДомаЗданияСтроения.Строения КАК Строения,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| ДополнительныеСведения.ОКТМО КАК ОКТМО,
| ДополнительныеСведения.OKATO КАК ОКАТО,
| ДополнительныеСведения.КодУчасткаИФНСЮЛ КАК КодУчасткаИФНСЮЛ,
| ДополнительныеСведения.КодУчасткаИФНСФЛ КАК КодУчасткаИФНСФЛ,
| ДополнительныеСведения.КодИФНСЮЛ КАК КодИФНСЮЛ,
| ДополнительныеСведения.КодИФНСФЛ КАК КодИФНСФЛ
|ИЗ
| РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО ДомаЗданияСтроения.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
|ГДЕ
| ДомаЗданияСтроения.АдресныйОбъект = &АдресныйОбъект";
Запрос.УстановитьПараметр("АдресныйОбъект", АдресныйОбъект);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Результат = НайтиСтрокуСДомом(РезультатЗапроса, СведенияОДоме);
Если Результат <> Неопределено Тогда
Коды = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(Результат.СтрокаДанных);
Коды.Удалить("Строения");
Коды.Вставить("ИдентификаторДома", Результат.ИдентификаторДома);
Иначе
// Коды с точностью до дома не найдены. Поэтому используем коды адресного объекта
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| ДополнительныеСведения.ОКТМО КАК ОКТМО,
| ДополнительныеСведения.OKATO КАК ОКАТО,
| ДополнительныеСведения.КодУчасткаИФНСЮЛ КАК КодУчасткаИФНСЮЛ,
| ДополнительныеСведения.КодУчасткаИФНСФЛ КАК КодУчасткаИФНСФЛ,
| ДополнительныеСведения.КодИФНСЮЛ КАК КодИФНСЮЛ,
| ДополнительныеСведения.КодИФНСФЛ КАК КодИФНСФЛ
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
|ГДЕ
| АдресныеОбъекты.Идентификатор = &АдресныйОбъект";
Запрос.УстановитьПараметр("АдресныйОбъект", АдресныйОбъект);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Результат = РезультатЗапроса.Выгрузить()[0];
Коды = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(Результат);
Коды.Вставить("ИдентификаторДома", "");
КонецЕсли;
КонецЕсли;
Возврат Коды;
КонецФункции
Функция НайтиСтрокуСДомом(Знач Дома, Знач СведенияОДоме)
ТипЧисло = Новый ОписаниеТипов("Число");
НаименованиеЗданийИСтроений = АдресныйКлассификаторПовтИсп.НаименованиеВладенийИСтроений();
Для каждого ИнформацияОДомах Из Дома Цикл
Если НЕ ЗначениеЗаполнено(ИнформацияОДомах.Строения) Тогда
Продолжить;
КонецЕсли;
СтрокаСоСпискомДомов = ИнформацияОДомах.Строения.Получить();
Если ЗначениеЗаполнено(СтрокаСоСпискомДомов) Тогда
МассивДомов = СтрРазделить(СтрокаСоСпискомДомов, Символы.Таб, Ложь);
Для каждого СтрокаДом Из МассивДомов Цикл
ДанныеОДоме = СтрРазделить(Сред(СтрокаДом, 25), "~", Истина);
ВидСтроения = Неопределено;
Строение = Неопределено;
Дом = Неопределено;
НазваниеВладения = Неопределено;
НазваниеСтроения = Неопределено;
Корпус = Неопределено;
Если ЗначениеЗаполнено(ДанныеОДоме[0]) Тогда
ВидВладения = ТипЧисло.ПривестиЗначение(Лев(ДанныеОДоме[0], 1));
Дом = Сред(ДанныеОДоме[0], 2);
Если Дом = "НЕТ" Тогда
Дом = "";
КонецЕсли;
Если ЗначениеЗаполнено(Дом) Тогда
НазваниеВладения = НаименованиеЗданийИСтроений.Владения.Получить(ВидВладения);
КонецЕсли;
Если ДанныеОДоме.Количество() > 1 Тогда
Корпус = ДанныеОДоме[1];
Если ДанныеОДоме.Количество() > 3 Тогда
Строение = ДанныеОДоме[3];
Если ЗначениеЗаполнено(Строение) Тогда
ВидСтроения = ТипЧисло.ПривестиЗначение(ДанныеОДоме[2]);
НазваниеСтроения = НаименованиеЗданийИСтроений.Строения.Получить(ВидСтроения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрСравнить(СведенияОДоме.НомерДома, Дом) = 0 Тогда
Если СтрСравнить(СведенияОДоме.ТипДома, НазваниеВладения) = 0 Тогда
Если СтрСравнить(СведенияОДоме.НомерКорпуса, Корпус) = 0
И СтрСравнить(СведенияОДоме.НомерСтроения, Строение) = 0
И СтрСравнить(СведенияОДоме.ТипСтроения, НазваниеСтроения) = 0 Тогда
Результат = Новый Структура();
Результат.Вставить("ИдентификаторДома", УникальныйИдентификаторИзСтроки64(Лев(СтрокаДом, 24)));
Результат.Вставить("СтрокаДанных", ИнформацияОДомах);
Возврат Результат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
// Заполнение данных для автоподбора из загруженных данных.
//
Процедура ЗаполнитьСписокАвтоподбораЧастиАдресаВнутр(Результат, КешПредставлений, Знач Текст, ДополнительныеПараметры, ЗагруженныеАдресныеСведения)
ПреобразоватьВводАдреса(Текст);
ТекстПоиска = ЗамаскироватьСпецсимволыПодобия(Текст);
Запрос = Новый Запрос();
Если ДополнительныеПараметры.Свойство("Уровень") Тогда
ТекстЗапроса = ОдноуровневыйАвтоподборНаселенногоПункта(ДополнительныеПараметры.ТипАдреса, ДополнительныеПараметры.Уровень);
Запрос.УстановитьПараметр("Уровень", ДополнительныеПараметры.Уровень);
Если ДополнительныеПараметры.Уровень > 1 Тогда
Запрос.УстановитьПараметр("Идентификатор", ДополнительныеПараметры.Идентификатор);
КонецЕсли;
Иначе
ТекстЗапроса = КаскадныйСписокАвтоподбораНаселенногоПункта(ДополнительныеПараметры.ТипАдреса);
Приоритеты = ТаблицаПриоритетовПриАвтоподборе(ДополнительныеПараметры.ТипАдреса);
Запрос.УстановитьПараметр("Приоритеты", Приоритеты);
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("НачалоФразы", ТекстПоиска);
Результат = Новый СписокЗначений();
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаАдреса Из РезультатЗапроса.Выгрузить() Цикл
НаборПредставление = Новый Массив;
Для Позиция = 0 По 5 Цикл
ПозицияСтрокой = Строка(Позиция);
Наименование = СтрокаАдреса["Наименование" + ПозицияСтрокой];
Если ПустаяСтрока(Наименование) Тогда
Прервать;
КонецЕсли;
НаборПредставление.Добавить(СоединитьНаименованиеИТипАдресногоОбъекта(Наименование,
СтрокаАдреса["Сокращение" + ПозицияСтрокой], СтрокаАдреса["Уровень" + ПозицияСтрокой] = 1))
КонецЦикла;
Представление = СтрСоединить(НаборПредставление, ", ");
Если СтрокаАдреса.Уровень > 1 И ЗначениеЗаполнено(СтрокаАдреса.ПочтовыйИндекс) Тогда
Представление = Представление + " (" + Формат(СтрокаАдреса.ПочтовыйИндекс,"ЧГ=0") + ")";
КонецЕсли;
ЭтоГородФедеральногоЗначения = Ложь;
ПредлагатьЗагрузкуКлассификатора = Ложь;
Если СтрокаАдреса.Уровень = 1 Тогда
ЭтоГородФедеральногоЗначения = ЭтоГородФедеральногоЗначения(Представление);
Если Не ЗагруженныеАдресныеСведения.Получить("КлассификаторДоступен") Тогда
КодРегиона = АдресныйКлассификатор.КодРегионаПоНаименованию(Представление);
Если КодРегиона <> Неопределено Тогда
ДанныеОРегионе = ЗагруженныеАдресныеСведения.Получить(КодРегиона);
Если ТипЗнч(ДанныеОРегионе) = Тип("Структура") И ДанныеОРегионе.ИспользоватьЗагруженные = Ложь Тогда
ПредлагатьЗагрузкуКлассификатора = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Сведения = СведенияОПодбираемомАдресе(Представление, СтрокаАдреса.Идентификатор, СтрокаАдреса.Муниципальный, Истина,, ПредлагатьЗагрузкуКлассификатора);
ДобавитьВариантАдреса(Результат, КешПредставлений, Сведения, ЭтоГородФедеральногоЗначения);
КонецЦикла;
КонецПроцедуры
Функция ТаблицаПриоритетовПриАвтоподборе(ТипАдреса)
Приоритеты = Новый ТаблицаЗначений;
Приоритеты.Колонки.Добавить("Уровень", ОбщегоНазначения.ОписаниеТипаЧисло(2));
Приоритеты.Колонки.Добавить("Порядок", ОбщегоНазначения.ОписаниеТипаЧисло(2));
НоваяКолонка = Приоритеты.Добавить();
НоваяКолонка.Уровень = 4; // Город
НоваяКолонка.Порядок = 1;
НоваяКолонка = Приоритеты.Добавить();
НоваяКолонка.Уровень = 1; // Регион
НоваяКолонка.Порядок = 2;
НоваяКолонка = Приоритеты.Добавить();
НоваяКолонка.Уровень = 31;
НоваяКолонка.Порядок = 2;
НоваяКолонка = Приоритеты.Добавить();
НоваяКолонка.Уровень = 41;
НоваяКолонка.Порядок = 3;
НоваяКолонка = Приоритеты.Добавить();
НоваяКолонка.Уровень = 3; // Район
НоваяКолонка.Порядок = 3;
НоваяКолонка = Приоритеты.Добавить();
НоваяКолонка.Уровень = 6;
НоваяКолонка.Порядок = 4;
НоваяКолонка = Приоритеты.Добавить();
НоваяКолонка.Уровень = 65;
НоваяКолонка.Порядок = 5;
НоваяКолонка = Приоритеты.Добавить();
НоваяКолонка.Уровень = 5;
НоваяКолонка.Порядок = 6;
Возврат Приоритеты;
КонецФункции
// Преобразует введенные английские буквы к русской раскладке при подборе адреса
//
Процедура ПреобразоватьВводАдреса(Текст)
РусскиеКлавиши = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЁ";
АнглийскиеКлавиши = "QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,`";
Текст = ВРег(Текст);
Для Позиция = 0 По СтрДлина(Текст) Цикл
Символ = Сред(Текст, Позиция, 1);
ПозицияСимвола = СтрНайти(АнглийскиеКлавиши, Символ);
Если ПозицияСимвола > 0 Тогда
Текст = СтрЗаменить(Текст, Символ, Сред(РусскиеКлавиши, ПозицияСимвола, 1));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ОдноуровневыйАвтоподборНаселенногоПункта(ТипаАдреса, Уровень)
ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 20
| &Представление КАК Представление,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| &Муниципальный КАК Муниципальный
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
|ГДЕ
| (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы + ""%"" ИЛИ АдресныеОбъекты.Наименование ПОДОБНО "" "" + &НачалоФразы + ""%"")
| И АдресныеОбъекты.Уровень = &Уровень
| И &ОтборПоИдентификатору
|
|УПОРЯДОЧИТЬ ПО
| Представление";
Если Уровень > 1 Тогда
ОтборПоИдентификатору = "АдресныеОбъекты.МуниципальныйРодительскийИдентификатор = &Идентификатор";
Представление = "АдресныеОбъекты.Сокращение + "" "" + АдресныеОбъекты.Наименование";
Иначе
ОтборПоИдентификатору = "ИСТИНА";
Представление = "АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.Сокращение";
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Представление", Представление);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоИдентификатору", ОтборПоИдентификатору);
Если ЭтоМуниципальныйАдрес(ТипаАдреса) Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Муниципальный", "ИСТИНА");
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Муниципальный", "ЛОЖЬ");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "МуниципальныйРодительскийИдентификатор", "РодительскийИдентификатор");
КонецЕсли;
Возврат ТекстЗапроса;
КонецФункции
Функция КаскадныйСписокАвтоподбораНаселенногоПункта(ТипАдреса)
ТекстЗапроса = "ВЫБРАТЬ
| Приоритеты.Уровень КАК Уровень,
| Приоритеты.Порядок КАК Порядок
|ПОМЕСТИТЬ Приоритеты
|ИЗ
| &Приоритеты КАК Приоритеты
|ИНДЕКСИРОВАТЬ ПО
| Уровень,
| Порядок" + ОбщегоНазначения.РазделительПакетаЗапросов();
Если ЭтоАдминистративноТерриториальныйАдрес(ТипАдреса) Тогда
Возврат ТекстЗапроса + ПодборАдминистративноТерриториальныеАдреса();
ИначеЕсли ЭтоМуниципальныйАдрес(ТипАдреса) Тогда
Возврат ТекстЗапроса + ПодборМуниципальногоАдреса();
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ ПЕРВЫЕ 10
| АдресныеОбъекты.Наименование КАК Наименование0,
| АдресныеОбъекты.Сокращение КАК Сокращение0,
| АдресныеОбъекты.Уровень КАК Уровень0,
| АдресныеОбъектыУровень1.Наименование КАК Наименование1,
| АдресныеОбъектыУровень1.Сокращение КАК Сокращение1,
| АдресныеОбъектыУровень1.Уровень КАК Уровень1,
| АдресныеОбъектыУровень2.Наименование КАК Наименование2,
| АдресныеОбъектыУровень2.Сокращение КАК Сокращение2,
| АдресныеОбъектыУровень2.Уровень КАК Уровень2,
| АдресныеОбъектыУровень3.Наименование КАК Наименование3,
| АдресныеОбъектыУровень3.Сокращение КАК Сокращение3,
| АдресныеОбъектыУровень3.Уровень КАК Уровень3,
| АдресныеОбъектыУровень4.Наименование КАК Наименование4,
| АдресныеОбъектыУровень4.Сокращение КАК Сокращение4,
| АдресныеОбъектыУровень4.Уровень КАК Уровень4,
| АдресныеОбъектыУровень5.Наименование КАК Наименование5,
| АдресныеОбъектыУровень5.Сокращение КАК Сокращение5,
| АдресныеОбъектыУровень5.Уровень КАК Уровень5,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| ИСТИНА КАК Муниципальный,
| АдресныеОбъекты.Уровень КАК Уровень,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| ЕСТЬNULL(Приоритеты.Порядок, 0) КАК Порядок
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1
| ПО АдресныеОбъекты.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень1.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень2.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень3.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень4.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень5.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ Приоритеты КАК Приоритеты
| ПО (Приоритеты.Уровень = АдресныеОбъекты.Уровень)
|ГДЕ
| (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы + ""%""
| ИЛИ АдресныеОбъекты.Наименование ПОДОБНО ""% "" + &НачалоФразы + ""%"")
| И АдресныеОбъекты.Уровень <> 7
| И АдресныеОбъекты.Уровень <> 3
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 10
| АдресныеОбъекты.Наименование,
| АдресныеОбъекты.Сокращение,
| АдресныеОбъекты.Уровень,
| АдресныеОбъектыУровень1.Наименование,
| АдресныеОбъектыУровень1.Сокращение,
| АдресныеОбъектыУровень1.Уровень,
| АдресныеОбъектыУровень2.Наименование,
| АдресныеОбъектыУровень2.Сокращение,
| АдресныеОбъектыУровень2.Уровень,
| АдресныеОбъектыУровень3.Наименование,
| АдресныеОбъектыУровень3.Сокращение,
| АдресныеОбъектыУровень3.Уровень,
| АдресныеОбъектыУровень4.Наименование,
| АдресныеОбъектыУровень4.Сокращение,
| АдресныеОбъектыУровень4.Уровень,
| АдресныеОбъектыУровень5.Наименование,
| АдресныеОбъектыУровень5.Сокращение,
| АдресныеОбъектыУровень5.Уровень,
| АдресныеОбъекты.Идентификатор,
| ЛОЖЬ,
| АдресныеОбъекты.Уровень,
| ДополнительныеСведения.ПочтовыйИндекс,
| ЕСТЬNULL(Приоритеты.Порядок, 0)
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1
| ПО АдресныеОбъекты.РодительскийИдентификатор = АдресныеОбъектыУровень1.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.РодительскийИдентификатор = АдресныеОбъектыУровень2.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.РодительскийИдентификатор = АдресныеОбъектыУровень3.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.РодительскийИдентификатор = АдресныеОбъектыУровень4.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.РодительскийИдентификатор = АдресныеОбъектыУровень5.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ Приоритеты КАК Приоритеты
| ПО (Приоритеты.Уровень = АдресныеОбъекты.Уровень)
|ГДЕ
| (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы + ""%""
| ИЛИ АдресныеОбъекты.Наименование ПОДОБНО ""% "" + &НачалоФразы + ""%"")
| И АдресныеОбъекты.Уровень <> 7
| И АдресныеОбъекты.Уровень <> 41
| И АдресныеОбъекты.Уровень <> 31
|
|УПОРЯДОЧИТЬ ПО
| Порядок";
Возврат ТекстЗапроса;
КонецФункции
Функция ПодборАдминистративноТерриториальныеАдреса()
ТекстЗапрос = "ВЫБРАТЬ ПЕРВЫЕ 20
| АдресныеОбъекты.Наименование КАК Наименование0,
| АдресныеОбъекты.Сокращение КАК Сокращение0,
| АдресныеОбъекты.Уровень КАК Уровень0,
| АдресныеОбъектыУровень1.Наименование КАК Наименование1,
| АдресныеОбъектыУровень1.Сокращение КАК Сокращение1,
| АдресныеОбъектыУровень1.Уровень КАК Уровень1,
| АдресныеОбъектыУровень2.Наименование КАК Наименование2,
| АдресныеОбъектыУровень2.Сокращение КАК Сокращение2,
| АдресныеОбъектыУровень2.Уровень КАК Уровень2,
| АдресныеОбъектыУровень3.Наименование КАК Наименование3,
| АдресныеОбъектыУровень3.Сокращение КАК Сокращение3,
| АдресныеОбъектыУровень3.Уровень КАК Уровень3,
| АдресныеОбъектыУровень4.Наименование КАК Наименование4,
| АдресныеОбъектыУровень4.Сокращение КАК Сокращение4,
| АдресныеОбъектыУровень4.Уровень КАК Уровень4,
| АдресныеОбъектыУровень5.Наименование КАК Наименование5,
| АдресныеОбъектыУровень5.Сокращение КАК Сокращение5,
| АдресныеОбъектыУровень5.Уровень КАК Уровень5,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| ЛОЖЬ КАК Муниципальный,
| АдресныеОбъекты.Уровень КАК Уровень,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| ЕСТЬNULL(Приоритеты.Порядок, 0) КАК Порядок
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1
| ПО АдресныеОбъекты.РодительскийИдентификатор = АдресныеОбъектыУровень1.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.РодительскийИдентификатор = АдресныеОбъектыУровень2.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.РодительскийИдентификатор = АдресныеОбъектыУровень3.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.РодительскийИдентификатор = АдресныеОбъектыУровень4.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.РодительскийИдентификатор = АдресныеОбъектыУровень5.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ Приоритеты КАК Приоритеты
| ПО (Приоритеты.Уровень = АдресныеОбъекты.Уровень)
|ГДЕ
| (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы + ""%""
| ИЛИ АдресныеОбъекты.Наименование ПОДОБНО ""% "" + &НачалоФразы + ""%"")
| И АдресныеОбъекты.Уровень <> 7
| И АдресныеОбъекты.Уровень <> 41
| И АдресныеОбъекты.Уровень <> 31
|
|УПОРЯДОЧИТЬ ПО
| Порядок";
Возврат ТекстЗапрос;
КонецФункции
Функция ПодборМуниципальногоАдреса()
ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 20
| АдресныеОбъекты.Наименование КАК Наименование0,
| АдресныеОбъекты.Сокращение КАК Сокращение0,
| АдресныеОбъекты.Уровень КАК Уровень0,
| АдресныеОбъектыУровень1.Наименование КАК Наименование1,
| АдресныеОбъектыУровень1.Сокращение КАК Сокращение1,
| АдресныеОбъектыУровень1.Уровень КАК Уровень1,
| АдресныеОбъектыУровень2.Наименование КАК Наименование2,
| АдресныеОбъектыУровень2.Сокращение КАК Сокращение2,
| АдресныеОбъектыУровень2.Уровень КАК Уровень2,
| АдресныеОбъектыУровень3.Наименование КАК Наименование3,
| АдресныеОбъектыУровень3.Сокращение КАК Сокращение3,
| АдресныеОбъектыУровень3.Уровень КАК Уровень3,
| АдресныеОбъектыУровень4.Наименование КАК Наименование4,
| АдресныеОбъектыУровень4.Сокращение КАК Сокращение4,
| АдресныеОбъектыУровень4.Уровень КАК Уровень4,
| АдресныеОбъектыУровень5.Наименование КАК Наименование5,
| АдресныеОбъектыУровень5.Сокращение КАК Сокращение5,
| АдресныеОбъектыУровень5.Уровень КАК Уровень5,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| ИСТИНА КАК Муниципальный,
| АдресныеОбъекты.Уровень КАК Уровень,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| ЕСТЬNULL(Приоритеты.Порядок, 0) КАК Порядок
|
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1
| ПО АдресныеОбъекты.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень1.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень2.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень3.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень4.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.МуниципальныйРодительскийИдентификатор = АдресныеОбъектыУровень5.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ Приоритеты КАК Приоритеты
| ПО (Приоритеты.Уровень = АдресныеОбъекты.Уровень)
|ГДЕ
| (АдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы + ""%""
| ИЛИ АдресныеОбъекты.Наименование ПОДОБНО ""% "" + &НачалоФразы + ""%"")
| И АдресныеОбъекты.Уровень <> 7
| И АдресныеОбъекты.Уровень <> 4
| И АдресныеОбъекты.Уровень <> 3
|
|УПОРЯДОЧИТЬ ПО
| Порядок";
Возврат ТекстЗапроса;
КонецФункции
// Заполнение адреса по индексу из загруженных данных.
//
Процедура ЗаполнитьАдресаПоПочтовомуИндексуКлассификатораВнутр(Результат, Знач ПочтовыйИндекс, ДополнительныеПараметры)
Если ЗначениеЗаполнено(ДополнительныеПараметры.ТипАдреса) Тогда
ВключатьМуниципальныеАдреса = ЭтоМуниципальныйАдрес(ДополнительныеПараметры.ТипАдреса);
ВключатьАдминистративноТерриториальныеАдреса = ЭтоАдминистративноТерриториальныйАдрес(ДополнительныеПараметры.ТипАдреса);
Если Не ВключатьАдминистративноТерриториальныеАдреса И Не ВключатьМуниципальныеАдреса Тогда
Результат.Отказ = Истина;
Возврат;
КонецЕсли;
Иначе
ВключатьМуниципальныеАдреса = Истина;
ВключатьАдминистративноТерриториальныеАдреса = Истина;
КонецЕсли;
ТекстЗапроса = "ВЫБРАТЬ
| ДомаЗданияСтроения.АдресныйОбъект КАК Идентификатор
|ПОМЕСТИТЬ Идентификаторы
|ИЗ
| РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
| ПО (ДомаЗданияСтроения.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор)
|ГДЕ
| ДополнительныеСведения.ПочтовыйИндекс = &ПочтовыйИндекс
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| АдресныеОбъекты.Идентификатор
|ИЗ
| РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор)
|ГДЕ
| ДополнительныеСведения.ПочтовыйИндекс = &ПочтовыйИндекс
| И НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Идентификаторы.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение
|ПОМЕСТИТЬ АдресныеОбъекты
|ИЗ
| Идентификаторы КАК Идентификаторы
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО Идентификаторы.Идентификатор = АдресныеОбъекты.Идентификатор
|" + ОбщегоНазначения.РазделительПакетаЗапросов();
Если ВключатьАдминистративноТерриториальныеАдреса Тогда
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ ПЕРВЫЕ 500
| ЛОЖЬ КАК Муниципальный,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.Сокращение + ВЫБОР
| КОГДА НЕ АдресныеОбъекты1.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты1.Наименование + "" "" + АдресныеОбъекты1.Сокращение
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъекты2.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты2.Наименование + "" "" + АдресныеОбъекты2.Сокращение
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъекты3.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты3.Наименование + "" "" + АдресныеОбъекты3.Сокращение
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъекты4.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты4.Наименование + "" "" + АдресныеОбъекты4.Сокращение
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъекты5.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты5.Наименование + "" "" + АдресныеОбъекты5.Сокращение
| ИНАЧЕ """"
| КОНЕЦ КАК Представление
|ИЗ
| АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты1
| ПО АдресныеОбъекты.РодительскийИдентификатор = АдресныеОбъекты1.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты2
| ПО (АдресныеОбъекты1.РодительскийИдентификатор = АдресныеОбъекты2.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты3
| ПО (АдресныеОбъекты2.РодительскийИдентификатор = АдресныеОбъекты3.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты4
| ПО (АдресныеОбъекты3.РодительскийИдентификатор = АдресныеОбъекты4.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты5
| ПО (АдресныеОбъекты4.РодительскийИдентификатор = АдресныеОбъекты5.Идентификатор)
|ГДЕ
| АдресныеОбъекты.Наименование <> """"
|";
КонецЕсли;
Если ВключатьМуниципальныеАдреса Тогда
Если ВключатьАдминистративноТерриториальныеАдреса Тогда
ТекстЗапроса = ТекстЗапроса + "
|ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|ВЫБРАТЬ ПЕРВЫЕ 500
| ИСТИНА КАК Муниципальный,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.Сокращение + ВЫБОР
| КОГДА НЕ АдресныеОбъекты1.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты1.Наименование + "" "" + АдресныеОбъекты1.Сокращение
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъекты2.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты2.Наименование + "" "" + АдресныеОбъекты2.Сокращение
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъекты3.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты3.Наименование + "" "" + АдресныеОбъекты3.Сокращение
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъекты4.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты4.Наименование + "" "" + АдресныеОбъекты4.Сокращение
| ИНАЧЕ """"
| КОНЕЦ + ВЫБОР
| КОГДА НЕ АдресныеОбъекты5.Наименование ЕСТЬ NULL
| ТОГДА "", "" + АдресныеОбъекты5.Наименование + "" "" + АдресныеОбъекты5.Сокращение
| ИНАЧЕ """"
| КОНЕЦ КАК Представление
|ИЗ
| АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты1
| ПО АдресныеОбъекты.МуниципальныйРодительскийИдентификатор = АдресныеОбъекты1.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты2
| ПО (АдресныеОбъекты1.МуниципальныйРодительскийИдентификатор = АдресныеОбъекты2.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты3
| ПО (АдресныеОбъекты2.МуниципальныйРодительскийИдентификатор = АдресныеОбъекты3.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты4
| ПО (АдресныеОбъекты3.МуниципальныйРодительскийИдентификатор = АдресныеОбъекты4.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты5
| ПО (АдресныеОбъекты4.МуниципальныйРодительскийИдентификатор = АдресныеОбъекты5.Идентификатор)
|ГДЕ
| АдресныеОбъекты.Наименование <> """"
|";
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "
|УПОРЯДОЧИТЬ ПО
| Представление, Муниципальный УБЫВ";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ПочтовыйИндекс", ПочтовыйИндекс);
Данные = Запрос.Выполнить().Выгрузить();
КэшПредставлений = Новый Соответствие;
Индекс = 0;
Пока Индекс < Данные.Количество() Цикл
Если КэшПредставлений.Получить(Данные.Получить(Индекс).Представление) <> Неопределено Тогда
Данные.Удалить(Индекс);
Иначе
КэшПредставлений.Вставить(Данные.Получить(Индекс).Представление, Истина);
Индекс = Индекс + 1;
КонецЕсли;
КонецЦикла;
Результат.Данные = Данные;
КонецПроцедуры
// Заполнение данных для выбора адреса из загруженных данных.
//
Процедура ЗаполнитьАдресаДляИнтерактивногоВыбораВнутр(Результат, Родитель, Уровень, ТипАдреса, ДополнительныеПараметры)
Запрос = Новый Запрос();
ТекстЗапроса = "ВЫБРАТЬ
| &Представление КАК Представление,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| ИСТИНА КАК Муниципальный,
| ЗагруженныеВерсииАдресныхСведений.ДатаВерсии > ДатаВремя(1,1,1,0,0,0) КАК РегионЗагружен
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО АдресныеОбъекты.ДополнительныеАдресныеСведения = ДополнительныеСведения.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений
| ПО (АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ)
|ГДЕ
| АдресныеОбъекты.Уровень = &Уровень
| И &ОтборПоИдентификатору
| И &ОтборПоСтроке
|
|УПОРЯДОЧИТЬ ПО
| АдресныеОбъекты.Наименование, АдресныеОбъекты.Сокращение";
Запрос.УстановитьПараметр("Уровень", Уровень);
Если Уровень > 1 Тогда
Запрос.УстановитьПараметр("Идентификатор", Родитель);
Если ЭтоМуниципальныйАдрес(ТипАдреса) Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоИдентификатору", "АдресныеОбъекты.МуниципальныйРодительскийИдентификатор = &Идентификатор");
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоИдентификатору", "АдресныеОбъекты.РодительскийИдентификатор = &Идентификатор");
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Представление", "АдресныеОбъекты.Сокращение + "" "" + АдресныеОбъекты.Наименование");
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоИдентификатору", "ИСТИНА");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Представление", "АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.Сокращение");
КонецЕсли;
Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура")
И ДополнительныеПараметры.Свойство("СтрокаПоиска")
И ЗначениеЗаполнено(ДополнительныеПараметры.СтрокаПоиска) Тогда
Если Уровень <> 7 Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоСтроке", " (АдресныеОбъекты.Наименование ПОДОБНО &СтрокаПоиска + ""%""
| ИЛИ АдресныеОбъекты.Наименование ПОДОБНО "" "" + &СтрокаПоиска + ""%"")");
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоСтроке", " АдресныеОбъекты.Наименование ПОДОБНО ""%"" + &СтрокаПоиска + ""%""");
КонецЕсли;
Запрос.УстановитьПараметр("СтрокаПоиска", ДополнительныеПараметры.СтрокаПоиска);
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоСтроке", "ИСТИНА");
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
Данные = Результат.Данные;
Для Каждого Строка Из РезультатЗапроса.Выгрузить() Цикл
Если Уровень = 1 Тогда
Если НаименованиеРегионаБезТипа(Строка.Наименование) Тогда
Строка.Представление = Строка.Наименование;
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(Строка.ПочтовыйИндекс) Тогда
Строка.Представление = Строка.Представление + " (" + Формат(Строка.ПочтовыйИндекс, "ЧГ=0") + ")";
КонецЕсли;
ЗаполнитьЗначенияСвойств(Данные.Добавить(), Строка);
КонецЦикла;
КонецПроцедуры
// Конструктор таблицы - результата выбора.
//
// Возвращаемое значение:
// ТаблицаЗначений:
// * Неактуален - Булево
// * Идентификатор - УникальныйИдентификатор
// * Представление - Строка
// * РегионЗагружен - Булево
// * ЭтоМуниципальный - Булево
//
Функция ТаблицаДанныхДляИнтерактивногоВыбора()
ТипБулево = Новый ОписаниеТипов("Булево");
Данные = Новый ТаблицаЗначений;
Колонки = Данные.Колонки;
Колонки.Добавить("Неактуален", ТипБулево);
Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор"));
Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Колонки.Добавить("РегионЗагружен", ТипБулево);
Колонки.Добавить("ЭтоМуниципальный", ТипБулево);
Данные.Индексы.Добавить("Идентификатор");
Данные.Индексы.Добавить("Представление");
Возврат Данные
КонецФункции
Процедура ЗагрузитьАдресныеСведенияПоРегиону(Знач СубъектРФ, Знач КаталогФайлов, ПараметрыЗагрузки)
ЗагружатьОднимНабором = Не ПараметрыЗагрузки.ЗагружатьПорциями;
ЗагрузитьАдресныеОбъекты(СубъектРФ, КаталогФайлов, ЗагружатьОднимНабором);
ЗагрузитьДомаЗданияСтроения(СубъектРФ, КаталогФайлов, ЗагружатьОднимНабором);
ЗагрузитьЗемельныеУчастки(СубъектРФ, КаталогФайлов, ЗагружатьОднимНабором);
ЗагрузитьСвязиАдресныхОбъектов(СубъектРФ, КаталогФайлов, ЗагружатьОднимНабором);
Если ПараметрыЗагрузки.ЗагружатьИсториюАдресов Тогда
ЗагрузитьИсториюАдресныхОбъектов(СубъектРФ, КаталогФайлов, ЗагружатьОднимНабором);
ЗагрузитьПричиныИзмененияАдреса(СубъектРФ, КаталогФайлов);
КонецЕсли;
ЗагрузитьДополнительныеСведения(СубъектРФ, КаталогФайлов, ПараметрыЗагрузки.ЗагружатьИсториюАдресов);
КонецПроцедуры
Процедура ОбновитьАдресныеСокращения(Знач КаталогФайлов)
АдресныеСокращения = АдресныеСокращенияИзФайла(КаталогФайлов);
Набор = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
Набор.Загрузить(АдресныеСокращения.Сведения);
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор); // Отключаем всю бизнес-логику для ускорения операции.
КонецПроцедуры
Процедура ОповеститьОПрогрессе(Знач НаименованиеРегиона, Знач СубъектРФ, Знач ОсталосьДляЗагрузки)
Если ОсталосьДляЗагрузки > 0 Тогда
ШаблонСообщения = НСтр("ru = 'Загрузка региона ""%1 - %2""... (осталось %3)'");
ТекстОсталосьЗагрузить = Формат(ОсталосьДляЗагрузки, "ЧН=");
Иначе
ШаблонСообщения = НСтр("ru = 'Загрузка региона ""%1 - %2""'") + "...";
ТекстОсталосьЗагрузить = "";
КонецЕсли;
ИнформацияОЗагрузке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения,
СубъектРФ, НаименованиеРегиона, ТекстОсталосьЗагрузить);
ДлительныеОперации.СообщитьПрогресс(, ИнформацияОЗагрузке);
КонецПроцедуры
Процедура ОбновитьСлужебныеАдресныеСведения(СлужебныеАдресныеСведения)
Набор = РегистрыСведений.СлужебныеАдресныеСведения.СоздатьНаборЗаписей();
Набор.Очистить();
Набор.Загрузить(СлужебныеАдресныеСведения.Сведения);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Функция ИзвлечьФайлыВКаталог(ОписаниеФайлов)
// Извлекаем файлы
КаталогФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( ПолучитьИмяВременногоФайла());
СоздатьКаталог(КаталогФайлов);
Если ТипЗнч(ОписаниеФайлов) <> Тип("Массив") Тогда
// Если ОписаниеФайлов не массив, то данные передаются через константу, после извлечения очищаем передаваемые данные.
ПараметрыАдресногоКлассификатора = Константы.ПараметрыАдресногоКлассификатора.Получить().Получить();
ОписаниеФайлов = ПараметрыАдресногоКлассификатора.ОписаниеФайлов;
ПараметрыАдресногоКлассификатора.Удалить("ОписаниеФайлов");
ХранилищеПараметров = Новый ХранилищеЗначения(ПараметрыАдресногоКлассификатора);
Константы.ПараметрыАдресногоКлассификатора.Установить(ХранилищеПараметров);
КонецЕсли;
Для Каждого ОписаниеФайла Из ОписаниеФайлов Цикл
Файл = Новый Файл(ОписаниеФайла.Имя);
ПолноеИмяФайла = КаталогФайлов + ВРег(Файл.Имя);
Данные = ОписаниеФайла.Хранение;
Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
Данные.Записать(ПолноеИмяФайла);
ИначеЕсли ЭтоАдресВременногоХранилища(Данные) Тогда
Данные = ПолучитьИзВременногоХранилища(Данные); // ДвоичныеДанные
Данные.Записать(ПолноеИмяФайла);
Иначе
ПолноеИмяФайла = Данные;
КонецЕсли;
Если ВРег(Прав(ПолноеИмяФайла, 4)) = ".ZIP" Тогда
Архив = Новый ЧтениеZipФайла(ПолноеИмяФайла);
Архив.ИзвлечьВсе(КаталогФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
ФайловаяСистема.УдалитьВременныйФайл(ПолноеИмяФайла);
ФайлыСтарогоАдресногоКлассификатора = НайтиФайлы(КаталогФайлов, "*EXTRAINFO.FI");
ФайлыНовогоАдресногоКлассификатора = НайтиФайлы(КаталогФайлов, "*EXTRAACT.FI");
Если ФайлыНовогоАдресногоКлассификатора.Количество() = 0 Тогда
Если ФайлыСтарогоАдресногоКлассификатора.Количество() > 0 Тогда
ТекстПричины = НСтр("ru = 'Не допускается загрузка адресных сведений без поддержки муниципальных адресов.'");
Иначе
ТекстПричины = НСтр("ru = 'Файл не содержит адресных сведений'");
КонецЕсли;
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,
,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось загрузить адресные сведения из файла: %1
|по причине: %2
|Используйте адресные сведения, расположенные по адресу https://its.1c.ru/download/fias2'"), ПолноеИмяФайла, ТекстПричины));
ВызватьИсключение ТекстПричины;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат КаталогФайлов;
КонецФункции
Функция НоваяТаблицаАдресовСРазбивкойНаПоля()
Строка250 = ОбщегоНазначения.ОписаниеТипаСтрока(250);
Строка20 = ОбщегоНазначения.ОписаниеТипаСтрока(20);
АдресаПоПолям = Новый ТаблицаЗначений;
АдресаПоПолям.Колонки.Добавить("Ключ", ОбщегоНазначения.ОписаниеТипаЧисло(3));
АдресаПоПолям.Колонки.Добавить("ЭтоМуниципальныйАдрес", Новый ОписаниеТипов("Булево"));
АдресаПоПолям.Колонки.Добавить("Наименование0", Строка250);
АдресаПоПолям.Колонки.Добавить("Сокращение0", Строка20);
АдресаПоПолям.Колонки.Добавить("Наименование1", Строка250);
АдресаПоПолям.Колонки.Добавить("Сокращение1", Строка20);
АдресаПоПолям.Колонки.Добавить("Наименование2", Строка250);
АдресаПоПолям.Колонки.Добавить("Сокращение2", Строка20);
АдресаПоПолям.Колонки.Добавить("Наименование3", Строка250);
АдресаПоПолям.Колонки.Добавить("Сокращение3", Строка20);
АдресаПоПолям.Колонки.Добавить("Наименование4", Строка250);
АдресаПоПолям.Колонки.Добавить("Сокращение4", Строка20);
АдресаПоПолям.Колонки.Добавить("Наименование5", Строка250);
АдресаПоПолям.Колонки.Добавить("Сокращение5", Строка20);
Возврат АдресаПоПолям;
КонецФункции
Функция ПервичнаяПроверкаАдресов(Знач Адреса)
Сведения = Новый Структура;
Сведения.Вставить("Адреса" , Новый Соответствие);
Сведения.Вставить("КодыРегионов", Новый Массив);
Для Каждого КлючЗначение Из Адреса Цикл
Результат = РезультатПроверкиАдреса();
Сведения.Адреса.Вставить(КлючЗначение.Ключ, Результат);
Адрес = КлючЗначение.Значение;
Если ЭтоКонтактнаяИнформацияВXML(Адрес) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ",
НСтр("ru = 'Адрес не может быть проверен, так как он в старом формате'") );
Результат.АдресПроверен = Истина;
Результат.АдресКорректный = Ложь;
Продолжить;
КонецЕсли;
Результат = Сведения.Адреса[КлючЗначение.Ключ]; // см. РезультатПроверкиАдреса
Если СтрСравнить("ВСвободнойФорме", Адрес.AddressType) = 0 Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ",
НСтр("ru = 'Адрес не может быть проверен, так как он введен в свободной форме'"));
Результат.АдресПроверен = Истина;
Результат.АдресКорректный = Истина;
Продолжить;
КонецЕсли;
Если СтрСравнить(Адрес.country, ОсновнаяСтрана()) <> 0 Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ",
НСтр("ru = 'Адрес не может быть проверен, так как он иностранный'") );
Результат.АдресПроверен = Истина;
Результат.АдресКорректный = Истина;
Продолжить;
КонецЕсли;
// Субъект должен быть всегда
Если ПустаяСтрока(Адрес.Area) Тогда
// Нет субъекта
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ", НСтр("ru = 'Не указан регион адреса'"));
Результат.АдресПроверен = Истина;
Продолжить;
КонецЕсли;
НаименованиеСубъектаРФ = СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Area, Адрес.AreaType, Истина);
РегионЗагруженВАдресныеСведения = СведенияОРегионе(НаименованиеСубъектаРФ);
Если РегионЗагруженВАдресныеСведения.Устарел Тогда
АктуализироватьДанныеОРегионе(Адрес, РегионЗагруженВАдресныеСведения.КодСубъектаРФ, Результат);
ИначеЕсли РегионЗагруженВАдресныеСведения.КодСубъектаРФ = Неопределено Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Указан несуществующий регион ""%1""'"), НаименованиеСубъектаРФ));
Результат.АдресПроверен = Истина;
ИначеЕсли Не РегионЗагруженВАдресныеСведения.Загружен Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Отсутствуют адресные сведения по региону: %1'"),
НаименованиеСубъектаРФ));
Результат.АдресПроверен = Ложь;
Результат.АдресКорректный = Истина;
Продолжить;
Иначе
Если Сведения.КодыРегионов.Найти(РегионЗагруженВАдресныеСведения.КодСубъектаРФ) = Неопределено Тогда
Сведения.КодыРегионов.Добавить(РегионЗагруженВАдресныеСведения.КодСубъектаРФ);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Сведения;
КонецФункции
// Возвращаемое значение:
// Структура:
// * АдресКорректный - Булево
// * АдресУстарел - Булево
// * АдресПроверен - Булево
// * Варианты - Массив
// * Ошибки - Массив
//
Функция РезультатПроверкиАдреса() Экспорт
Результат = Новый Структура;
Результат.Вставить("Ошибки", Новый Массив);
Результат.Вставить("Варианты", Новый Массив);
Результат.Вставить("АдресПроверен", Ложь);
Результат.Вставить("АдресУстарел", Ложь);
Результат.Вставить("АдресКорректный", Ложь);
Возврат Результат;
КонецФункции
Функция ПроверитьАдресаПоЗагруженнымДанным(Адреса, ПроверятьУстареваниеАдресов = Ложь)
ПодготовленныеДанные = ПервичнаяПроверкаАдресов(Адреса);
Результаты = ПодготовленныеДанные.Адреса;
КодыРегионов = ПодготовленныеДанные.КодыРегионов;
ДанныеДляПроверкиАдресов = СформироватьДанныеДляПроверкиАдресов(Адреса, Результаты);
Если ДанныеДляПроверкиАдресов.АдресаПоПолям.Количество() = 0 Тогда
Возврат Результаты;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапросаПроверкиАдресов();
Запрос.УстановитьПараметр("Наборы", ДанныеДляПроверкиАдресов.АдресаПоПолям);
Запрос.УстановитьПараметр("КодыРегионов", КодыРегионов);
РезультатЗапроса = Запрос.ВыполнитьПакет();
ВариантыАдресов = РезультатЗапроса[8];
Дома = РезультатЗапроса[9];
ДополнительныеСведения = РезультатЗапроса[11];
Участки = РезультатЗапроса[12];
АнализАдресныхОбъектов(Результаты, Адреса, ДанныеДляПроверкиАдресов.ПроверяемыеУровни, ВариантыАдресов, ПроверятьУстареваниеАдресов);
АнализДомовИДополнительныхСведений(Результаты, Адреса, Дома, Участки, ДополнительныеСведения);
Возврат Результаты;
КонецФункции
// Проверка адрес на соответствие адресного классификатора
//
// Параметры:
// Адреса - Соответствие из КлючИЗначение:
// * Ключ - Число - уникальный ключ адреса,
// * Значение - Строка - строка в формате JSON с адресом.
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Число - уникальный ключ адреса,
// * Значение - Структура:
// * Ошибки - Массив из Строка - список ошибок
// * Варианты - Массив из Строка - варианты нового адреса, если адрес устарел
// * АдресПроверен - Булево - признак, что адрес был проверен
// * АдресКорректный - Булево - признак, что адрес корректный
//
Функция ПроверитьАдресаПоКлассификатору(Адреса, ПроверятьУстареваниеАдресов = Ложь)
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("АнализАдресовПоКлассификатору", "Адреса", Адреса, Тип("Соответствие"));
Результаты = ПроверитьАдресаПоЗагруженнымДанным(Адреса, ПроверятьУстареваниеАдресов);
АдресГородовФедеральногоЗначения = Новый Соответствие;
Для Каждого ЭлементПроверки Из Адреса Цикл
Если Результаты[ЭлементПроверки.Ключ].АдресПроверен = Ложь
И Результаты[ЭлементПроверки.Ключ].Ошибки.Количество() > 0
И ЭтоГородФедеральногоЗначения(ПолноеНаименованиеРегиона(ЭлементПроверки.Значение.Area, ЭлементПроверки.Значение.AreaType))
И ЭтоМуниципальныйАдрес(ЭлементПроверки.Значение.addressType) Тогда
Адрес = ОбщегоНазначения.СкопироватьРекурсивно(ЭлементПроверки.Значение);
Адрес.munDistrict = "";
Адрес.munDistrictType = "";
Адрес.settlement = "";
Адрес.settlementType = "";
АдресГородовФедеральногоЗначения.Вставить(ЭлементПроверки.Ключ, Адрес);
КонецЕсли;
КонецЦикла;
Если АдресГородовФедеральногоЗначения.Количество() > 0 Тогда
РезультатыПовторнойПроверки = ПроверитьАдресаПоЗагруженнымДанным(АдресГородовФедеральногоЗначения, ПроверятьУстареваниеАдресов);
Для каждого РезультатПовторнойПроверки Из РезультатыПовторнойПроверки Цикл
Результаты[РезультатПовторнойПроверки.Ключ] = РезультатПовторнойПроверки.Значение;
КонецЦикла;
КонецЕсли;
Возврат Результаты;
КонецФункции
Функция ИменаУровнейАдресаПоКоду()
Уровни = Новый Соответствие;
Уровни.Вставить(1, "area");
Уровни.Вставить(31, "munDistrict");
Уровни.Вставить(41, "settlement");
Уровни.Вставить(3, "district");
Уровни.Вставить(4, "city");
Уровни.Вставить(5, "cityDistrict");
Уровни.Вставить(6, "locality");
Уровни.Вставить(65, "territory");
Уровни.Вставить(7, "street");
Возврат Уровни;
КонецФункции
Функция СформироватьДанныеДляПроверкиАдресов(Знач Адреса, Знач Результаты)
ПроверяемыеУровни = Новый Соответствие;
АдресаПоПолям = НоваяТаблицаАдресовСРазбивкойНаПоля();
Для Каждого КлючЗначение Из Адреса Цикл
Если Результаты[КлючЗначение.Ключ].АдресПроверен Тогда
Продолжить;
КонецЕсли;
Адрес = КлючЗначение.Значение;
Счетчик = 0;
// Обратная совместимость
Адрес.munDistrictType = ИсправлениеСокращений(Адрес.munDistrictType);
Адрес.munDistrict = КраткоеНаписаниеМуниципальныхРайонов(Адрес.munDistrict, Адрес.munDistrictType);
Адрес.settlementType = ИсправлениеСокращений(Адрес.settlementType);
Адрес.settlement = КраткоеНаписаниеПоселений(Адрес.settlement, Адрес.settlementType);
ПроверяемыеУровниАдреса = Новый Соответствие;
ИменаУровнейАдреса = ИменаУровнейАдреса(Адрес.AddressType, Истина);
АдресПоПолям = АдресаПоПолям.Добавить();
АдресПоПолям.ЭтоМуниципальныйАдрес = ЭтоМуниципальныйАдрес(Адрес.AddressType);
АдресПоПолям.Ключ = КлючЗначение.Ключ;
Для каждого УровеньАдреса Из ИменаУровнейАдреса Цикл
Если Адрес.Свойство(УровеньАдреса)
И ЗначениеЗаполнено(Адрес[УровеньАдреса])
И Счетчик < 6 Тогда
Наименование = Адрес[УровеньАдреса];
Сокращение = Адрес[УровеньАдреса + "Type"];
// Обратная совместимость
Если СтрСравнить(УровеньАдреса, "MunDistrict") = 0 Тогда
Наименование = КраткоеНаписаниеМуниципальныхРайонов(Наименование, Сокращение);
КонецЕсли;
Если СтрСравнить(УровеньАдреса, "Settlement") = 0 Тогда
Наименование = КраткоеНаписаниеПоселений(Наименование, Сокращение);
КонецЕсли;
АдресПоПолям["Наименование" + XMLСтрока(Счетчик)] = Наименование;
АдресПоПолям["Сокращение" + XMLСтрока(Счетчик)] = Сокращение;
ПроверяемыеУровниАдреса.Вставить(УровеньАдреса, Счетчик);
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
ПроверяемыеУровни.Вставить(КлючЗначение.Ключ, ПроверяемыеУровниАдреса);
КонецЦикла;
Результат = Новый Структура;
Результат.Вставить("АдресаПоПолям", АдресаПоПолям);
Результат.Вставить("ПроверяемыеУровни", ПроверяемыеУровни);
Возврат Результат;
КонецФункции
Функция ТекстЗапросаПроверкиАдресов()
ТекстЗапроса = "ВЫБРАТЬ
| Наборы.Ключ КАК Ключ,
| Наборы.ЭтоМуниципальныйАдрес КАК ЭтоМуниципальныйАдрес,
| Наборы.Наименование0 КАК Наименование0,
| Наборы.Сокращение0 КАК Сокращение0,
| Наборы.Наименование1 КАК Наименование1,
| Наборы.Сокращение1 КАК Сокращение1,
| Наборы.Наименование2 КАК Наименование2,
| Наборы.Сокращение2 КАК Сокращение2,
| Наборы.Наименование3 КАК Наименование3,
| Наборы.Сокращение3 КАК Сокращение3,
| Наборы.Наименование4 КАК Наименование4,
| Наборы.Сокращение4 КАК Сокращение4,
| Наборы.Наименование5 КАК Наименование5,
| Наборы.Сокращение5 КАК Сокращение5
|ПОМЕСТИТЬ Набор
|ИЗ
| &Наборы КАК Наборы
|
|ИНДЕКСИРОВАТЬ ПО
| Ключ,
| Наименование0,
| Сокращение0,
| Наименование1,
| Сокращение1,
| Наименование2,
| Сокращение2,
| Наименование3,
| Сокращение3,
| Наименование4,
| Сокращение4,
| Наименование5,
| Сокращение5
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| Набор.ЭтоМуниципальныйАдрес КАК ЭтоМуниципальныйАдрес,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень0
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование0)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение0)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| АдресныеОбъекты.Уровень = 1
| И АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень1
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование1)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение1)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень2
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование2)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение2)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL
| И АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень3
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование3)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение3)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL
| И АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень4
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование4)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение4)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL
| И АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень5
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование5)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение5)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL
| И АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000
| АдресныеОбъектыУровень0.Ключ КАК Ключ,
| АдресныеОбъектыУровень0.Наименование КАК НаименованиеУровень0,
| АдресныеОбъектыУровень0.Сокращение КАК СокращениеУровень0,
| АдресныеОбъектыУровень0.Идентификатор КАК ИдентификаторУровень0,
| АдресныеОбъектыУровень0.ДополнительныеСведения КАК ДополнительныеСведения0,
| АдресныеОбъектыУровень1.Наименование КАК НаименованиеУровень1,
| АдресныеОбъектыУровень1.Сокращение КАК СокращениеУровень1,
| АдресныеОбъектыУровень1.Идентификатор КАК ИдентификаторУровень1,
| АдресныеОбъектыУровень1.ДополнительныеСведения КАК ДополнительныеСведения1,
| АдресныеОбъектыУровень2.Наименование КАК НаименованиеУровень2,
| АдресныеОбъектыУровень2.Сокращение КАК СокращениеУровень2,
| АдресныеОбъектыУровень2.Идентификатор КАК ИдентификаторУровень2,
| АдресныеОбъектыУровень2.ДополнительныеСведения КАК ДополнительныеСведения2,
| АдресныеОбъектыУровень3.Наименование КАК НаименованиеУровень3,
| АдресныеОбъектыУровень3.Сокращение КАК СокращениеУровень3,
| АдресныеОбъектыУровень3.Идентификатор КАК ИдентификаторУровень3,
| АдресныеОбъектыУровень3.ДополнительныеСведения КАК ДополнительныеСведения3,
| АдресныеОбъектыУровень4.Наименование КАК НаименованиеУровень4,
| АдресныеОбъектыУровень4.Сокращение КАК СокращениеУровень4,
| АдресныеОбъектыУровень4.Идентификатор КАК ИдентификаторУровень4,
| АдресныеОбъектыУровень4.ДополнительныеСведения КАК ДополнительныеСведения4,
| АдресныеОбъектыУровень5.Наименование КАК НаименованиеУровень5,
| АдресныеОбъектыУровень5.Сокращение КАК СокращениеУровень5,
| АдресныеОбъектыУровень5.Идентификатор КАК ИдентификаторУровень5,
| АдресныеОбъектыУровень5.ДополнительныеСведения КАК ДополнительныеСведения5,
| ЕСТЬNULL(АдресныеОбъектыУровень5.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень4.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень3.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень2.Идентификатор, АдресныеОбъектыУровень1.Идентификатор)))) КАК Идентификатор
|ПОМЕСТИТЬ АдресныеОбъекты
|ИЗ
| АдресныеОбъектыУровень0 КАК АдресныеОбъектыУровень0
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень1 КАК АдресныеОбъектыУровень1
| ПО (АдресныеОбъектыУровень0.Ключ = АдресныеОбъектыУровень1.Ключ)
| И (АдресныеОбъектыУровень0.Идентификатор = АдресныеОбъектыУровень1.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень0.Идентификатор = АдресныеОбъектыУровень1.СвязиМуниципальныйРодительскийИдентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень2 КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.Ключ = АдресныеОбъектыУровень2.Ключ)
| И (АдресныеОбъектыУровень1.Идентификатор = АдресныеОбъектыУровень2.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень1.Идентификатор = АдресныеОбъектыУровень2.СвязиМуниципальныйРодительскийИдентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень3 КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.Ключ = АдресныеОбъектыУровень3.Ключ)
| И (АдресныеОбъектыУровень2.Идентификатор = АдресныеОбъектыУровень3.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень2.Идентификатор = АдресныеОбъектыУровень3.СвязиМуниципальныйРодительскийИдентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень4 КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.Ключ = АдресныеОбъектыУровень4.Ключ)
| И (АдресныеОбъектыУровень3.Идентификатор = АдресныеОбъектыУровень4.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень3.Идентификатор = АдресныеОбъектыУровень4.СвязиМуниципальныйРодительскийИдентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень5 КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.Ключ = АдресныеОбъектыУровень5.Ключ)
| И (АдресныеОбъектыУровень4.Идентификатор = АдресныеОбъектыУровень5.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень4.Идентификатор = АдресныеОбъектыУровень5.СвязиМуниципальныйРодительскийИдентификатор)
|ГДЕ АдресныеОбъектыУровень0.ЭтоМуниципальныйАдрес = ИСТИНА
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000
| АдресныеОбъектыУровень0.Ключ,
| АдресныеОбъектыУровень0.Наименование,
| АдресныеОбъектыУровень0.Сокращение,
| АдресныеОбъектыУровень0.Идентификатор,
| АдресныеОбъектыУровень0.ДополнительныеСведения,
| АдресныеОбъектыУровень1.Наименование,
| АдресныеОбъектыУровень1.Сокращение,
| АдресныеОбъектыУровень1.Идентификатор,
| АдресныеОбъектыУровень1.ДополнительныеСведения,
| АдресныеОбъектыУровень2.Наименование,
| АдресныеОбъектыУровень2.Сокращение,
| АдресныеОбъектыУровень2.Идентификатор,
| АдресныеОбъектыУровень2.ДополнительныеСведения,
| АдресныеОбъектыУровень3.Наименование,
| АдресныеОбъектыУровень3.Сокращение,
| АдресныеОбъектыУровень3.Идентификатор,
| АдресныеОбъектыУровень3.ДополнительныеСведения,
| АдресныеОбъектыУровень4.Наименование,
| АдресныеОбъектыУровень4.Сокращение,
| АдресныеОбъектыУровень4.Идентификатор,
| АдресныеОбъектыУровень4.ДополнительныеСведения,
| АдресныеОбъектыУровень5.Наименование,
| АдресныеОбъектыУровень5.Сокращение,
| АдресныеОбъектыУровень5.Идентификатор,
| АдресныеОбъектыУровень5.ДополнительныеСведения,
| ЕСТЬNULL(АдресныеОбъектыУровень5.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень4.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень3.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень2.Идентификатор, АдресныеОбъектыУровень1.Идентификатор))))
|ИЗ
| АдресныеОбъектыУровень0 КАК АдресныеОбъектыУровень0
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень1 КАК АдресныеОбъектыУровень1
| ПО (АдресныеОбъектыУровень0.Ключ = АдресныеОбъектыУровень1.Ключ)
| И АдресныеОбъектыУровень0.Идентификатор = АдресныеОбъектыУровень1.РодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень2 КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.Ключ = АдресныеОбъектыУровень2.Ключ)
| И АдресныеОбъектыУровень1.Идентификатор = АдресныеОбъектыУровень2.РодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень3 КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.Ключ = АдресныеОбъектыУровень3.Ключ)
| И АдресныеОбъектыУровень2.Идентификатор = АдресныеОбъектыУровень3.РодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень4 КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.Ключ = АдресныеОбъектыУровень4.Ключ)
| И АдресныеОбъектыУровень3.Идентификатор = АдресныеОбъектыУровень4.РодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень5 КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.Ключ = АдресныеОбъектыУровень5.Ключ)
| И АдресныеОбъектыУровень4.Идентификатор = АдресныеОбъектыУровень5.РодительскийИдентификатор
|ГДЕ АдресныеОбъектыУровень0.ЭтоМуниципальныйАдрес = ЛОЖЬ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъекты.Ключ КАК Ключ,
| АдресныеОбъекты.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты.ДополнительныеСведения0 КАК ДополнительныеСведения0,
| АдресныеОбъекты.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъекты.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъекты.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты.ДополнительныеСведения1 КАК ДополнительныеСведения1,
| АдресныеОбъекты.НаименованиеУровень2 КАК НаименованиеУровень2,
| АдресныеОбъекты.СокращениеУровень2 КАК СокращениеУровень2,
| АдресныеОбъекты.ИдентификаторУровень2 КАК ИдентификаторУровень2,
| АдресныеОбъекты.ДополнительныеСведения2 КАК ДополнительныеСведения2,
| АдресныеОбъекты.НаименованиеУровень3 КАК НаименованиеУровень3,
| АдресныеОбъекты.СокращениеУровень3 КАК СокращениеУровень3,
| АдресныеОбъекты.ИдентификаторУровень3 КАК ИдентификаторУровень3,
| АдресныеОбъекты.ДополнительныеСведения3 КАК ДополнительныеСведения3,
| АдресныеОбъекты.НаименованиеУровень4 КАК НаименованиеУровень4,
| АдресныеОбъекты.СокращениеУровень4 КАК СокращениеУровень4,
| АдресныеОбъекты.ИдентификаторУровень4 КАК ИдентификаторУровень4,
| АдресныеОбъекты.ДополнительныеСведения4 КАК ДополнительныеСведения4,
| АдресныеОбъекты.НаименованиеУровень5 КАК НаименованиеУровень5,
| АдресныеОбъекты.СокращениеУровень5 КАК СокращениеУровень5,
| АдресныеОбъекты.ИдентификаторУровень5 КАК ИдентификаторУровень5,
| АдресныеОбъекты.ДополнительныеСведения5 КАК ДополнительныеСведения5,
| АдресныеОбъекты.Идентификатор КАК Идентификатор
|ИЗ
| АдресныеОбъекты КАК АдресныеОбъекты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 3000
| ДомаЗданияСтроения.АдресныйОбъект КАК АдресныйОбъект,
| ДомаЗданияСтроения.КодСубъектаРФ КАК КодСубъектаРФ,
| ДомаЗданияСтроения.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| ДомаЗданияСтроения.Строения КАК Строения,
| ДомаАдресныхОбъектов.Идентификатор КАК Идентификатор,
| ДомаАдресныхОбъектов.Ключ КАК Ключ,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс
|ИЗ
| АдресныеОбъекты КАК ДомаАдресныхОбъектов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
| ПО (ДомаЗданияСтроения.АдресныйОбъект = ДомаАдресныхОбъектов.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО (ДополнительныеСведения.Идентификатор = ДомаЗданияСтроения.ДополнительныеАдресныеСведения)
|ГДЕ
| НЕ ДомаЗданияСтроения.Строения ЕСТЬ NULL
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъектыИсточник.Ключ КАК Ключ,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| АдресныеОбъекты.Уровень КАК Уровень
|ПОМЕСТИТЬ АдресныйОбъект
|ИЗ
| АдресныеОбъекты КАК АдресныеОбъектыИсточник
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Идентификатор = АдресныеОбъектыИсточник.Идентификатор)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КодыАдресногоОбъекта.Ключ КАК Ключ,
| КодыАдресногоОбъекта.Идентификатор КАК Идентификатор,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| ДополнительныеСведения.ОКТМО КАК ОКТМО
|ИЗ
| АдресныйОбъект КАК КодыАдресногоОбъекта
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО (ДополнительныеСведения.Идентификатор = КодыАдресногоОбъекта.ДополнительныеАдресныеСведения)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1000
| ЗемельныеУчастки.АдресныйОбъект КАК АдресныйОбъект,
| ЗемельныеУчастки.КодСубъектаРФ КАК КодСубъектаРФ,
| ЗемельныеУчастки.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| ЗемельныеУчастки.Участки КАК Участки,
| ДомаАдресныхОбъектов.Идентификатор КАК Идентификатор,
| ДомаАдресныхОбъектов.Ключ КАК Ключ
|ИЗ
| АдресныеОбъекты КАК ДомаАдресныхОбъектов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗемельныеУчастки КАК ЗемельныеУчастки
| ПО (ЗемельныеУчастки.АдресныйОбъект = ДомаАдресныхОбъектов.Идентификатор)
|ГДЕ
| НЕ ЗемельныеУчастки.Участки ЕСТЬ NULL";
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаУстановкиИдентификаторовАдресов()
ТекстЗапроса = "ВЫБРАТЬ
| Наборы.Ключ КАК Ключ,
| Наборы.ЭтоМуниципальныйАдрес КАК ЭтоМуниципальныйАдрес,
| Наборы.Наименование0 КАК Наименование0,
| Наборы.Сокращение0 КАК Сокращение0,
| Наборы.Наименование1 КАК Наименование1,
| Наборы.Сокращение1 КАК Сокращение1,
| Наборы.Наименование2 КАК Наименование2,
| Наборы.Сокращение2 КАК Сокращение2,
| Наборы.Наименование3 КАК Наименование3,
| Наборы.Сокращение3 КАК Сокращение3,
| Наборы.Наименование4 КАК Наименование4,
| Наборы.Сокращение4 КАК Сокращение4,
| Наборы.Наименование5 КАК Наименование5,
| Наборы.Сокращение5 КАК Сокращение5
|ПОМЕСТИТЬ Набор
|ИЗ
| &Наборы КАК Наборы
|
|ИНДЕКСИРОВАТЬ ПО
| Ключ,
| Наименование0,
| Сокращение0,
| Наименование1,
| Сокращение1,
| Наименование2,
| Сокращение2,
| Наименование3,
| Сокращение3,
| Наименование4,
| Сокращение4,
| Наименование5,
| Сокращение5
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| Набор.ЭтоМуниципальныйАдрес КАК ЭтоМуниципальныйАдрес,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень0
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование0)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение0)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| АдресныеОбъекты.Уровень = 1
| И АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень1
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование1)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение1)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень2
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование2)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение2)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень3
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование3)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение3)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень4
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование4)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение4)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Набор.Ключ КАК Ключ,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Уровень КАК Уровень,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеСведения,
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| СвязиАдресныхОбъектов.Идентификатор КАК СвязиИдентификатор,
| СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор КАК СвязиМуниципальныйРодительскийИдентификатор
|ПОМЕСТИТЬ АдресныеОбъектыУровень5
|ИЗ
| Набор КАК Набор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Наименование = Набор.Наименование5)
| И (АдресныеОбъекты.Сокращение = Набор.Сокращение5)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО (АдресныеОбъекты.Идентификатор = СвязиАдресныхОбъектов.Идентификатор)
|ГДЕ
| АдресныеОбъекты.КодСубъектаРФ В(&КодыРегионов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000
| АдресныеОбъектыУровень0.Ключ КАК Ключ,
| АдресныеОбъектыУровень0.Идентификатор КАК ИдентификаторУровень0,
| АдресныеОбъектыУровень0.ДополнительныеСведения КАК ДополнительныеСведения0,
| АдресныеОбъектыУровень1.Идентификатор КАК ИдентификаторУровень1,
| АдресныеОбъектыУровень1.ДополнительныеСведения КАК ДополнительныеСведения1,
| АдресныеОбъектыУровень2.Идентификатор КАК ИдентификаторУровень2,
| АдресныеОбъектыУровень2.ДополнительныеСведения КАК ДополнительныеСведения2,
| АдресныеОбъектыУровень3.Идентификатор КАК ИдентификаторУровень3,
| АдресныеОбъектыУровень3.ДополнительныеСведения КАК ДополнительныеСведения3,
| АдресныеОбъектыУровень4.Идентификатор КАК ИдентификаторУровень4,
| АдресныеОбъектыУровень4.ДополнительныеСведения КАК ДополнительныеСведения4,
| АдресныеОбъектыУровень5.Идентификатор КАК ИдентификаторУровень5,
| АдресныеОбъектыУровень5.ДополнительныеСведения КАК ДополнительныеСведения5,
| ЕСТЬNULL(АдресныеОбъектыУровень5.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень4.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень3.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень2.Идентификатор, АдресныеОбъектыУровень1.Идентификатор)))) КАК Идентификатор
| ПОМЕСТИТЬ АдресныеОбъекты
|ИЗ
| АдресныеОбъектыУровень0 КАК АдресныеОбъектыУровень0
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень1 КАК АдресныеОбъектыУровень1
| ПО (АдресныеОбъектыУровень0.Ключ = АдресныеОбъектыУровень1.Ключ)
| И (АдресныеОбъектыУровень0.Идентификатор = АдресныеОбъектыУровень1.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень0.Идентификатор = АдресныеОбъектыУровень1.СвязиМуниципальныйРодительскийИдентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень2 КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.Ключ = АдресныеОбъектыУровень2.Ключ)
| И (АдресныеОбъектыУровень1.Идентификатор = АдресныеОбъектыУровень2.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень1.Идентификатор = АдресныеОбъектыУровень2.СвязиМуниципальныйРодительскийИдентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень3 КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.Ключ = АдресныеОбъектыУровень3.Ключ)
| И (АдресныеОбъектыУровень2.Идентификатор = АдресныеОбъектыУровень3.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень2.Идентификатор = АдресныеОбъектыУровень3.СвязиМуниципальныйРодительскийИдентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень4 КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.Ключ = АдресныеОбъектыУровень4.Ключ)
| И (АдресныеОбъектыУровень3.Идентификатор = АдресныеОбъектыУровень4.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень3.Идентификатор = АдресныеОбъектыУровень4.СвязиМуниципальныйРодительскийИдентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень5 КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.Ключ = АдресныеОбъектыУровень5.Ключ)
| И (АдресныеОбъектыУровень4.Идентификатор = АдресныеОбъектыУровень5.МуниципальныйРодительскийИдентификатор
| ИЛИ АдресныеОбъектыУровень4.Идентификатор = АдресныеОбъектыУровень5.СвязиМуниципальныйРодительскийИдентификатор)
|ГДЕ АдресныеОбъектыУровень0.ЭтоМуниципальныйАдрес = ИСТИНА
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000
| АдресныеОбъектыУровень0.Ключ,
| АдресныеОбъектыУровень0.Идентификатор,
| АдресныеОбъектыУровень0.ДополнительныеСведения,
| АдресныеОбъектыУровень1.Идентификатор,
| АдресныеОбъектыУровень1.ДополнительныеСведения,
| АдресныеОбъектыУровень2.Идентификатор,
| АдресныеОбъектыУровень2.ДополнительныеСведения,
| АдресныеОбъектыУровень3.Идентификатор,
| АдресныеОбъектыУровень3.ДополнительныеСведения,
| АдресныеОбъектыУровень4.Идентификатор,
| АдресныеОбъектыУровень4.ДополнительныеСведения,
| АдресныеОбъектыУровень5.Идентификатор,
| АдресныеОбъектыУровень5.ДополнительныеСведения,
| ЕСТЬNULL(АдресныеОбъектыУровень5.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень4.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень3.Идентификатор, ЕСТЬNULL(АдресныеОбъектыУровень2.Идентификатор, АдресныеОбъектыУровень1.Идентификатор))))
|
|ИЗ
| АдресныеОбъектыУровень0 КАК АдресныеОбъектыУровень0
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень1 КАК АдресныеОбъектыУровень1
| ПО (АдресныеОбъектыУровень0.Ключ = АдресныеОбъектыУровень1.Ключ)
| И АдресныеОбъектыУровень0.Идентификатор = АдресныеОбъектыУровень1.РодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень2 КАК АдресныеОбъектыУровень2
| ПО (АдресныеОбъектыУровень1.Ключ = АдресныеОбъектыУровень2.Ключ)
| И АдресныеОбъектыУровень1.Идентификатор = АдресныеОбъектыУровень2.РодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень3 КАК АдресныеОбъектыУровень3
| ПО (АдресныеОбъектыУровень2.Ключ = АдресныеОбъектыУровень3.Ключ)
| И АдресныеОбъектыУровень2.Идентификатор = АдресныеОбъектыУровень3.РодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень4 КАК АдресныеОбъектыУровень4
| ПО (АдресныеОбъектыУровень3.Ключ = АдресныеОбъектыУровень4.Ключ)
| И АдресныеОбъектыУровень3.Идентификатор = АдресныеОбъектыУровень4.РодительскийИдентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъектыУровень5 КАК АдресныеОбъектыУровень5
| ПО (АдресныеОбъектыУровень4.Ключ = АдресныеОбъектыУровень5.Ключ)
| И АдресныеОбъектыУровень4.Идентификатор = АдресныеОбъектыУровень5.РодительскийИдентификатор
|ГДЕ АдресныеОбъектыУровень0.ЭтоМуниципальныйАдрес = ЛОЖЬ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъекты.Ключ КАК Ключ,
| АдресныеОбъекты.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты.ИдентификаторУровень2 КАК ИдентификаторУровень2,
| АдресныеОбъекты.ИдентификаторУровень3 КАК ИдентификаторУровень3,
| АдресныеОбъекты.ИдентификаторУровень4 КАК ИдентификаторУровень4,
| АдресныеОбъекты.ИдентификаторУровень5 КАК ИдентификаторУровень5,
| АдресныеОбъекты.Идентификатор КАК Идентификатор
|ИЗ
| АдресныеОбъекты КАК АдресныеОбъекты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 3000
| ДомаЗданияСтроения.АдресныйОбъект КАК АдресныйОбъект,
| ДомаЗданияСтроения.Строения КАК Строения,
| ДомаАдресныхОбъектов.Идентификатор КАК Идентификатор,
| ДомаАдресныхОбъектов.Ключ КАК Ключ
|ИЗ
| АдресныеОбъекты КАК ДомаАдресныхОбъектов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
| ПО (ДомаЗданияСтроения.АдресныйОбъект = ДомаАдресныхОбъектов.Идентификатор)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО (ДополнительныеСведения.Идентификатор = ДомаЗданияСтроения.ДополнительныеАдресныеСведения)
|ГДЕ
| НЕ ДомаЗданияСтроения.Строения ЕСТЬ NULL
|; ";
Возврат ТекстЗапроса;
КонецФункции
Процедура АктуализироватьДанныеОРегионе(Знач Адрес, Знач КодСубъектаРФ, Знач Результат)
Результат.АдресПроверен = Истина;
Результат.АдресКорректный = Ложь;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.РодительскийИдентификатор КАК Идентификатор
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
|ГДЕ
| АдресныеОбъекты.КодСубъектаРФ = &КодСубъектаРФ
| И АдресныеОбъекты.Уровень = &Уровень";
Запрос.УстановитьПараметр("КодСубъектаРФ", КодСубъектаРФ);
Запрос.УстановитьПараметр("Уровень", 1);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
СтароеНаименование = Адрес.area + " " + Адрес.areaType;
НовоеНаименование = "";
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовыйАдрес = ОбщегоНазначения.СкопироватьРекурсивно(Адрес);
НовыйАдрес.area = ВыборкаДетальныеЗаписи.Наименование;
НовыйАдрес.areaType = ВыборкаДетальныеЗаписи.Сокращение;
НовыйАдрес.areaId = ВыборкаДетальныеЗаписи.Идентификатор;
НовоеНаименование = НовыйАдрес.area + " " + НовыйАдрес.areaType;
Результат.Варианты.Добавить(НовыйАдрес);
КонецЦикла;
Если ПустаяСтрока(НовоеНаименование) Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Регион ""%1"" устарел'"),
СтароеНаименование);
Иначе
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Регион ""%1"" был переименован в ""%2""'"),
СтароеНаименование, НовоеНаименование);
КонецЕсли;
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(Результат.Ошибки, "СубъектРФ", ТекстОшибки);
КонецПроцедуры
Процедура АнализАдресныхОбъектов(Результаты, Адреса, Знач СписокПроверяемыхУровней, ВариантыАдресов, ПроверятьУстареваниеАдресов)
ТаблицаАдресов = ВариантыАдресов.Выгрузить();
Для Каждого КлючЗначение Из Адреса Цикл
Результат = Результаты[КлючЗначение.Ключ]; // см. РезультатПроверкиАдреса
Если Результаты[КлючЗначение.Ключ].АдресПроверен Тогда
Продолжить;
КонецЕсли;
ОшибкиПроверки = Результат.Ошибки;
НайденныеАдреса = ТаблицаАдресов.НайтиСтроки(Новый Структура("Ключ", КлючЗначение.Ключ));
КакиеУровниПроверять = СписокПроверяемыхУровней[КлючЗначение.Ключ];
СписокНекорректныхАдресов = Новый Массив;
Адрес = КлючЗначение.Значение;
ПроверитьКорректностьАдресов(СписокНекорректныхАдресов, КакиеУровниПроверять, Адрес, НайденныеАдреса, ОшибкиПроверки);
Если СписокНекорректныхАдресов.Количество() = 0 Тогда
Результат.АдресКорректный = Ложь;
Результат.АдресПроверен = ?(ЭтоГородФедеральногоЗначения(ПолноеНаименованиеРегиона(Адрес.Area, Адрес.AreaType)), Ложь, Истина); // Для городов федерального значения выполняется дополнительная проверка.
Если ПроверятьУстареваниеАдресов Тогда
НовыеАдреса = АктуальныеАдресДляИсторического(Адрес);
Если НовыеАдреса.АдресНайден Тогда
Результат.Варианты = НовыеАдреса.Варианты;
ОшибкиПроверки.Очистить();
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Представление",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Адрес некорректный, т.к. он устарел
|Актуальный: %1'"), НовыеАдреса.Представление));
КонецЕсли;
КонецЕсли;
Иначе
ОшибкиПроверки.Очистить();
Результат.АдресКорректный = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьКорректностьАдресов(СписокНекорректныхАдресов, Знач КакиеУровниПроверять, Адрес, Знач НайденныеАдреса, ОшибкиПроверки)
Для каждого АдресСтрока Из НайденныеАдреса Цикл
Если КакиеУровниПроверять["Distict"] <> Неопределено И АдресСтрока["Наименование" + КакиеУровниПроверять["Distict"]] = NULL Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "СвРайМО/Район",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Район ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.District, Адрес.DistrictType)));
Продолжить;
КонецЕсли;
Если НЕ ДанныеУровняКорректные("Area", АдресСтрока, КакиеУровниПроверять) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Субъект РФ'"),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Субъект РФ ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес["Area"], Адрес["AreaType"], Истина)));
Продолжить;
КонецЕсли;
Если НЕ ДанныеУровняКорректные("MunDistrict", АдресСтрока, КакиеУровниПроверять) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Муниципальный район'"),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Муниципальный район ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.MunDistrict, Адрес.MunDistrictType)));
Продолжить;
КонецЕсли;
Если НЕ ДанныеУровняКорректные("Distict", АдресСтрока, КакиеУровниПроверять) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Район'"),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Район ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.District, Адрес.DistrictType)));
Продолжить;
КонецЕсли;
Если НЕ ДанныеУровняКорректные("Settlement", АдресСтрока, КакиеУровниПроверять) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Поселение'"),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поселение ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Settlement, Адрес.SettlementType)));
Продолжить;
КонецЕсли;
Если НЕ ДанныеУровняКорректные("City", АдресСтрока, КакиеУровниПроверять) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Город'"),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Город ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.City, Адрес.CityType)));
Продолжить;
КонецЕсли;
Если НЕ ДанныеУровняКорректные("Territory", АдресСтрока, КакиеУровниПроверять) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Территория'"),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Территория ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Territory, Адрес.TerritoryType)));
Продолжить;
КонецЕсли;
Если НЕ ДанныеУровняКорректные("Locality", АдресСтрока, КакиеУровниПроверять) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Населенный пункт'"),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Населенный пункт ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Locality, Адрес.LocalityType)));
Продолжить;
КонецЕсли;
Если НЕ ДанныеУровняКорректные("Street", АдресСтрока, КакиеУровниПроверять) Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, НСтр("ru = 'Улица'"),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Улица ""%1"" отсутствует в адресном классификаторе'"),
СоединитьНаименованиеИТипАдресногоОбъекта(Адрес.Street, Адрес.StreetType)));
Продолжить;
КонецЕсли;
СписокНекорректныхАдресов.Добавить(АдресСтрока);
КонецЦикла;
КонецПроцедуры
Процедура АнализДомовИДополнительныхСведений(Результаты, Знач Адреса, Знач Дома, Знач Участки, Знач ДополнительныеСведения)
ТаблицаДомов = Дома.Выгрузить();
ТаблицаДополнительныеСведения = ДополнительныеСведения.Выгрузить();
ТаблицаУчастков = Участки.Выгрузить();
Для Каждого КлючЗначение Из Адреса Цикл
Результат = Результаты[КлючЗначение.Ключ];
Если Не Результат.АдресКорректный Тогда
Продолжить;
КонецЕсли;
Если Результаты[КлючЗначение.Ключ].АдресПроверен Тогда
Продолжить;
КонецЕсли;
Адрес = КлючЗначение.Значение;
ОшибкиПроверки = Результат.Ошибки;
Если ЗначениеЗаполнено(Адрес.stead) Тогда
ПроверитьУчастки(Адрес.stead, КлючЗначение.Ключ, ОшибкиПроверки, Результат, ТаблицаУчастков);
Продолжить;
КонецЕсли;
// Проверяем дома
НомерДомаАдрес = Адрес.HouseNumber;
ТипДомаАдрес = ?(ЗначениеЗаполнено(НомерДомаАдрес), Адрес.HouseType, "");
НомерКорпусаАдрес = Неопределено;
НомерСтроенияАдрес = Неопределено;
ТипСтроенияАдрес = Неопределено;
Для каждого ОписаниеСтроения Из Адрес.Buildings Цикл
Если СтрСравнить(ОписаниеСтроения.Type, "Корпус") = 0 Тогда
НомерКорпусаАдрес = ОписаниеСтроения.Number;
Иначе
НомерСтроенияАдрес = ОписаниеСтроения.Number;
ТипСтроенияАдрес = ОписаниеСтроения.Type;
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(НомерДомаАдрес) И Адрес.Buildings.Количество() = 0 Тогда
Продолжить; // У адреса нет домов, корпусов и строений. Возможно это почтовый адреса с а/я или до востребования.
КонецЕсли;
ДомКорректный = Дома.Пустой(); // Домов нет, любой дом считаем корректным.
ПочтовыйИндекс = 0;
ОписаниеТиповСтрока100 = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100));
ПохожиеВарианты = Новый ТаблицаЗначений;
ПохожиеВарианты.Колонки.Добавить("Дом", ОписаниеТиповСтрока100);
ПохожиеВарианты.Индексы.Добавить("Дом");
НайденныеДома = ТаблицаДомов.НайтиСтроки(Новый Структура("Ключ", КлючЗначение.Ключ));
Для каждого ИнформацияОДомах Из НайденныеДома Цикл
Если ПустаяСтрока(ИнформацияОДомах.Строения) Тогда
Продолжить;
КонецЕсли;
СтрокаСоСпискомДомов = ИнформацияОДомах.Строения.Получить();
Если ЗначениеЗаполнено(СтрокаСоСпискомДомов) Тогда
ТипЧисло = Новый ОписаниеТипов("Число");
МассивДомов = СтрРазделить(СтрокаСоСпискомДомов, Символы.Таб, Ложь);
НаименованиеЗданийИСтроений = АдресныйКлассификаторПовтИсп.НаименованиеВладенийИСтроений();
Для каждого СтрокаДом Из МассивДомов Цикл
СведенияОДоме = СтрРазделить(Сред(СтрокаДом, 25), "~", Истина);
ВидСтроения = Неопределено;
Строение = Неопределено;
Дом = Неопределено;
НазваниеВладения = Неопределено;
НазваниеСтроения = Неопределено;
Корпус = Неопределено;
Если ЗначениеЗаполнено(СведенияОДоме[0]) Тогда
ВидВладения = ТипЧисло.ПривестиЗначение(Лев(СведенияОДоме[0], 1));
Дом = Сред(СведенияОДоме[0], 2);
Если СтрСравнить(Дом, "НЕТ") = 0 Тогда
Дом = "";
КонецЕсли;
Если ЗначениеЗаполнено(Дом) Тогда
НазваниеВладения = НаименованиеЗданийИСтроений.Владения.Получить(ВидВладения);
КонецЕсли;
Если СведенияОДоме.Количество() > 1 Тогда
Корпус = СведенияОДоме[1];
Если СведенияОДоме.Количество() > 2 Тогда
ВидСтроения = ТипЧисло.ПривестиЗначение(СведенияОДоме[2]);
Если СведенияОДоме.Количество() > 3 Тогда
Строение = СведенияОДоме[3];
Если ЗначениеЗаполнено(Строение) Тогда
НазваниеСтроения = НаименованиеЗданийИСтроений.Строения.Получить(ВидСтроения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрСравнить(НомерДомаАдрес, Дом) = 0 Тогда
Если СтрСравнить(ТипДомаАдрес, НазваниеВладения) = 0 Тогда
Если СтрСравнить(НомерКорпусаАдрес, Корпус) = 0
И СтрСравнить(НомерСтроенияАдрес, Строение) = 0
И СтрСравнить(ТипСтроенияАдрес, НазваниеСтроения) = 0 Тогда
ДомКорректный = Истина;
ПочтовыйИндекс = ИнформацияОДомах.ПочтовыйИндекс;
Прервать;
Иначе
// дома совпал, но корпус или строение отличается
НовыйВариант = ПохожиеВарианты.Добавить();
НовыйВариант.Дом = ПредставлениеДомаИСтроений(НазваниеВладения, Дом, Корпус, НазваниеСтроения, Строение);
КонецЕсли;
Иначе
// тип дома не совпал
ТекстПроДом = НРег(НазваниеВладения) + " """ + Дом + """";
Если ПохожиеВарианты.Найти(ТекстПроДом, "Дом") = Неопределено Тогда
НовыйВариант = ПохожиеВарианты.Добавить();
НовыйВариант.Дом = ТекстПроДом;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ДомКорректный = Истина Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если НЕ ДомКорректный Тогда
ПолеСОшибкой = ?(ЗначениеЗаполнено(НомерДомаАдрес), "Дом", "Строение");
ПредставлениеДома = ПредставлениеДомаИСтроений(ТипДомаАдрес, НомерДомаАдрес, НомерКорпусаАдрес, ТипСтроенияАдрес, НомерСтроенияАдрес);
ПредставлениеДома = ВРег(Лев(ПредставлениеДома, 1)) + Сред(ПредставлениеДома, 2);
Если ПохожиеВарианты.Количество() > 0 Тогда
ПервыйВариант = ПохожиеВарианты[0].Дом;
Если ПохожиеВарианты.Количество() = 1 Тогда
ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'но есть %1'"), ПервыйВариант);
Иначе
Если ПохожиеВарианты.Количество() = 2 Тогда
ШаблонПодсказки = НСтр("ru = 'но есть %1 или %2'");
ВторойВариант = ПохожиеВарианты[1].Дом;
Иначе
ШаблонПодсказки = НСтр("ru = 'но есть %1 и другие варианты (%2)'");
ВторойВариант = Формат(ПохожиеВарианты.Количество() - 1, "ЧГ=0");
КонецЕсли;
ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонПодсказки, ПервыйВариант, ВторойВариант);
КонецЕсли;
ТекстПодсказки = ", " + ТекстПодсказки;
Иначе
ТекстПодсказки = "";
КонецЕсли;
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, ПолеСОшибкой,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 отсутствует в адресном классификаторе%2'"),
ПредставлениеДома, ТекстПодсказки));
Результат.АдресКорректный = Ложь;
Результат.АдресПроверен = Истина;
Продолжить;
КонецЕсли;
НайденныеДополнительныеСведения = ТаблицаДополнительныеСведения.НайтиСтроки(Новый Структура("Ключ", КлючЗначение.Ключ));
// Проверка индекса
Если Не ЗначениеЗаполнено(ПочтовыйИндекс) И НайденныеДополнительныеСведения.Количество() > 0 Тогда
ДополнительныеАдресныеСведения = НайденныеДополнительныеСведения[0]; // Нет индекса на уровне домов.
ПочтовыйИндекс = ДополнительныеАдресныеСведения.ПочтовыйИндекс;
КонецЕсли;
ПочтовыйИндекс = Формат(ПочтовыйИндекс, "ЧГ=0");
Если СтрСравнить(ПочтовыйИндекс, Адрес.ZipCode) <> 0 Тогда
Результат.АдресКорректный = Ложь;
ДополнительныйТекст = ?(ЗначениеЗаполнено(ПочтовыйИндекс), " " + НСтр("ru = 'Возможно, правильный индекс'") + " " + ПочтовыйИндекс, "");
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Индекс",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Индекс ""%1"" не соответствует адресу.%2'"), Адрес.ZipCode, ДополнительныйТекст));
КонецЕсли;
Результат.АдресПроверен = Истина;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьУчастки(Знач Участок, Знач ИндексАдреса, Знач ОшибкиПроверки, Знач Результат, Знач ТаблицаУчастков)
// Проверка участка
НайденныеУчастки = ТаблицаУчастков.НайтиСтроки(Новый Структура("Ключ", ИндексАдреса));
Для каждого ИнформацияОУчастках Из НайденныеУчастки Цикл
Если ПустаяСтрока(ИнформацияОУчастках.Участки) Тогда
Продолжить;
КонецЕсли;
СтрокаСоСпискомУчастков = ИнформацияОУчастках.Участки.Получить();
Если ЗначениеЗаполнено(СтрокаСоСпискомУчастков) Тогда
НаборУчастков = СтрРазделить(СтрокаСоСпискомУчастков, Символы.Таб, Ложь);
Для каждого СтрокаУчасток Из НаборУчастков Цикл
НомерУчастка = Сред(СтрокаУчасток, 25);
Если СтрСравнить(НомерУчастка, Участок) = 0 Тогда
Результат.АдресКорректный = Истина;
Результат.АдресПроверен = Истина;
Возврат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Дом",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Земельный участок %1 отсутствует в адресном классификаторе'"),
Участок));
Результат.АдресКорректный = Ложь;
Результат.АдресПроверен = Истина;
КонецПроцедуры
#Область КонвертацияАдресаБазыВАдресВебСервиса
Функция АдресДляПередачиВСервис(Адрес)
Результат = НовыйАдресДляДляПередачиВСервис();
ЗаполнитьЗначенияСвойств(Результат, Адрес,, "apartments, buildings");
Результат.Вставить("ifnsFlAreaCode", Адрес.ifnsFLAreaCode);
Результат.Вставить("ifnsFlCode", Адрес.ifnsFLCode);
Результат.Вставить("ifnsUlAreaCode", Адрес.ifnsULAreaCode);
Результат.Вставить("ifnsUlCode", Адрес.ifnsULCode);
Результат.Вставить("steadNumber", Адрес.stead);
Если ЗначениеЗаполнено(Адрес.stead) Тогда
Результат.steadType = ТипАдресногоОбъектаУчасток();
КонецЕсли;
Результат.Вставить("apartments", Новый Массив);
Для Каждого Дом Из Адрес.apartments Цикл
ВебДом = НовыйДомДляДляПередачиВСервис();
ВебДом.type = Дом.Type;
ВебДом.number = Дом.Number;
Результат.apartments.Добавить(ВебДом);
КонецЦикла;
Результат.Вставить("buildings", Новый Массив);
Для Каждого Дом Из Адрес.buildings Цикл
ВебДом = НовыйДомДляДляПередачиВСервис();
ВебДом.type = Дом.Type;
ВебДом.number = Дом.Number;
Результат.buildings.Добавить(ВебДом);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ТипАдресногоОбъектаУчасток()
Возврат "участок";
КонецФункции
Функция НовыйАдресДляДляПередачиВСервис()
Адрес = Новый Структура;
Адрес.Вставить("ZIPcode"); // postalCode -> ZIPCode
Адрес.Вставить("apartments"); // Массив из (См. ДомДляДляПередачиВСервис())
Адрес.Вставить("area");
Адрес.Вставить("areaCode");
Адрес.Вставить("areaId");
Адрес.Вставить("areaType");
Адрес.Вставить("buildings"); // Массив из (См. ДомДляДляПередачиВСервис())
Адрес.Вставить("city");
Адрес.Вставить("cityDistrict");
Адрес.Вставить("cityDistrictId");
Адрес.Вставить("cityDistrictType");
Адрес.Вставить("cityId");
Адрес.Вставить("cityType");
Адрес.Вставить("codeKLADR"); // code -> codeKLADR
Адрес.Вставить("district");
Адрес.Вставить("districtId");
Адрес.Вставить("districtType");
Адрес.Вставить("houseId");
Адрес.Вставить("houseType");
Адрес.Вставить("houseNumber"); // house -> houseNumber
Адрес.Вставить("id");
Адрес.Вставить("ifnsFlAreaCode");
Адрес.Вставить("ifnsFlCode");
Адрес.Вставить("ifnsUlAreaCode");
Адрес.Вставить("ifnsUlCode");
Адрес.Вставить("locality");
Адрес.Вставить("localityId");
Адрес.Вставить("localityType");
Адрес.Вставить("munDistrict");
Адрес.Вставить("munDistrictId");
Адрес.Вставить("munDistrictType");
Адрес.Вставить("okato");
Адрес.Вставить("oktmo");
Адрес.Вставить("settlement");
Адрес.Вставить("settlementId");
Адрес.Вставить("settlementType");
Адрес.Вставить("street");
Адрес.Вставить("streetId");
Адрес.Вставить("streetType");
Адрес.Вставить("steadNumber");
Адрес.Вставить("steadId");
Адрес.Вставить("steadType");
Адрес.Вставить("territory");
Адрес.Вставить("territoryId");
Адрес.Вставить("territoryType");
Адрес.Вставить("value");
Возврат Адрес;
КонецФункции
Функция НовыйДомДляДляПередачиВСервис()
Дом = Новый Структура;
Дом.Вставить("type");
Дом.Вставить("number");
Возврат Дом;
КонецФункции
#КонецОбласти
#Область КонвертацияАдресВебСервисаВАдресБазы
Функция АдресДляСохраненияВБазе(Адрес, Муниципальный = Истина)
Результат = ОписаниеНовойКонтактнойИнформации();
ЗаполнитьЗначенияСвойств(Результат, Адрес);
Для Каждого ПолеАдреса Из Результат Цикл
Если ПолеАдреса.Значение = Неопределено Тогда
Результат[ПолеАдреса.Ключ] = "";
КонецЕсли;
КонецЦикла;
Если Муниципальный Тогда
Результат.addressType = МуниципальныйАдрес();
Результат.value = Адрес.munValueWithPostalCode;
Иначе
Результат.addressType = АдминистративноТерриториальныйАдрес();
Результат.value = Адрес.valueWithPostalCode;
КонецЕсли;
Результат.houseType = ТРег(Результат.houseType);
// Зависит от версии веб-сервиса
Если Адрес.Свойство("steadNumber") Тогда
Результат.stead = Строка(Адрес.steadNumber);
КонецЕсли;
Для каждого Строение Из Результат.buildings Цикл
Строение.type = ТРег(Строение.type);
КонецЦикла;
Для каждого Помещение Из Результат.apartments Цикл
Помещение.type = ТРег(Помещение.type);
КонецЦикла;
Результат.country = ОсновнаяСтрана();
Возврат Результат;
КонецФункции
#КонецОбласти
// ОКТМО
Функция СведенияПоСпискуОКМТО(СписокОКТМО) Экспорт
Результат = Новый Соответствие;
СведенияОЗагрузкеСубъектовРФ = СведенияОЗагрузкеСубъектовРФ();
ТипЧисло = ОбщегоНазначения.ОписаниеТипаЧисло(11);
ТаблицаОКТМО = Новый ТаблицаЗначений;
ТаблицаОКТМО.Колонки.Добавить("ОКТМО", ТипЧисло);
ТаблицаОКТМО.Колонки.Добавить("КлючЗаписиОКТМО", ОбщегоНазначения.ОписаниеТипаЧисло(3));
ТаблицаОКТМОВебСервис = ТаблицаОКТМО.Скопировать();
Для каждого ЗаписьОКТМО Из СписокОКТМО Цикл
ОКТМОЧислом = ТипЧисло.ПривестиЗначение(ЗаписьОКТМО.Значение);
Если СтрНачинаетсяС(ЗаписьОКТМО.Значение, "118")
Или СтрНачинаетсяС(ЗаписьОКТМО.Значение, "718")
Или СтрНачинаетсяС(ЗаписьОКТМО.Значение, "719") Тогда
КодОКТМОРегиона = Лев(ЗаписьОКТМО.Значение, 3);
Иначе
КодОКТМОРегиона = Лев(ЗаписьОКТМО.Значение, 2);
КонецЕсли;
НайденныеСтроки = СведенияОЗагрузкеСубъектовРФ.НайтиСтроки(Новый Структура("ОКТМО", КодОКТМОРегиона));
Если НайденныеСтроки.Количество() = 0 Тогда
Результат.Вставить(ЗаписьОКТМО.Ключ, Неопределено);
Продолжить;
КонецЕсли;
СведенияОРегионе = НайденныеСтроки[0];
Если ОКТМОЧислом > 0 Тогда
Если СведенияОРегионе.Загружено И Не СведенияОРегионе.Устарело Тогда
НоваяСтрокаОКТМО = ТаблицаОКТМО.Добавить();
Иначе
НоваяСтрокаОКТМО = ТаблицаОКТМОВебСервис.Добавить();
КонецЕсли;
НоваяСтрокаОКТМО.ОКТМО = ОКТМОЧислом;
НоваяСтрокаОКТМО.КлючЗаписиОКТМО = ЗаписьОКТМО.Ключ;
Иначе
Результат.Вставить(ЗаписьОКТМО.Ключ, Неопределено);
КонецЕсли;
КонецЦикла;
Если ТаблицаОКТМО.Количество() > 0 Тогда
СведенияПоСпискуОКМТОЗагруженныеДанные(ТаблицаОКТМО, Результат);
КонецЕсли;
Если ТаблицаОКТМОВебСервис.Количество() > 0 Тогда
СведенияПоСпискуОКМТОВебСервис(ТаблицаОКТМОВебСервис, Результат);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция СведенияПоСпискуОКМТОЗагруженныеДанные(ТаблицаОКТМО, Результат)
Запрос = Новый Запрос;
Запрос.Параметры.Вставить("СписокОКТМО", ТаблицаОКТМО);
Запрос.Текст =
"ВЫБРАТЬ
| СписокОКТМО.ОКТМО КАК ОКТМО,
| СписокОКТМО.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО
|ПОМЕСТИТЬ СписокОКТМО
|ИЗ
| &СписокОКТМО КАК СписокОКТМО
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СписокОКТМО.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО,
| ДополнительныеСведения.КодСубъектаРФ КАК КодСубъектаРФ,
| ДополнительныеСведения.ПочтовыйИндекс КАК ПочтовыйИндекс,
| ДополнительныеСведения.ОКТМО КАК ОКТМО,
| ДополнительныеСведения.OKATO КАК OKATO,
| ДополнительныеСведения.КодУчасткаИФНСЮЛ КАК КодУчасткаИФНСЮЛ,
| ДополнительныеСведения.КодУчасткаИФНСФЛ КАК КодУчасткаИФНСФЛ,
| ДополнительныеСведения.КодИФНСЮЛ КАК КодИФНСЮЛ,
| ДополнительныеСведения.КодИФНСФЛ КАК КодИФНСФЛ,
| АдресныеОбъекты.Наименование КАК НаименованиеУровень0,
| АдресныеОбъекты.Сокращение КАК СокращениеУровень0,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень0,
| АдресныеОбъекты.Уровень КАК Уровень0,
| АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК РодительскийИдентификаторСвязи
|ПОМЕСТИТЬ АдресныеОбъекты0
|ИЗ
| СписокОКТМО КАК СписокОКТМО
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО (ДополнительныеСведения.ОКТМО = СписокОКТМО.ОКТМО)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (ДополнительныеСведения.Идентификатор = АдресныеОбъекты.ДополнительныеАдресныеСведения)
|ГДЕ
| ВЫБОР
| КОГДА АдресныеОбъекты.Уровень < 10
| ТОГДА АдресныеОбъекты.Уровень * 10
| ИНАЧЕ АдресныеОбъекты.Уровень
| КОНЕЦ < 70
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъекты0.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО,
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень1,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень1,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень1,
| АдресныеОбъекты.Уровень КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0
|ПОМЕСТИТЬ АдресныеОбъекты1
|ИЗ
| АдресныеОбъекты0 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъекты0.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО,
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень2,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень2,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень2,
| АдресныеОбъекты.Уровень КАК Уровень2,
| АдресныеОбъекты0.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъекты0.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъекты0.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты0.Уровень1 КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0
|ПОМЕСТИТЬ АдресныеОбъекты2
|ИЗ
| АдресныеОбъекты1 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъекты0.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО,
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень3,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень3,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень3,
| АдресныеОбъекты.Уровень КАК Уровень3,
| АдресныеОбъекты0.НаименованиеУровень2 КАК НаименованиеУровень2,
| АдресныеОбъекты0.СокращениеУровень2 КАК СокращениеУровень2,
| АдресныеОбъекты0.ИдентификаторУровень2 КАК ИдентификаторУровень2,
| АдресныеОбъекты0.Уровень2 КАК Уровень2,
| АдресныеОбъекты0.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъекты0.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъекты0.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты0.Уровень1 КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0
|ПОМЕСТИТЬ АдресныеОбъекты3
|ИЗ
| АдресныеОбъекты2 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъекты0.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО,
| ЕСТЬNULL(СвязиАдресныхОбъектов.МуниципальныйРодительскийИдентификатор, АдресныеОбъекты.МуниципальныйРодительскийИдентификатор) КАК РодительскийИдентификаторСвязи,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень4,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень4,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень4,
| АдресныеОбъекты.Уровень КАК Уровень4,
| АдресныеОбъекты0.НаименованиеУровень3 КАК НаименованиеУровень3,
| АдресныеОбъекты0.СокращениеУровень3 КАК СокращениеУровень3,
| АдресныеОбъекты0.ИдентификаторУровень3 КАК ИдентификаторУровень3,
| АдресныеОбъекты0.Уровень3 КАК Уровень3,
| АдресныеОбъекты0.НаименованиеУровень2 КАК НаименованиеУровень2,
| АдресныеОбъекты0.СокращениеУровень2 КАК СокращениеУровень2,
| АдресныеОбъекты0.ИдентификаторУровень2 КАК ИдентификаторУровень2,
| АдресныеОбъекты0.Уровень2 КАК Уровень2,
| АдресныеОбъекты0.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъекты0.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъекты0.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъекты0.Уровень1 КАК Уровень1,
| АдресныеОбъекты0.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъекты0.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъекты0.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъекты0.Уровень0 КАК Уровень0
|ПОМЕСТИТЬ АдресныеОбъекты4
|ИЗ
| АдресныеОбъекты3 КАК АдресныеОбъекты0
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъекты0.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АдресныеОбъекты0.КлючЗаписиОКТМО КАК КлючЗаписиОКТМО,
| ЕСТЬNULL(АдресныеОбъекты.Наименование, """") КАК НаименованиеУровень5,
| ЕСТЬNULL(АдресныеОбъекты.Сокращение, """") КАК СокращениеУровень5,
| АдресныеОбъекты.Идентификатор КАК ИдентификаторУровень5,
| АдресныеОбъекты.Уровень КАК Уровень5,
| АдресныеОбъектыИтог.НаименованиеУровень4 КАК НаименованиеУровень4,
| АдресныеОбъектыИтог.СокращениеУровень4 КАК СокращениеУровень4,
| АдресныеОбъектыИтог.ИдентификаторУровень4 КАК ИдентификаторУровень4,
| АдресныеОбъектыИтог.Уровень4 КАК Уровень4,
| АдресныеОбъектыИтог.НаименованиеУровень3 КАК НаименованиеУровень3,
| АдресныеОбъектыИтог.СокращениеУровень3 КАК СокращениеУровень3,
| АдресныеОбъектыИтог.ИдентификаторУровень3 КАК ИдентификаторУровень3,
| АдресныеОбъектыИтог.Уровень3 КАК Уровень3,
| АдресныеОбъектыИтог.НаименованиеУровень2 КАК НаименованиеУровень2,
| АдресныеОбъектыИтог.СокращениеУровень2 КАК СокращениеУровень2,
| АдресныеОбъектыИтог.ИдентификаторУровень2 КАК ИдентификаторУровень2,
| АдресныеОбъектыИтог.Уровень2 КАК Уровень2,
| АдресныеОбъектыИтог.НаименованиеУровень1 КАК НаименованиеУровень1,
| АдресныеОбъектыИтог.СокращениеУровень1 КАК СокращениеУровень1,
| АдресныеОбъектыИтог.ИдентификаторУровень1 КАК ИдентификаторУровень1,
| АдресныеОбъектыИтог.Уровень1 КАК Уровень1,
| АдресныеОбъектыИтог.НаименованиеУровень0 КАК НаименованиеУровень0,
| АдресныеОбъектыИтог.СокращениеУровень0 КАК СокращениеУровень0,
| АдресныеОбъектыИтог.ИдентификаторУровень0 КАК ИдентификаторУровень0,
| АдресныеОбъектыИтог.Уровень0 КАК Уровень0,
| АдресныеОбъекты0.OKATO КАК OKATO,
| АдресныеОбъекты0.ОКТМО КАК ОКТМО,
| АдресныеОбъекты0.КодУчасткаИФНСЮЛ КАК КодУчасткаИФНСЮЛ,
| АдресныеОбъекты0.КодУчасткаИФНСФЛ КАК КодУчасткаИФНСФЛ,
| АдресныеОбъекты0.КодИФНСЮЛ КАК КодИФНСЮЛ,
| АдресныеОбъекты0.КодИФНСФЛ КАК КодИФНСФЛ,
| АдресныеОбъекты0.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты0.ПочтовыйИндекс КАК ПочтовыйИндекс,
| АдресныеОбъекты0.КодСубъектаРФ КАК КодРегиона
|ИЗ
| АдресныеОбъекты4 КАК АдресныеОбъектыИтог
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО АдресныеОбъектыИтог.РодительскийИдентификаторСвязи = АдресныеОбъекты.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СвязиАдресныхОбъектов КАК СвязиАдресныхОбъектов
| ПО АдресныеОбъектыИтог.РодительскийИдентификаторСвязи = СвязиАдресныхОбъектов.Идентификатор
| ЛЕВОЕ СОЕДИНЕНИЕ АдресныеОбъекты0 КАК АдресныеОбъекты0
| ПО АдресныеОбъектыИтог.КлючЗаписиОКТМО = АдресныеОбъекты0.КлючЗаписиОКТМО";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
СписокСокращений = АдресныйКлассификаторПовтИсп.СписокСокращений();
ИменаУровней = ИменаУровнейАдресаПоКодуУровня();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СведенияПоОКТМО = НовыйСведенияПоОКТМО();
ЗаполнитьЗначенияСвойств(СведенияПоОКТМО, ВыборкаДетальныеЗаписи, "КодУчасткаИФНСЮЛ,
|КодУчасткаИФНСФЛ, КодИФНСЮЛ, КодИФНСФЛ, ПочтовыйИндекс, КодРегиона");
СведенияПоОКТМО.ОКТМО = ОКТМОИлиОКАТОСтрокой(ВыборкаДетальныеЗаписи.ОКТМО);
СведенияПоОКТМО.OKATO = ОКТМОИлиОКАТОСтрокой(ВыборкаДетальныеЗаписи.OKATO);
СведенияПоОКТМО.КодКЛАДР = КодКЛАДРСтрокой(ВыборкаДетальныеЗаписи.КодКЛАДР);
Для НомерСегмента = 0 По 5 Цикл
НомерСегментаСтрокой = XMLСтрока(НомерСегмента);
Уровень = ВыборкаДетальныеЗаписи["Уровень" + НомерСегментаСтрокой];
Если ЗначениеЗаполнено(Уровень) Тогда
ИмяПоля = ИменаУровней[Уровень];
СведенияПоОКТМО[ИмяПоля] = ВыборкаДетальныеЗаписи["НаименованиеУровень" + НомерСегментаСтрокой];
СведенияПоОКТМО[ИмяПоля + "ТипКраткий"] = ВыборкаДетальныеЗаписи["СокращениеУровень" + НомерСегментаСтрокой];
СведенияПоОКТМО[ИмяПоля + "Идентификатор"] = ВыборкаДетальныеЗаписи["ИдентификаторУровень" + НомерСегментаСтрокой];
ПолныеНаименованияСокращений = СписокСокращений.Получить(Строка(Уровень) + СведенияПоОКТМО[ИмяПоля + "ТипКраткий"]);
СведенияПоОКТМО[ИмяПоля + "ТипПолный"] = ПолныеНаименованияСокращений;
КонецЕсли;
КонецЦикла;
НаименованиеРегиона = ПолноеНаименованиеРегиона(СведенияПоОКТМО["Регион"], СведенияПоОКТМО["РегионТипКраткий"]);
СведенияПоОКТМО.КодМуниципальногоРайона = КодМуниципальногоРайона(СведенияПоОКТМО["МуниципальныйРайонТипКраткий"],
СведенияПоОКТМО.ОКТМО, ЭтоГородФедеральногоЗначения(НаименованиеРегиона));
СведенияПоОКТМО.КодПоселения = КодПоселения(СведенияПоОКТМО["ПоселениеТипКраткий"]);
Результат.Вставить(ВыборкаДетальныеЗаписи.КлючЗаписиОКТМО, СведенияПоОКТМО);
КонецЦикла;
Возврат Результат;
КонецФункции
Процедура СведенияПоСпискуОКМТОВебСервис(СписокОКТМО, Результат)
СписокСокращений = АдресныйКлассификаторПовтИсп.СписокСокращений();
Для каждого ЗаписьОКТМО Из СписокОКТМО Цикл
ТекстGETЗапроса = "selectByCode?code=%OKTMO%&codeType=OKTMO";
ТекстGETЗапроса = СтрЗаменить(ТекстGETЗапроса, "%OKTMO%", Формат(ЗаписьОКТМО.ОКТМО, "ЧГ=0"));
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
Если РезультатВебСервис.Отказ Тогда
Результат.Вставить(ЗаписьОКТМО.КлючЗаписиОКТМО, Неопределено);
Продолжить;
КонецЕсли;
СведенияПоОКТМО = НовыйСведенияПоОКТМО();
Для каждого СтрокаДанных Из РезультатВебСервис.Данные Цикл
СведенияПоОКТМО.OKATO = СокрЛП(СтрокаДанных.okato);
СведенияПоОКТМО.ОКТМО = СокрЛП(СтрокаДанных.oktmo);
СведенияПоОКТМО.КодИФНСФЛ = СокрЛП(СтрокаДанных.ifnsFlCode);
СведенияПоОКТМО.КодИФНСЮЛ = СокрЛП(СтрокаДанных.ifnsUlCode);
СведенияПоОКТМО.КодКЛАДР = СокрЛП(СтрокаДанных.codeKLADR);
СведенияПоОКТМО.КодУчасткаИФНСФЛ = СокрЛП(СтрокаДанных.ifnsFlAreaCode);
СведенияПоОКТМО.КодУчасткаИФНСЮЛ = СокрЛП(СтрокаДанных.ifnsUlAreaCode);
СведенияПоОКТМО.ПочтовыйИндекс = СокрЛП(СтрокаДанных.ZIPcode);
СведенияПоОКТМО.Регион = СокрЛП(СтрокаДанных.area);
СведенияПоОКТМО.РегионИдентификатор = ?(ПустаяСтрока(СтрокаДанных.areaId),
Неопределено, Новый УникальныйИдентификатор(СокрЛП(СтрокаДанных.areaId)));
СведенияПоОКТМО.РегионТипКраткий = СокрЛП(СтрокаДанных.areaType);
СведенияПоОКТМО.РегионТипПолный = СокрЛП(СписокСокращений.Получить("1" + СведенияПоОКТМО.РегионТипКраткий));
НаименованиеРегиона = ПолноеНаименованиеРегиона(СведенияПоОКТМО.Регион, СведенияПоОКТМО.РегионТипКраткий);
СведенияПоОКТМО.КодРегиона = АдресныйКлассификатор.КодРегионаПоНаименованию(НаименованиеРегиона);
СведенияПоОКТМО.МуниципальныйРайон = СокрЛП(СтрокаДанных.munDistrict);
СведенияПоОКТМО.МуниципальныйРайонИдентификатор = ?(ПустаяСтрока(СтрокаДанных.munDistrictId),
Неопределено, Новый УникальныйИдентификатор(СокрЛП(СтрокаДанных.munDistrictId)));
СведенияПоОКТМО.МуниципальныйРайонТипКраткий = СокрЛП(СтрокаДанных.munDistrictType);
СведенияПоОКТМО.МуниципальныйРайонТипПолный = СокрЛП(СписокСокращений.Получить("31" + СведенияПоОКТМО.МуниципальныйРайонТипКраткий));
СведенияПоОКТМО.КодМуниципальногоРайона = КодМуниципальногоРайона(СведенияПоОКТМО.МуниципальныйРайонТипКраткий,
СведенияПоОКТМО.ОКТМО, ЭтоГородФедеральногоЗначения(НаименованиеРегиона));
СведенияПоОКТМО.НаселенныйПункт = СокрЛП(СтрокаДанных.locality);
СведенияПоОКТМО.НаселенныйПунктИдентификатор = ?(ПустаяСтрока(СтрокаДанных.localityId),
Неопределено, Новый УникальныйИдентификатор(СокрЛП(СтрокаДанных.localityId)));
СведенияПоОКТМО.НаселенныйПунктТипКраткий = СокрЛП(СтрокаДанных.localityType);
СведенияПоОКТМО.НаселенныйПунктТипПолный = СокрЛП(СписокСокращений.Получить("6" + СведенияПоОКТМО.НаселенныйПунктТипКраткий));
СведенияПоОКТМО.Поселение = СокрЛП(СтрокаДанных.settlement);
СведенияПоОКТМО.ПоселениеИдентификатор = ?(ПустаяСтрока(СтрокаДанных.settlementId),
Неопределено, Новый УникальныйИдентификатор(СокрЛП(СтрокаДанных.settlementId)));
СведенияПоОКТМО.ПоселениеТипКраткий = СокрЛП(СтрокаДанных.settlementType);
СведенияПоОКТМО.ПоселениеТипПолный = СокрЛП(СписокСокращений.Получить("41" + СведенияПоОКТМО.ПоселениеТипКраткий));
СведенияПоОКТМО.КодПоселения = КодПоселения(СведенияПоОКТМО.ПоселениеТипКраткий);
СведенияПоОКТМО.Территория = СокрЛП(СтрокаДанных.territory);
СведенияПоОКТМО.ТерриторияИдентификатор = ?(ПустаяСтрока(СтрокаДанных.territoryId),
Неопределено, Новый УникальныйИдентификатор(СокрЛП(СтрокаДанных.territoryId)));
СведенияПоОКТМО.ТерриторияТипКраткий = СокрЛП(СтрокаДанных.territoryType);
СведенияПоОКТМО.ТерриторияТипПолный = СокрЛП(СписокСокращений.Получить("65" + СведенияПоОКТМО.ТерриторияТипКраткий));
Результат.Вставить(ЗаписьОКТМО.КлючЗаписиОКТМО, СведенияПоОКТМО);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция ОКТМОИлиОКАТОСтрокой(ОКТМОИлиОКАТО)
Результат = "";
Результат = Формат(ОКТМОИлиОКАТО,"ЧРГ=' '; ЧГ=0");
Если СтрДлина(Результат) = 7 Или СтрДлина(Результат) = 10 Тогда
Возврат "0" + Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолноеНаименованиеРегиона(НаименованиеРегиона, ТипРегиона)
Возврат СокрЛП(НаименованиеРегиона + " " + ТипРегиона);
КонецФункции
Функция ИменаУровнейАдресаПоКодуУровня()
Уровни = Новый Соответствие;
Уровни.Вставить(1, "Регион");
Уровни.Вставить(31, "МуниципальныйРайон");
Уровни.Вставить(41, "Поселение");
Уровни.Вставить(3, "МуниципальныйРайон");
Уровни.Вставить(4, "НаселенныйПункт");
Уровни.Вставить(5, "Территория");
Уровни.Вставить(6, "НаселенныйПункт");
Уровни.Вставить(65, "Территория");
Возврат Уровни;
КонецФункции
Функция НовыйСведенияПоОКТМО()
Результат = Новый Структура;
Результат.Вставить("КодРегиона", "");
Результат.Вставить("Регион", "");
Результат.Вставить("РегионТипПолный", "");
Результат.Вставить("РегионТипКраткий", "");
Результат.Вставить("РегионИдентификатор", Неопределено);
Результат.Вставить("МуниципальныйРайон", "");
Результат.Вставить("МуниципальныйРайонТипПолный ", "");
Результат.Вставить("МуниципальныйРайонТипКраткий", "");
Результат.Вставить("МуниципальныйРайонИдентификатор", Неопределено);
Результат.Вставить("КодМуниципальногоРайона", "");
Результат.Вставить("Поселение", "");
Результат.Вставить("ПоселениеТипПолный", "");
Результат.Вставить("ПоселениеТипКраткий", "");
Результат.Вставить("ПоселениеИдентификатор", Неопределено);
Результат.Вставить("КодПоселения", "");
Результат.Вставить("НаселенныйПункт", "");
Результат.Вставить("НаселенныйПунктТипПолный", "");
Результат.Вставить("НаселенныйПунктТипКраткий", "");
Результат.Вставить("НаселенныйПунктИдентификатор", Неопределено);
Результат.Вставить("Территория", "");
Результат.Вставить("ТерриторияТипПолный", "");
Результат.Вставить("ТерриторияТипКраткий", "");
Результат.Вставить("ТерриторияИдентификатор", Неопределено);
Результат.Вставить("ПочтовыйИндекс", 0);
Результат.Вставить("OKATO", "");
Результат.Вставить("ОКТМО", "");
Результат.Вставить("КодКЛАДР", "");
Результат.Вставить("КодИФНСФЛ", "");
Результат.Вставить("КодИФНСЮЛ", "");
Результат.Вставить("КодУчасткаИФНСФЛ", "");
Результат.Вставить("КодУчасткаИФНСЮЛ", "");
Возврат Результат;
КонецФункции
Функция КодКЛАДРСтрокой(Знач КодКЛАДР)
КодКЛАДР = Формат(КодКЛАДР, "ЧГ=0");
Если СтрДлина(КодКЛАДР) = 14 Тогда
КодКЛАДР = "0" + КодКЛАДР + "00";
ИначеЕсли СтрДлина(КодКЛАДР) = 15 Тогда
КодКЛАДР = КодКЛАДР + "00"; // добавляем признак актуальности
ИначеЕсли СтрДлина(КодКЛАДР) = 16 Тогда
КодКЛАДР = "0" + КодКЛАДР;
КонецЕсли;
Возврат КодКЛАДР;
КонецФункции
Функция КодМуниципальногоРайона(Знач ТипМуниципальногоРайона, ОКТМО, ЭтоГородФедеральногоЗначения)
КодМуниципальногоРайона = "";
Если СтрДлина(ОКТМО) > 3 Тогда
КодВторойСтупениКлассификации = Сред(ОКТМО, 3, 1);
Если КодВторойСтупениКлассификации = "3"
ИЛИ ЭтоГородФедеральногоЗначения И КодВторойСтупениКлассификации = "9" Тогда
КодМуниципальногоРайона = "3";
ИначеЕсли КодВторойСтупениКлассификации = "6" Тогда
КодМуниципальногоРайона = "1";
ИначеЕсли КодВторойСтупениКлассификации = "7" Тогда
КодМуниципальногоРайона = "2";
ИначеЕсли КодВторойСтупениКлассификации = "9" И НЕ ЭтоГородФедеральногоЗначения Тогда
КодМуниципальногоРайона = "4";
ИначеЕсли КодВторойСтупениКлассификации = "8" Тогда
КодМуниципальногоРайона = "4";
КонецЕсли;
Иначе
// АПК: 1297-выкл Данные адресного классификатора, не локализуются
Если СтрСравнить(ТипМуниципальногоРайона, "м.р-н") = 0 Тогда
КодМуниципальногоРайона = "1";
ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "г.о.") = 0 Тогда
КодМуниципальногоРайона = "2";
ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "вн.тер.") = 0
Или СтрСравнить(ТипМуниципальногоРайона, "вн.тер. г.") = 0 Тогда // @Non-NLS-1
КодМуниципальногоРайона = "3";
ИначеЕсли СтрСравнить(ТипМуниципальногоРайона, "мун. окр.") = 0 Тогда
КодМуниципальногоРайона = "4";
КонецЕсли;
// АПК: 1297-вкл
КонецЕсли;
Возврат КодМуниципальногоРайона;
КонецФункции
Функция КодПоселения(Знач ТипПоселения)
КодПоселения = "";
// АПК: 1297-выкл Данные адресного классификатора, не локализуются
Если СтрСравнить(ТипПоселения, "г. п.") = 0 Или СтрСравнить(ТипПоселения, "г.п.") = 0 Тогда // @Non-NLS-2
КодПоселения = "1";
ИначеЕсли СтрСравнить(ТипПоселения, "с.п.") = 0 Тогда
КодПоселения = "2";
ИначеЕсли СтрСравнить(ТипПоселения, "меж.тер.") = 0 Тогда
КодПоселения = "3";
ИначеЕсли СтрСравнить(ТипПоселения, "вн.р-н") = 0 Тогда
КодПоселения = "4";
КонецЕсли;
// АПК: 1297-вкл
Возврат КодПоселения;
КонецФункции
// Прочие
// Заполнение адреса по данным сервиса 1С.
//
Процедура ЗаполнитьАдресаПоПочтовомуИндексуКлассификатораСервис1С(Результат, Индекс)
ТекстGETЗапроса = "selectByCode?code=%ZipCode%&codeType=POSTAL_CODE";
ТекстGETЗапроса = СтрЗаменить(ТекстGETЗапроса, "%ZipCode%", Формат(Индекс, "ЧГ=0"));
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
Если РезультатВебСервис.Отказ Тогда
Возврат;
КонецЕсли;
Для каждого СтрокаДанных Из РезультатВебСервис.Данные Цикл
ПредставлениеТерриториальное = СтрокаДанных.valueReversed;
ПредставлениеМуниципальное = СтрокаДанных.munValueReversed;
Если ЗначениеЗаполнено(ПредставлениеМуниципальное) Тогда
НоваяСтрока = Результат.Данные.Добавить();
НоваяСтрока.Представление = ПредставлениеМуниципальное;
НоваяСтрока.Муниципальный = Истина;
НоваяСтрока.Идентификатор = СтрокаДанных.id;
КонецЕсли;
Если ПредставлениеТерриториальное <> ПредставлениеМуниципальное И ЗначениеЗаполнено(ПредставлениеТерриториальное) Тогда
НоваяСтрока = Результат.Данные.Добавить();
НоваяСтрока.Представление = ПредставлениеТерриториальное;
НоваяСтрока.Муниципальный = Ложь;
НоваяСтрока.Идентификатор = СтрокаДанных.id;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Заполнение данных для проверки версии по сервису 1С.
//
Процедура ЗаполнитьВерсиюПоставщикаДанныхСервис1С(Результат)
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис("ping", 7);
Если РезультатВебСервис.Отказ Тогда
Результат.Данные = Ложь;
Иначе
Результат.Данные = РезультатВебСервис.Данные;
КонецЕсли;
КонецПроцедуры
// Заполнение данных для автоподбора по данным сервиса 1С.
// Пример: autocomplete?text=test&parentGuid=g-u-i-d&base=30&limit=15.
//
Процедура ЗаполнитьСписокАвтоподбораЧастиАдресаСервис1С(ВариантыАдреса, КешПредставлений, Текст, Родитель, Количество,
ДополнительныеПараметры)
ТекстGETЗапроса = "autocomplete?text=" + КодироватьСтроку(Текст, СпособКодированияСтроки.КодировкаURL);
Если ЗначениеЗаполнено(Родитель) Тогда
ТекстGETЗапроса = ТекстGETЗапроса + "&parentGuid=" + Строка(Родитель);
КонецЕсли;
Если ЗначениеЗаполнено(Количество) Тогда
ТекстGETЗапроса = ТекстGETЗапроса + "&limit=" + Формат(Количество, "ЧГ=0");
КонецЕсли;
Если ДополнительныеПараметры.Свойство("Уровни") Тогда
ТекстGETЗапроса = ТекстGETЗапроса + "&levels=" + ДополнительныеПараметры.Уровни;
КонецЕсли;
РезультатВебСервис = ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
Если РезультатВебСервис.Отказ Или РезультатВебСервис.Количество() = 0 Или РезультатВебСервис.Данные = Неопределено Тогда
Возврат;
КонецЕсли;
ДобавлятьМуниципальныеАдреса = Истина;
ДобавлятьАдминистративноТерриториальныеАдреса = Истина;
Если ЗначениеЗаполнено(ДополнительныеПараметры.ТипАдреса) Тогда
ДобавлятьМуниципальныеАдреса = ЭтоМуниципальныйАдрес(ДополнительныеПараметры.ТипАдреса);
ДобавлятьАдминистративноТерриториальныеАдреса = ЭтоАдминистративноТерриториальныйАдрес(ДополнительныеПараметры.ТипАдреса);
КонецЕсли;
Для каждого Данные Из РезультатВебСервис.Данные Цикл
Если ВариантыАдреса.Количество() >= 20 Тогда
Возврат;
КонецЕсли;
ПредставлениеТерриториальное = Данные.valueReversed;
ПредставлениеМуниципальное = Данные.munValueReversed;
Если ДобавлятьМуниципальныеАдреса
И ЗначениеЗаполнено(Данные.munId)
И ЗначениеЗаполнено(ПредставлениеМуниципальное) Тогда
ДанныеМуниципальный = АдресДляСохраненияВБазе(Данные);
Сведения = СведенияОПодбираемомАдресе(ПредставлениеМуниципальное, Данные.id, Истина, Ложь, СтруктураВСтрокуJSON(ДанныеМуниципальный));
ДобавитьВариантАдреса(ВариантыАдреса, КешПредставлений, Сведения);
КонецЕсли;
Если ДобавлятьАдминистративноТерриториальныеАдреса
И ЗначениеЗаполнено(ПредставлениеТерриториальное)
И (Не ЗначениеЗаполнено(Данные.munId)
Или СтрСравнить(ПредставлениеТерриториальное, ПредставлениеМуниципальное) <> 0) Тогда
ДанныеТерриториальный = АдресДляСохраненияВБазе(Данные, Ложь);
Сведения = СведенияОПодбираемомАдресе(ПредставлениеТерриториальное, Данные.id, Ложь, Ложь, СтруктураВСтрокуJSON(ДанныеТерриториальный));
ДобавитьВариантАдреса(ВариантыАдреса, КешПредставлений, Сведения);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьВариантАдреса(ВариантыАдреса, КешПредставлений, Сведения, ДобавитьВНачалоСписка = Ложь)
// Такой адрес уже есть в списке выбора.
Если КешПредставлений[ВРег(Сведения.Представление)] <> Неопределено Тогда
Возврат;
КонецЕсли;
КешПредставлений[ВРег(Сведения.Представление)] = Истина;
Если Не Сведения.Муниципальный Тогда
Сведения.Представление = Новый ФорматированнаяСтрока(Сведения.Представление,, ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
КонецЕсли;
Если ДобавитьВНачалоСписка Тогда
ВариантыАдреса.Вставить(0, Сведения, Сведения.Представление);
Иначе
ВариантыАдреса.Добавить(Сведения, Сведения.Представление);
КонецЕсли;
КонецПроцедуры
Функция СведенияОПодбираемомАдресе(Знач Представление, Знач Идентификатор,
Знач Муниципальный, Знач ЗагруженныеДанные, Знач Данные = "",ПредлагатьЗагрузкуКлассификатора = Ложь)
Сведения = Новый Структура();
Сведения.Вставить("Отказ", Ложь);
Сведения.Вставить("Адрес", Данные);
Сведения.Вставить("Идентификатор", Идентификатор);
Сведения.Вставить("Представление", Представление);
Сведения.Вставить("Муниципальный", Муниципальный);
Сведения.Вставить("ЗагруженныеДанные", ЗагруженныеДанные);
Сведения.Вставить("ПредлагатьЗагрузкуКлассификатора", ПредлагатьЗагрузкуКлассификатора);
Возврат Сведения;
КонецФункции
// Заполнение актуальных данных адресного объекта или ориентира по данным сервиса 1С.
// Пример: GET /selectByCode?code=111111&codeType=ID.
//
Процедура ЗаполнитьАктуальныеАдресныеСведенияСервис1С(Результат, Идентификатор, ЭтоМуниципальныйАдрес = Истина)
РезультатВебСервис = АдресныеСведенияСервис1СПоКоду(Результат, Идентификатор, "ID");
Если РезультатВебСервис.Отказ Тогда
Возврат;
КонецЕсли;
Если РезультатВебСервис.Данные.Количество() > 0 Тогда
Результат.Данные = АдресДляСохраненияВБазе(РезультатВебСервис.Данные[0], ЭтоМуниципальныйАдрес);
КонецЕсли;
КонецПроцедуры
Функция АдресныеСведенияСервис1СПоКоду(Результат, Знач Идентификатор, Знач ИмяКода)
ШаблонЗапроса = "selectByCode?code=%1&codeType=%2";
ТекстGETЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, Строка(Идентификатор), ИмяКода);
Возврат ВыполнитьЗапросЧерезВебСервис(ТекстGETЗапроса);
КонецФункции
// Получает идентификаторы адреса через веб-сервис.
//
// Параметры:
// Результат - Структура:
// * ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - идентификатор адресного объекта (улицы, нас. пункта).
// * ИдентификаторДома - УникальныйИдентификатор - идентификатор дома адресного объекта.
// * Отказ - Булево - поставщик не доступен.
// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен иначе Неопределено.
// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен иначе Неопределено.
// АдресДляПроверки - Строка - строка XML контактной информации содержащая адрес.
//
Процедура ОпределитьИдентификаторыАдресаСервис1С(Результат, АдресДляПроверки)
Сервис = АдресныйКлассификаторПовтИсп.СервисКлассификатора1С();
СписокДляПроверки = Сервис.ФабрикаXDTO.Создать(Сервис.ФабрикаXDTO.Тип(ПространствоИмен(), "AddressList"));
ТипЭлементаСписка = СписокДляПроверки.Свойства().Получить("Item").Тип;
СписокЭлементовДляПроверки = СписокДляПроверки.Item; // СписокXDTO
ПроверяемыйАдрес = СписокЭлементовДляПроверки.Добавить(Сервис.ФабрикаXDTO.Создать(ТипЭлементаСписка));
ПроверяемыйАдрес.Levels = УровниКлассификатора();
Если ЭтоКонтактнаяИнформацияВXML(АдресДляПроверки) Тогда
АдресXDTO = ОбщегоНазначения.ОбъектXDTOИзСтрокиXML(АдресДляПроверки, Сервис.ФабрикаXDTO);
ПроверяемыйАдрес.Address = АдресXDTO.Состав.Состав;
Иначе
ВызватьИсключение НСтр("ru = 'Сведения о контактной информации были повреждены или некорректно заполнены'");
КонецЕсли;
КодЯзыка = ТекущийКодЛокализации();
РезультатПроверки = Сервис.Analyze(СписокДляПроверки, КодЯзыка, Ложь, Метаданные.Имя);
// Формируем структуру результата.
Если РезультатПроверки.Item.Количество() > 0 Тогда
Если РезультатПроверки.Item[0].Error.Количество() > 0 Тогда
Ошибка = РезультатПроверки.Item[0].Error[0];
Результат.КраткоеПредставлениеОшибки = Ошибка.Text;
Результат.ПодробноеПредставлениеОшибки = Ошибка.Suggestion;
Результат.Отказ = Истина;
КонецЕсли;
Если РезультатПроверки.Item[0].Variant.Количество() Тогда
Вариант = РезультатПроверки.Item[0].Variant[0];
Результат.ИдентификаторАдресногоОбъекта = Вариант.ID;
Результат.ИдентификаторДома = Вариант.HouseID;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Заполнение результата проверки адресного объекта по данным сервиса.
// Выполнение запроса может занимать 20 секунд.
//
Функция ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С(Знач АдресаДляПроверки, ЭтоУстановкаИдентификаторов = Истина)
Результат = РезультатИзВебСервиса();
Сервис = АдресныйКлассификаторПовтИсп.СервисКлассификатора1С(20);
ПрефиксВерсииЗапроса = ПрефиксВерсииЗапроса();
HTTPЗапрос = Новый HTTPЗапрос(ПрефиксВерсииЗапроса + "verify");
ИдентификаторЗапроса = Строка(Новый УникальныйИдентификатор);
ДанныеЗапроса = Новый Массив;
Для каждого КлючЗначение Из АдресаДляПроверки Цикл
Адрес = КлючЗначение.Значение;
АдресДляПроверки = Новый Структура();
АдресДляПроверки.Вставить("key", "_" + КлючЗначение.Ключ);
АдресДляПроверки.Вставить("typeToVerify", ?(ЭтоМуниципальныйАдрес(Адрес.addressType), "MUNICIPAL", "ADMINISTRATIVE"));
АдресДляПроверки.Вставить("addressToVerify", АдресДляПередачиВСервис(Адрес));
ДанныеЗапроса.Добавить(АдресДляПроверки);
КонецЦикла;
ДанныеДляЗапроса = Новый Структура("requests", ДанныеЗапроса);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.Заголовки.Вставить("X-1C-Request-UID", ИдентификаторЗапроса);
HTTPЗапрос.УстановитьТелоИзСтроки(СтруктураВСтрокуJSON(ДанныеДляЗапроса));
Попытка
РезультатПроверки = Сервис.ОтправитьДляОбработки(HTTPЗапрос);
Исключение
Результат.Отказ = Истина;
Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'При получении данных из веб-сервиса возникли проблемы.'");
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, Результат.ПодробноеПредставлениеОшибки);
Возврат Результат;
КонецПопытки;
Результат.Отказ = Ложь;
ПолученныеДанные = РезультатПроверки.ПолучитьТелоКакСтроку("UTF-8");
Если РезультатПроверки.КодСостояния = 200 Тогда
ДанныеПроверки = СтрокуJSONВСтруктуру(ПолученныеДанные);
Иначе
Если РезультатПроверки.КодСостояния = 400 Тогда
ПредставлениеОшибки = НСтр("ru = 'Проверка адреса не выполнена. Некоторые поля адреса содержат некорректные сведения.'");
Иначе
ПредставлениеОшибки = НСтр("ru = 'Проверка адреса не доступна по причине:
|- не подключена интернет-поддержка пользователей;
|- неполадки у интернет-провайдера;
|- подключение к серверу блокирует межсетевой экран,
| антивирусная программа или другое программное обеспечение;
|- веб-сервис отключен или на техническом обслуживании.'");
КонецЕсли;
Результат.КраткоеПредставлениеОшибки = ПредставлениеОшибки;
Результат.ПодробноеПредставлениеОшибки = ПредставлениеОшибки;
Результат.Отказ = Истина;
ЗаписатьОшибкуЗапросаКВебСервисуВЖурналРегистрации(ПолученныеДанные,
Результат, HTTPЗапрос.АдресРесурса + " X-1C-Request-UID:" + ИдентификаторЗапроса, РезультатПроверки.КодСостояния);
Возврат Результат;
КонецЕсли;
Если ДанныеПроверки = Неопределено Тогда
Возврат Результат;
КонецЕсли;
ОписаниеТипаЧисло = ОбщегоНазначения.ОписаниеТипаЧисло(10);
Для Каждого Проверка Из ДанныеПроверки Цикл
РезультатПроверки = РезультатПроверкиАдреса();
ЭлементПроверки = Проверка.Значение;
УникальныйКлюч = ОписаниеТипаЧисло.ПривестиЗначение(Сред(Проверка.Ключ, 2));
Если ЭлементПроверки.Свойство("status") Тогда
РезультатПроверки.АдресПроверен = Истина;
РезультатПроверки.АдресКорректный = (СтрСравнить(ЭлементПроверки.status, "COMPLETELY_VERIFIED") = 0);
Если СтрСравнить(ЭлементПроверки.status, "HISTORIC") = 0 Тогда
РезультатПроверки.АдресУстарел = Истина;
КонецЕсли;
КонецЕсли;
Если ЭлементПроверки.Свойство("errorMessage") И ЗначениеЗаполнено(ЭлементПроверки.errorMessage) Тогда
ОписаниеОшибки = Новый Структура("Ключ,Текст,Подсказка");
ОписаниеОшибки.Ключ = ЭлементПроверки.errorCode;
ОписаниеОшибки.Текст = ЭлементПроверки.errorMessage;
РезультатПроверки.Ошибки.Добавить(ОписаниеОшибки);
КонецЕсли;
Если ЭтоУстановкаИдентификаторов Или РезультатПроверки.АдресУстарел Тогда
Если ЭлементПроверки.Свойство("value") И ЗначениеЗаполнено(ЭлементПроверки.value) Тогда
Вариант = ОбщегоНазначения.СкопироватьРекурсивно(ЭлементПроверки.value);
ШаблонКонтактнойИнформации = ОписаниеНовойКонтактнойИнформации();
Для каждого СвойствоСтруктуры Из Вариант Цикл
Если ШаблонКонтактнойИнформации.Свойство(СвойствоСтруктуры.Ключ) И СвойствоСтруктуры.Значение = Неопределено Тогда
Вариант[СвойствоСтруктуры.Ключ] = ШаблонКонтактнойИнформации[СвойствоСтруктуры.Ключ];
КонецЕсли;
КонецЦикла;
РезультатПроверки.Варианты.Добавить(Вариант);
КонецЕсли;
КонецЕсли;
Результат.Данные.Вставить(УникальныйКлюч, РезультатПроверки);
КонецЦикла;
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// Структура:
// * Данные - Соответствие из КлючИЗначение:
// ** Ключ - Число - идентификатор адреса
// ** Значение - см. РезультатПроверкиАдреса
// * КраткоеПредставлениеОшибки - Строка
// * ПодробноеПредставлениеОшибки - Строка
// * Отказ - Булево
//
Функция РезультатИзВебСервиса()
Результат = Новый Структура;
Результат.Вставить("Отказ", Ложь);
Результат.Вставить("ПодробноеПредставлениеОшибки", "");
Результат.Вставить("КраткоеПредставлениеОшибки", "");
Результат.Вставить("Данные", Новый Соответствие);
Возврат Результат;
КонецФункции
Функция ПредставлениеДомаИСтроений(Знач НазваниеВладения, Знач Дом, Знач Корпус, Знач НазваниеСтроения, Знач Строение)
СписокСтроений = Новый Массив;
Шаблон = "%1 ""%2""";
Если ЗначениеЗаполнено(Дом) Тогда
СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, НРег(НазваниеВладения), Дом));
КонецЕсли;
Если ЗначениеЗаполнено(Корпус) Тогда
СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, "корпус", Корпус));
КонецЕсли;
Если ЗначениеЗаполнено(Строение) Тогда
СписокСтроений.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, НРег(НазваниеСтроения), Строение));
КонецЕсли;
Возврат СтрСоединить(СписокСтроений, ", ");
КонецФункции
Функция ДанныеУровняКорректные(Знач ИмяУровня, Знач АдресСтрока, Знач КакиеУровниПроверять)
Если КакиеУровниПроверять[ИмяУровня] <> Неопределено И ПустаяСтрока(АдресСтрока["НаименованиеУровень" + КакиеУровниПроверять[ИмяУровня]]) Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Функция КонструкторКодовАдреса()
Результат = Новый Структура;
КодыКЛАДР = Новый Структура;
КодыКЛАДР.Вставить("Регион");
КодыКЛАДР.Вставить("Округ");
КодыКЛАДР.Вставить("Район");
КодыКЛАДР.Вставить("Город");
КодыКЛАДР.Вставить("ВнутригородскойРайон");
КодыКЛАДР.Вставить("НаселенныйПункт");
КодыКЛАДР.Вставить("Улица");
Результат.Вставить("КодыКЛАДР", КодыКЛАДР);
Коды = Новый Структура;
Коды.Вставить("КодКЛАДР", "");
Коды.Вставить("Идентификатор", "");
Коды.Вставить("ИдентификаторДома", "");
Коды.Вставить("ОКАТО", "");
Коды.Вставить("ОКТМО", "");
Коды.Вставить("КодИФНСФЛ", "");
Коды.Вставить("КодИФНСЮЛ", "");
Коды.Вставить("КодУчасткаИФНСФЛ", "");
Коды.Вставить("КодУчасткаИФНСЮЛ", "");
Результат.Вставить("КодыАдреса", Коды);
Возврат Результат;
КонецФункции
Функция ПараметрыАутентификацииНаСайте() Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей");
Возврат МодульИнтернетПоддержкаПользователей.ДанныеАутентификацииПользователяИнтернетПоддержки();
Иначе
ВызватьИсключение НСтр("ru = 'Сервис интернет-поддержки пользователей не подключен.'");
КонецЕсли;
КонецФункции
Функция ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки() Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей");
Возврат МодульИнтернетПоддержкаПользователей.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки();
КонецЕсли;
Возврат Ложь;
КонецФункции
Процедура ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ВсеОшибки, Ключ, Текст, Подсказка = Неопределено)
Ошибка = Новый Структура("Ключ, Текст, Подсказка", Ключ, Текст, Подсказка);
ВсеОшибки.Добавить(Ошибка);
КонецПроцедуры
// Десериализует объект из XML.
//
Функция ДесериализацияАдресаXDTO(Строка)
ПередЧтениемXDTOКонтактнаяИнформация(Строка);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Строка);
// ожидается пространство имен "http://www.v8.1c.ru/ssl/contactinfo_ru".
Результат = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Возврат Результат
КонецФункции
// Преобразует XML. Обратная совместимость.
//
Функция ПередЧтениемXDTOКонтактнаяИнформация(ТекстXML)
Если СтрНайти(ТекстXML, "Адрес") = 0 Тогда
Возврат ТекстXML;
КонецЕсли;
Если СтрНайти(ТекстXML, "http://www.v8.1c.ru/ssl/contactinfo_ru") > 0 Тогда
Возврат ТекстXML;
КонецЕсли;
ТекстXML = СтрЗаменить(ТекстXML, "xsi:type=""АдресРФ""", "xmlns:rf=""http://www.v8.1c.ru/ssl/contactinfo_ru"" xsi:type=""rf:АдресРФ""");
ТекстXML = СтрЗаменить(ТекстXML, "<СубъектРФ", "<rf:СубъектРФ");
ТекстXML = СтрЗаменить(ТекстXML, "/СубъектРФ>", "/rf:СубъектРФ>");
ТекстXML = СтрЗаменить(ТекстXML, "<СубъектРФ/>", "<rf:СубъектРФ/>");
ТекстXML = СтрЗаменить(ТекстXML, "<Округ", "<rf:Округ");
ТекстXML = СтрЗаменить(ТекстXML, "/Округ>", "/rf:Округ>");
ТекстXML = СтрЗаменить(ТекстXML, "<Округ/>", "<rf:Округ/>");
ТекстXML = СтрЗаменить(ТекстXML, "<СвРайМО", "<rf:СвРайМО");
ТекстXML = СтрЗаменить(ТекстXML, "/СвРайМО>", "/rf:СвРайМО>");
ТекстXML = СтрЗаменить(ТекстXML, "<СвРайМО/>", "<rf:СвРайМО/>");
ТекстXML = СтрЗаменить(ТекстXML, "<Район", "<rf:Район");
ТекстXML = СтрЗаменить(ТекстXML, "/Район>", "/rf:Район>");
ТекстXML = СтрЗаменить(ТекстXML, "</Район>", "</rf:Район>");
ТекстXML = СтрЗаменить(ТекстXML, "<Город", "<rf:Город");
ТекстXML = СтрЗаменить(ТекстXML, "/Город>", "/rf:Город>");
ТекстXML = СтрЗаменить(ТекстXML, "<Город/>", "<rf:Город/>");
ТекстXML = СтрЗаменить(ТекстXML, "ВнутригРайон", "rf:ВнутригРайон");
ТекстXML = СтрЗаменить(ТекстXML, "НаселПункт", "rf:НаселПункт");
ТекстXML = СтрЗаменить(ТекстXML, "<Улица", "<rf:Улица");
ТекстXML = СтрЗаменить(ТекстXML, "/Улица>", "/rf:Улица>");
ТекстXML = СтрЗаменить(ТекстXML, "<Улица/>", "<rf:Улица/>");
ТекстXML = СтрЗаменить(ТекстXML, "ОКТМО", "rf:ОКТМО");
ТекстXML = СтрЗаменить(ТекстXML, "ОКАТО", "rf:ОКАТО");
ТекстXML = СтрЗаменить(ТекстXML, "ДопАдрЭл", "rf:ДопАдрЭл");
ТекстXML = СтрЗаменить(ТекстXML, "<Номер", "<rf:Номер");
ТекстXML = СтрЗаменить(ТекстXML, "/Номер>", "/rf:Номер>");
ТекстXML = СтрЗаменить(ТекстXML, "<Номер/>", "<rf:Номер/>");
ТекстXML = СтрЗаменить(ТекстXML, "<Местоположение", "<rf:Местоположение");
ТекстXML = СтрЗаменить(ТекстXML, "/Местоположение>", "/rf:Местоположение>");
ТекстXML = СтрЗаменить(ТекстXML, "<Местоположение/>", "<rf:Местоположение/>");
Возврат ТекстXML;
КонецФункции
// Определяет словарь наименований полей адреса в соответствии с уровнем.
//
Функция СловарьКлючейПолейАдресВСоответствииСУровнем()
Словарь = Новый Соответствие;
Словарь.Вставить(1, "Area");
Словарь.Вставить(3, "District");
Словарь.Вставить(31, "MunDistrict");
Словарь.Вставить(4, "City");
Словарь.Вставить(41, "Settlement");
Словарь.Вставить(5, "CityDistrict");
Словарь.Вставить(6, "Locality");
Словарь.Вставить(65, "Territory");
Словарь.Вставить(7, "Street");
Возврат Словарь;
КонецФункции
Процедура ЗаполнитьПоляВСоответствииСУровнемАдреса(Адрес, Выборка, Суффикс, СловарьИменПолей, Муниципальный = Ложь)
Если ЗначениеЗаполнено(Выборка["НаименованиеУровень" + Суффикс]) Тогда
Идентификатор = Выборка["ИдентификаторУровень" + Суффикс];
ИмяУровня = СловарьИменПолей[Выборка["Уровень" + Суффикс]];
Адрес[ИмяУровня] = Выборка["НаименованиеУровень" + Суффикс];
Адрес[ИмяУровня + "Type"] = Выборка["СокращениеУровень" + Суффикс];
Адрес[ИмяУровня + "Id"] = ?(ЗначениеЗаполнено(Идентификатор), Новый УникальныйИдентификатор(Идентификатор), "");
Адрес.ID = Адрес[ИмяУровня + "Id"];
КонецЕсли;
КонецПроцедуры
// Возвращает строку для поиска в операторе ПОДОБНО.
//
Функция ЗамаскироватьСпецсимволыПодобия(Текст)
Результат = Текст;
Спецсимвол = "\";
Служебные = "%_[]^" + Спецсимвол;
Для Индекс = 1 По СтрДлина(Служебные) Цикл
Символ = Сред(Служебные, Индекс, 1);
Результат = СтрЗаменить(Результат, Символ, Спецсимвол + Символ);
КонецЦикла;
Возврат Результат;
КонецФункции
// Конструктор полей структуры для описания ошибок.
//
Функция СтруктураОписанияОшибкиПоставщика(Описание = Неопределено, ИнформацияОбОшибке = Неопределено)
Если Описание = Неопределено Тогда
Описание = Новый Структура;
КонецЕсли;
Описание.Вставить("Отказ", ИнформацияОбОшибке <> Неопределено);
Описание.Вставить("ПодробноеПредставлениеОшибки");
Описание.Вставить("КраткоеПредставлениеОшибки");
Если ИнформацияОбОшибке = Неопределено Тогда
Описание.ПодробноеПредставлениеОшибки = НСтр("ru = 'Информация об ошибке отсутствует'");
Возврат Описание;
КонецЕсли;
Описание.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
Текст = СокрЛП(КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
Если ТипЗнч(ИнформацияОбОшибке.Причина) = Тип("ИнформацияОбОшибке") Тогда
Если ИнформацияОбОшибке.Причина.Причина <> Неопределено Тогда
ОписаниеОшибкиДляПоиска = ВРег(ИнформацияОбОшибке.Причина.Причина.Описание);
ПозицияНачало = СтрНайти(ОписаниеОшибкиДляПоиска , "<FAULTSTRING>");
Если ПозицияНачало > 0 Тогда
ПозицияОкончание = СтрНайти(ОписаниеОшибкиДляПоиска , "</FAULTSTRING>");
Текст = Сред(ИнформацияОбОшибке.Причина.Причина.Описание, ПозицияНачало + 13,
ПозицияОкончание - ПозицияНачало - 13);
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Отрезаем клиентский текст
Позиция = СтрНайти(Текст, ": ");
Если Позиция > 0 Тогда
Текст = СокрЛ(Сред(СтрЗаменить(Текст, Символы.ПС, ""), Позиция + 1));
КонецЕсли;
// Отрезаем серверный текст
Пока Истина Цикл
Позиция = СтрНайти(Текст, "}:");
Если Позиция = 0 Тогда
Прервать;
КонецЕсли;
Текст = СокрЛ(Сред(Текст, Позиция + 2));
КонецЦикла;
Описание.КраткоеПредставлениеОшибки = Текст;
Возврат Описание;
КонецФункции
Процедура ОбработатьОбщепринятыеСокращения(ДоступныеУровни)
Фильтр = Новый Структура("Уровень", 0);
НераспознанныеСтроки = ДоступныеУровни.НайтиСтроки(Фильтр);
Для каждого НераспознаннаяЧастьАдреса Из НераспознанныеСтроки Цикл
Если (ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "МОСКВА"
ИЛИ ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "САНКТ-ПЕТЕРБУРГ")
И ПустаяСтрока(НераспознаннаяЧастьАдреса.Сокращение) Тогда
НераспознаннаяЧастьАдреса.Сокращение = "г";
НераспознаннаяЧастьАдреса.Значение = НераспознаннаяЧастьАдреса.Наименование + " " + НераспознаннаяЧастьАдреса.Сокращение;
ИначеЕсли ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "КОРП" Или ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "КОРП." Тогда
НераспознаннаяЧастьАдреса.Наименование = "Корпус";
ИначеЕсли ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "КВ" Или ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "КВ." Тогда
НераспознаннаяЧастьАдреса.Наименование = "Квартира";
ИначеЕсли ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "ОФ" Или ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "ОФ." Тогда
НераспознаннаяЧастьАдреса.Наименование = "Квартира";
ИначеЕсли ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "ПОМЕЩ" Или ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "ПОМЕЩ." Тогда
НераспознаннаяЧастьАдреса.Наименование = "Квартира";
ИначеЕсли ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "Д" Или ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "Д." Тогда
НераспознаннаяЧастьАдреса.Наименование = "Дом";
ИначеЕсли ВРЕГ(НераспознаннаяЧастьАдреса.Наименование) = "ЛИТЕР" Тогда
НераспознаннаяЧастьАдреса.Наименование = "Литера";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПерваяБукваЗаглавная(Строка)
Возврат ВРег(Лев(Строка, 1)) + Сред(НРег(Строка), 2); // Использовать ТРег нельзя.
КонецФункции
#Область СлужебныйПрограммныйИнтерфейсФоновыеОперацииСКлассификатором
// Обработчик фоновой загрузки.
//
Процедура ФоновоеЗаданиеЗагрузкиКлассификатораАдресов(Параметры, АдресРезультата) Экспорт
ЗагрузитьКлассификаторАдресов(Параметры[0], Параметры[1], Параметры[2]);
КонецПроцедуры
// Обработчик фоновой загрузки с сайта.
//
Процедура ФоновоеЗаданиеЗагрузкиКлассификатораАдресовССайта(Параметры, АдресРезультата) Экспорт
ЗагрузитьКлассификаторАдресовССайта(Параметры[1], Параметры[0]);
КонецПроцедуры
// Обработчик фоновой очистки
//
Процедура ФоновоеЗаданиеОчисткиКлассификатораАдресов(Параметры, АдресРезультата) Экспорт
ОчиститьКлассификаторАдресов(Параметры[0]);
КонецПроцедуры
#КонецОбласти
#Область ПреобразованиеТиповДанныхАдресногоКлассификатора
// Преобразует ДвоичныеДанные в УникальныйИдентификатор.
// Выполняет обратное действие для функции УникальныйИдентификаторВДвоичныеДанные.
//
// Параметры:
// ДвоичныеДанные - ДвоичныеДанные - исходные данные.
//
// Возвращаемое значение:
// УникальныйИдентификатор - результат преобразования.
//
Функция УникальныйИдентификаторИзДвоичныхДанных(ДвоичныеДанные)
// Двоичные -> hex
ТипXDTOДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "hexBinary");
ЗначениеHEX = ФабрикаXDTO.Создать(ТипXDTOДвоичныеДанные, ДвоичныеДанные);
// hex -> UUID
СтрокаУИД = ЗначениеHEX.ЛексическоеЗначение;
Возврат Новый УникальныйИдентификатор( Сред(СтрокаУИД, 1, 8) + "-" + Сред(СтрокаУИД, 9, 4) + "-" + Сред(СтрокаУИД, 13, 4) + "-" + Сред(СтрокаУИД, 17, 4) + "-" + Сред(СтрокаУИД, 21) );
КонецФункции
// Преобразует строку base64 в УникальныйИдентификатор.
//
// Параметры:
// Строка - Строка - регистрозависимые исходные данные.
//
// Возвращаемое значение:
// УникальныйИдентификатор - возвращаемый идентификатор зависит от регистра букв, передавай строки.
//
Функция УникальныйИдентификаторИзСтроки64(Строка)
Возврат УникальныйИдентификаторИзДвоичныхДанных( ДвоичныеДанныеИзСтроки(Строка) );
КонецФункции
// Преобразует строку в ДвоичныеДанные.
//
// Параметры:
// Строка - Строка - исходные данные.
//
// Возвращаемое значение:
// ДвоичныеДанные - результат преобразования.
//
Функция ДвоичныеДанныеИзСтроки(Строка)
Возврат XMLЗначение(Тип("ДвоичныеДанные"), Строка);
КонецФункции
#КонецОбласти
#Область ПереносУстаревшегоКлассификатора
Функция ЗаполненныеРегионыУстаревшегоКлассификатора()
Если ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты) Тогда
УстановитьПривилегированныйРежим(Истина);
Если ПустаяСтрока(Константы.ИсточникДанныхАдресногоКлассификатора.Получить()) Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
// Проверяет есть ли хоть одна запись КЛАДР (исключая записи о регионах) требующая переноса.
//
Функция УстаревшийКлассификаторСодержитСведения()
Если ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты) Тогда
УстановитьПривилегированныйРежим(Истина);
Если ПустаяСтрока(Константы.ИсточникДанныхАдресногоКлассификатора.Получить()) Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
#КонецОбласти
#Область ПрочиеСлужебныеПроцедурыИФункции
// Имя событие для записи в журнал регистрации.
//
// Возвращаемое значение:
// Строка - событие журнала регистрации
//
Функция СобытиеЖурналаРегистрации() Экспорт
Возврат НСтр("ru = 'Адресный классификатор'", ОбщегоНазначения.КодОсновногоЯзыка());
КонецФункции
// Разделяет исходный текст на наименование и сокращение.
// Сокращением считается последнее слово, отделенное пробельным символом.
//
// Параметры:
// Название - Строка - полное название, например "Москва г".
//
// Возвращаемое значение:
// Структура:
// * Наименование - Строка - наименование, например "Москва". Если сокращение выделить не удалось, то исходное название.
// * Сокращение - Строка - сокращение, например "г". Если сокращение выделить не удалось, то пустая строка.
//
Функция НаименованиеИСокращение(Название, ЭтоРегион = Ложь) Экспорт
Результат = НовыйНаименованиеИСокращение();
ТекстПоиска = СокрП(Название);
Если ЭтоРегион И НаименованиеРегионаБезТипа(Название) Тогда
Результат.Наименование = Название;
Возврат Результат;
КонецЕсли;
ТекстВерхнийРегистр = ВРег(ТекстПоиска);
Если СтрЗаканчиваетсяНа(ТекстВерхнийРегистр, "ТЕР. СНТ")
Или СтрЗаканчиваетсяНа(ТекстВерхнийРегистр, "ТЕР. ДНТ") Тогда
Результат.Сокращение = Прав(Название, 8);
Результат.Наименование = Лев(Название, СтрДлина(Название) - 9);
Возврат Результат;
КонецЕсли;
Позиция = СтрДлина(ТекстПоиска);
Пока Позиция > 0 Цикл
Если ПустаяСтрока(Сред(ТекстПоиска, Позиция, 1)) Тогда
Прервать;
КонецЕсли;
Позиция = Позиция - 1;
КонецЦикла;
Если Позиция = 0 Тогда
Результат.Наименование = ТекстПоиска;
Результат.Сокращение = "";
Иначе
Результат.Наименование = СокрП(Лев(ТекстПоиска, Позиция));
Результат.Сокращение = Сред(ТекстПоиска, Позиция + 1);
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращаемое значение:
// Структура:
// * Наименование - Строка
// * Сокращение - Строка
//
Функция НовыйНаименованиеИСокращение()
Результат = Новый Структура;
Результат.Вставить("Наименование", "");
Результат.Вставить("Сокращение", "");
Возврат Результат;
КонецФункции
// Набор уровней для запросов адресного классификатора.
//
// Возвращаемое значение:
// ФиксированныйМассив - набор числовых уровней.
//
Функция УровниКлассификатора()
Уровни = Новый Массив;
Уровни.Добавить(1);
Уровни.Добавить(2);
Уровни.Добавить(3);
Уровни.Добавить(5);
Уровни.Добавить(4);
Уровни.Добавить(6);
Уровни.Добавить(7);
Уровни.Добавить(90);
Уровни.Добавить(91);
Возврат Новый ФиксированныйМассив(Уровни);
КонецФункции
Функция ЭтоМуниципальныйАдрес(ТипАдреса)
Возврат СтрСравнить(ТипАдреса, МуниципальныйАдрес()) = 0;
КонецФункции
Функция ЭтоАдминистративноТерриториальныйАдрес(ТипАдреса)
Возврат СтрСравнить(ТипАдреса, АдминистративноТерриториальныйАдрес()) = 0;
КонецФункции
Функция ИменаУровнейАдреса(ТипАдреса, ВключатьУлицу)
Уровни = Новый Массив;
Уровни.Добавить("Area");
Если ТипАдреса = "ЕАЭС" Тогда
Уровни.Добавить("District");
Уровни.Добавить("City");
Уровни.Добавить("Locality");
Иначе
Если ЭтоМуниципальныйАдрес(ТипАдреса) Тогда
Уровни.Добавить("MunDistrict");
Уровни.Добавить("Settlement");
Иначе
Уровни.Добавить("District");
КонецЕсли;
Уровни.Добавить("City");
Уровни.Добавить("CityDistrict");
Уровни.Добавить("Locality");
Уровни.Добавить("Territory");
Если ВключатьУлицу Тогда
Уровни.Добавить("Street");
КонецЕсли;
КонецЕсли;
Возврат Уровни;
КонецФункции
Функция ОсновнаяСтрана()
Возврат "Россия";
КонецФункции
Функция ПрефиксВерсииЗапроса() Экспорт
Возврат "rest/v3/";
КонецФункции
// Возвращает информацию из классификатора субъектов РФ.
//
// Возвращаемое значение:
// ТаблицаЗначений - поставляемые данные. Колонки:
// * КодСубъектаРФ - Число - код классификатора субъекта, например 77 для Москвы.
// * Наименование - Строка - наименование субъекта по классификатору. Например "Московская".
// * Сокращение - Строка - наименование субъекта по классификатору. Например "Обл".
// * ПочтовыйИндекс - Число - индекс региона. Если 0 - то неопределено.
// * ПочтовыйИндекс - Число - индекс региона. Если 0 - то неопределено.
// * Идентификатор - УникальныйИдентификатор - идентификатор адресного объекта.
//
Функция СведенияОСубъектахРФ()
Возврат РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
КонецФункции
Функция ПредставлениеРегиона(Наименование, Сокращение)
Если СтрСравнить(Сокращение, "Респ") = 0 Тогда
Возврат СоединитьНаименованиеИТипАдресногоОбъекта(Наименование, "Республика");
ИначеЕсли СтрСравнить(Сокращение, "обл") = 0 Тогда
Возврат СоединитьНаименованиеИТипАдресногоОбъекта(Наименование, "область", Истина);
ИначеЕсли СтрСравнить(Сокращение, "г") = 0 Тогда
Возврат СоединитьНаименованиеИТипАдресногоОбъекта("г.", Наименование);
КонецЕсли;
Возврат СоединитьНаименованиеИТипАдресногоОбъекта(Наименование, Сокращение, Истина);
КонецФункции
// Извлекает список домов полученного из регистра сведения описания и добавляет их в список значений.
//
// Параметры:
// СтрокаСоСпискомДомов - Строка - описание списка домов из регистра сведения.
// СтрокаПоиска - Строка - строка отбора.
// ВариантыДомов - СписокЗначений - список домов.
//
Процедура ИзвлечьСписокДомов(СтрокаСоСпискомДомов, СтрокаПоиска, ВариантыДомов, Запись, ТочноеСовпадение)
ТипЧисло = Новый ОписаниеТипов("Число");
МассивДомов = СтрРазделить(СтрокаСоСпискомДомов, Символы.Таб, Ложь);
НаименованиеЗданийИСтроений = АдресныйКлассификаторПовтИсп.НаименованиеВладенийИСтроений();
Для каждого Дом Из МассивДомов Цикл
НомерДома = СтрРазделить(Сред(Дом, 25), "~", Истина);
ОписаниеДома = ОписаниеДомаИЗемельногоУчастка();
ОписаниеДома.Идентификатор = УникальныйИдентификаторИзСтроки64(Лев(Дом, 24));
Если ЗначениеЗаполнено(НомерДома[0]) Тогда
ОписаниеДома.ВидВладения = ТипЧисло.ПривестиЗначение(Лев(НомерДома[0], 1));
ОписаниеДома.Дом = Сред(НомерДома[0], 2);
ДомЧислом = Формат(НомерДомаЧислом(ОписаниеДома.Дом), "ЧЦ=4; ЧН=; ЧВН=; ЧГ=0; ЧФ=1Ч");
Если ЗначениеЗаполнено(ОписаниеДома.ВидВладения) Тогда
ОписаниеДома.НазваниеВладения = НаименованиеЗданийИСтроений.Владения.Получить(ОписаниеДома.ВидВладения);
КонецЕсли;
Иначе
ДомЧислом = "10000";
КонецЕсли;
ОписаниеДома.Индекс = Формат(Запись.ПочтовыйИндекс, "ЧГ=0");
ОписаниеДома.ОКТМО = Формат(Запись.ОКТМО, "ЧГ=0");
ОписаниеДома.ОКАТО = Формат(Запись.ОКАТО, "ЧГ=0");
ОписаниеДома.КодИФНСФЛ = Формат(Запись.КодИФНСФЛ, "ЧГ=0");
ОписаниеДома.КодИФНСЮЛ = Формат(Запись.КодИФНСЮЛ, "ЧГ=0");
ОписаниеДома.КодУчасткаИФНСФЛ = Формат(Запись.КодУчасткаИФНСФЛ, "ЧГ=0");
ОписаниеДома.КодУчасткаИФНСЮЛ = Формат(Запись.КодУчасткаИФНСЮЛ, "ЧГ=0");
ОписаниеДома.КодКЛАДР = Формат(Запись.КодКЛАДР, "ЧГ=0");
Если НомерДома.Количество() > 1 Тогда
ОписаниеДома.Корпус = НомерДома[1];
КорпусЧислом = Формат(НомерДомаЧислом(ОписаниеДома.Корпус), "ЧЦ=4; ЧН=; ЧВН=; ЧГ=0; ЧФ=1Ч");
Если НомерДома.Количество() > 2 Тогда
ОписаниеДома.ВидСтроения = ТипЧисло.ПривестиЗначение(НомерДома[2]);
Если НомерДома.Количество() > 3 Тогда
ОписаниеДома.Строение = НомерДома[3];
КонецЕсли;
КонецЕсли;
Иначе
КорпусЧислом = "10000";
КонецЕсли;
ОписаниеДома.ДомЧислом = ТипЧисло.ПривестиЗначение(ДомЧислом + КорпусЧислом);
Если ЗначениеЗаполнено(СтрокаПоиска) Тогда
Если ТочноеСовпадение Тогда
Если СтрСравнить(ОписаниеДома.Дом, СтрокаПоиска) = 0 Или СтрСравнить(ОписаниеДома.Строение, СтрокаПоиска) = 0 Тогда
ДобавитьИнформациюОДоме(ВариантыДомов, ОписаниеДома, НаименованиеЗданийИСтроений, СтрокаПоиска);
КонецЕсли;
Иначе
Если СтрНачинаетсяС(ОписаниеДома.Строение, СтрокаПоиска) Или СтрНачинаетсяС(ОписаниеДома.Дом, СтрокаПоиска) Или (ПустаяСтрока(ОписаниеДома.Дом) И СтрНачинаетсяС(ОписаниеДома.Корпус, СтрокаПоиска)) Тогда
ДобавитьИнформациюОДоме(ВариантыДомов, ОписаниеДома, НаименованиеЗданийИСтроений, СтрокаПоиска);
КонецЕсли;
КонецЕсли;
Иначе
ДобавитьИнформациюОДоме(ВариантыДомов, ОписаниеДома, НаименованиеЗданийИСтроений);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ОписаниеДомаИЗемельногоУчастка()
ОписаниеДома = Новый Структура;
ОписаниеДома.Вставить("ДомЧислом");
ОписаниеДома.Вставить("Дом");
ОписаниеДома.Вставить("Корпус");
ОписаниеДома.Вставить("Строение");
ОписаниеДома.Вставить("ВидСтроения", 0);
ОписаниеДома.Вставить("ВидВладения", 0);
ОписаниеДома.Вставить("НазваниеВладения");
ОписаниеДома.Вставить("НазваниеСтроения", "");
ОписаниеДома.Вставить("Идентификатор");
ОписаниеДома.Вставить("Индекс", "");
ОписаниеДома.Вставить("ОКТМО", "");
ОписаниеДома.Вставить("ОКАТО", "");
ОписаниеДома.Вставить("КодИФНСФЛ", "");
ОписаниеДома.Вставить("КодИФНСЮЛ", "");
ОписаниеДома.Вставить("КодУчасткаИФНСФЛ", "");
ОписаниеДома.Вставить("КодУчасткаИФНСЮЛ", "");
ОписаниеДома.Вставить("КодКЛАДР", "");
Возврат ОписаниеДома;
КонецФункции
Процедура ДобавитьИнформациюОДоме(ВариантыДомов, ОписаниеДома, НаименованиеЗданийИСтроений, СтрокаПоиска = "")
Владение = Новый Структура;
Владение.Вставить("ВидВладения", ОписаниеДома.НазваниеВладения);
Владение.Вставить("НомерВладения", ОписаниеДома.Дом);
НомерДомаИСтроения = ОписаниеДомаИСтроения();
НомерДомаИСтроения.Дом = Владение;
Если ЗначениеЗаполнено(ОписаниеДома.Дом) Тогда
Если ПустаяСтрока(СтрокаПоиска) Или Не СтрНачинаетсяС(ОписаниеДома.Дом, СтрокаПоиска) Тогда
ТекстПроДом = ОписаниеДома.НазваниеВладения + " " + ОписаниеДома.Дом;
Иначе
ТекстПроДом = СтроковыеФункции.ФорматированнаяСтрока("%1 <span style='color:%2; font:%3'>%4</span>%5",
ОписаниеДома.НазваниеВладения, "РезультатУспехЦвет", "ВажнаяНадписьШрифт", СтрокаПоиска, Сред(ОписаниеДома.Дом, СтрДлина(СтрокаПоиска) + 1));
КонецЕсли;
Иначе
ТекстПроДом = "";
КонецЕсли;
Если ЗначениеЗаполнено(ОписаниеДома.Корпус) Тогда
Если ПустаяСтрока(СтрокаПоиска) Или Не СтрНачинаетсяС(ОписаниеДома.Корпус, СтрокаПоиска) Тогда
ТекстПроСтроения = "корпус" + " " + ОписаниеДома.Корпус;
Иначе
ТекстПроСтроения = СтроковыеФункции.ФорматированнаяСтрока("корпус <span style='color:%1; font:%2'>%3</span>%4",
"РезультатУспехЦвет", "ВажнаяНадписьШрифт", СтрокаПоиска, Сред(ОписаниеДома.Корпус, СтрДлина(СтрокаПоиска) + 1));
КонецЕсли;
Корпус = Новый Структура;
Корпус.Вставить("ВидКорпуса", "Корпус");
Корпус.Вставить("НомерКорпуса", ОписаниеДома.Корпус);
НомерДомаИСтроения.Вставить("Корпус", Корпус);
Иначе
ТекстПроСтроения = "";
КонецЕсли;
Если ЗначениеЗаполнено(ОписаниеДома.Строение) Тогда
НазваниеСтроения = ?(ПустаяСтрока(ОписаниеДома.НазваниеСтроения),
НРег(НаименованиеЗданийИСтроений.Строения.Получить(ОписаниеДома.ВидСтроения)), ОписаниеДома.НазваниеСтроения);
Разделитель = ?(ПустаяСтрока(ТекстПроСтроения), "", ", ");
Если ЗначениеЗаполнено(СтрокаПоиска) И СтрНачинаетсяС(ОписаниеДома.Строение, СтрокаПоиска) Тогда
НайденныйФрагментСтроения = СтроковыеФункции.ФорматированнаяСтрока("%1 <span style='color:%2; font:%3'>%4</span>%5",
Разделитель + НазваниеСтроения, "РезультатУспехЦвет", "ВажнаяНадписьШрифт", СтрокаПоиска, Сред(ОписаниеДома.Строение, СтрДлина(СтрокаПоиска) + 1));
Иначе
НайденныйФрагментСтроения = Разделитель + НазваниеСтроения + " " + ОписаниеДома.Строение;
КонецЕсли;
ТекстПроСтроения = Новый ФорматированнаяСтрока(ТекстПроСтроения, НайденныйФрагментСтроения);
Строение = Новый Структура;
Строение.Вставить("ВидСтроения", НазваниеСтроения);
Строение.Вставить("НомерСтроения", ОписаниеДома.Строение);
НомерДомаИСтроения.Вставить("Строение", Строение);
КонецЕсли;
Если ЗначениеЗаполнено(ТекстПроДом) Тогда
Разделитель = ?(ПустаяСтрока(ТекстПроСтроения), "", ", ");
ТекстПроДомФормат = Новый ФорматированнаяСтрока(ТекстПроДом, Разделитель, ТекстПроСтроения);
Иначе
ТекстПроДомФормат = ТекстПроСтроения;
КонецЕсли;
ЗаполнитьЗначенияСвойств(НомерДомаИСтроения, ОписаниеДома,
"Идентификатор, Индекс, ОКТМО, ОКАТО, КодИФНСФЛ, КодИФНСЮЛ, КодУчасткаИФНСФЛ, КодУчасткаИФНСЮЛ, КодКЛАДР");
ИнформацияОДоме = ВариантыДомов.Добавить();
ЗаполнитьЗначенияСвойств(ИнформацияОДоме, ОписаниеДома);
ИнформацияОДоме.Значение = НомерДомаИСтроения;
ИнформацияОДоме.Представление = ТекстПроДомФормат;
КонецПроцедуры
// Возвращаемое значение:
// Структура:
// * КодКЛАДР - Строка
// * КодУчасткаИФНСЮЛ - Строка
// * КодУчасткаИФНСФЛ - Строка
// * КодИФНСЮЛ - Строка
// * КодИФНСФЛ - Строка
// * ОКАТО - Строка
// * ОКТМО - Строка
// * Индекс - Строка
// * Идентификатор - Строка
// * Дом - Структура
//
Функция ОписаниеДомаИСтроения() Экспорт
НомерДомаИСтроения = Новый Структура;
НомерДомаИСтроения.Вставить("Идентификатор");
НомерДомаИСтроения.Вставить("Индекс");
НомерДомаИСтроения.Вставить("ОКТМО");
НомерДомаИСтроения.Вставить("ОКАТО");
НомерДомаИСтроения.Вставить("КодИФНСФЛ", "");
НомерДомаИСтроения.Вставить("КодИФНСЮЛ", "");
НомерДомаИСтроения.Вставить("КодУчасткаИФНСФЛ", "");
НомерДомаИСтроения.Вставить("КодУчасткаИФНСЮЛ", "");
НомерДомаИСтроения.Вставить("КодКЛАДР", "");
НомерДомаИСтроения.Вставить("Дом", Новый Структура);
Возврат НомерДомаИСтроения;
КонецФункции
Функция НомерДомаЧислом(ИсходнаяСтрока)
НаборСимволов = СтрРазделить(ИсходнаяСтрока, "0123456789", Ложь);
СимволыДляУдаления = СтрСоединить(НаборСимволов);
НаборЦифр = СтрРазделить(ИсходнаяСтрока, СимволыДляУдаления, Ложь);
ИтоговоеЧисло = СтрСоединить(НаборЦифр);
Возврат ?(ПустаяСтрока(ИтоговоеЧисло), 0, Число(ИтоговоеЧисло));
КонецФункции
Функция КодыДомовВладенийИСтроений()
Результат = Новый Структура("Дома, Строения", Новый Соответствие, Новый Соответствие);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СлужебныеАдресныеСведения.Тип КАК Тип,
| СлужебныеАдресныеСведения.Идентификатор КАК Идентификатор,
| СлужебныеАдресныеСведения.Ключ КАК Ключ,
| СлужебныеАдресныеСведения.Значение КАК Значение
|ИЗ
| РегистрСведений.СлужебныеАдресныеСведения КАК СлужебныеАдресныеСведения
|ГДЕ
| (СлужебныеАдресныеСведения.Тип = ""ESTSTAT""
| ИЛИ СлужебныеАдресныеСведения.Тип = ""STRSTAT"")
| И СлужебныеАдресныеСведения.Идентификатор > 0";
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
Если РезультатЗапроса.Тип = "ESTSTAT" Тогда
Результат.Дома.Вставить(ВРег(РезультатЗапроса.Значение), РезультатЗапроса.Идентификатор);
ИначеЕсли РезультатЗапроса.Тип = "STRSTAT" Тогда
Результат.Строения.Вставить(ВРег(РезультатЗапроса.Значение), РезультатЗапроса.Идентификатор);
КонецЕсли;
КонецЦикла;
Результат.Строения.Вставить(ВРег("Корпус"), -1);
Возврат Результат;
КонецФункции
Функция КодыПомещений()
Результат = Новый Соответствие;
Результат.Вставить(ВРег("Комната"), 1);
Результат.Вставить(ВРег("Помещение"), 2);
Результат.Вставить(ВРег("Квартира"), 3);
Результат.Вставить(ВРег("Офис"), 4);
Результат.Вставить(ВРег("Бокс"), 5);
Результат.Вставить(ВРег("Этаж"), 6);
Результат.Вставить(ВРег("А/я"), 7);
Результат.Вставить(ВРег("В/ч"), 8);
Результат.Вставить(ВРег("П/о"), 9);
Возврат Результат;
КонецФункции
// Загрузка всех данных классификатора адресов с сайта.
//
// Параметры:
// КодыСубъектовРФ - Массив - содержит числовые коды регионов-субъектов для загрузки. Если не указано, то будут
// загружены все регионы, по которым когда-либо загружались данные.
// ПараметрыЗагрузки - см. ПараметрыЗагрузкиКлассификатораАдресов
//
Процедура ЗагрузитьКлассификаторАдресовССайта(ПараметрыЗагрузки, КодыСубъектовРФ = Неопределено)
Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
Возврат;
КонецЕсли;
МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
УстановитьПривилегированныйРежим(Истина);
Авторизация = ПараметрыАутентификацииНаСайте();
УстановитьПривилегированныйРежим(Ложь);
Если КодыСубъектовРФ = Неопределено Тогда
ВсеРегионы = СведенияОЗагрузкеСубъектовРФ();
ЗагруженныеРегионы = ВсеРегионы.Скопировать(Новый Структура("Загруженный", Истина));
КодыСубъектовРФ = ЗагруженныеРегионы.ВыгрузитьКолонку("КодСубъектаРФ");
КонецЕсли;
ВременныйКаталог = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ВременныйКаталог);
ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ВременныйКаталог);
КодыСубъектовДляЗагрузки = Новый Массив;
ОписаниеФайлов = Новый Массив;
ПараметрыПолучения = Новый Структура;
Если Авторизация <> Неопределено Тогда
ПараметрыПолучения.Вставить("Пользователь", Авторизация.Логин);
ПараметрыПолучения.Вставить("Пароль", Авторизация.Пароль);
КонецЕсли;
ВсеВерсии = ДоступныеВерсииАдресныхСведений();
Для Каждого КодСубъекта Из КодыСубъектовРФ Цикл
ОписаниеРегиона = ВсеВерсии.Найти(КодСубъекта.Значение, "КодСубъектаРФ");
Если ОписаниеРегиона = Неопределено Тогда
// Возможно устаревший регион, не ошибка.
Продолжить;
КонецЕсли;
ФайлРегиона = АдресИнтернетаВключаяПорт(ОписаниеРегиона.Адрес);
ПутьДляСохранения = ВременныйКаталог + ВРег(ФайлРегиона.ИмяФайла);
ПараметрыПолучения.Вставить("ПутьДляСохранения", ПутьДляСохранения);
ЗагруженныйФайл = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ОписаниеРегиона.Адрес, ПараметрыПолучения);
Если Не ЗагруженныйФайл.Статус Тогда
ФайловаяСистема.УдалитьВременныйФайл(ВременныйКаталог);
ВызватьИсключение ЗагруженныйФайл.СообщениеОбОшибке;
КонецЕсли;
КодыСубъектовДляЗагрузки.Добавить(КодСубъекта.Значение);
ОписаниеФайлов.Добавить( Новый Структура("Имя, Хранение", ПутьДляСохранения, ПутьДляСохранения) );
КонецЦикла;
ЗагрузитьКлассификаторАдресов(КодыСубъектовДляЗагрузки, ОписаниеФайлов, ПараметрыЗагрузки);
ФайловаяСистема.УдалитьВременныйФайл(ВременныйКаталог);
КонецПроцедуры
// Возвращает описание параметров загрузки классификатора адресов
//
// Возвращаемое значение:
// Структура:
// * ЗагружатьИсториюАдресов - Булево - если Истина, то будет загружена история адресных сведений. По умолчанию, Ложь.
// * ЗагружатьПорциями - Булево - если Истина, то загрузка будет осуществляться порциями. По умолчанию, Ложь.
// * ОповещатьОПрогрессе - Булево - если Истина, то передаваться сообщение о статусе загрузки. По умолчанию, Истина.
//
Функция ПараметрыЗагрузкиКлассификатораАдресов() Экспорт
Результат = Новый Структура();
Результат.Вставить("ЗагружатьИсториюАдресов", Ложь);
Результат.Вставить("ОповещатьОПрогрессе", Истина);
СистемнаяИнформация = Новый СистемнаяИнформация;
ОперативнаяПамять = СистемнаяИнформация.ОперативнаяПамять / 1024; // Гб
ЗагружатьПорциями = Ложь;
Если ОперативнаяПамять < 4
Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86
Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86
Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86 Тогда
ЗагружатьПорциями = Истина;
КонецЕсли;
Результат.Вставить("ЗагружатьПорциями", ЗагружатьПорциями);
Возврат Результат;
КонецФункции
// Очистка данных классификатора адресов.
//
// Параметры:
// КодыСубъектовРФ - Массив - содержит числовые коды регионов-субъектов для очистки.
//
Процедура ОчиститьКлассификаторАдресов(КодыСубъектовРФ)
// Все заказанные субъекты
ВсегоСубъектов = КодыСубъектовРФ.Количество();
НомерПоПорядку = 0;
Для Каждого СубъектРФ Из КодыСубъектовРФ Цикл
НомерПоПорядку = НомерПоПорядку + 1;
ДлительныеОперации.СообщитьПрогресс(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Очистка региона ""%1 - %2"" (осталось %3) ...'"),
СубъектРФ, АдресныйКлассификатор.НаименованиеРегионаПоКоду(СубъектРФ),
Формат(ВсегоСубъектов - НомерПоПорядку, "ЧН=")));
НачатьТранзакцию();
Попытка
ОчиститьАдресныеОбъекты(СубъектРФ);
ОчиститьДомаЗданияСтроения(СубъектРФ);
ОчиститьИсториюАдресныхОбъектов(СубъектРФ);
ОчиститьЗемельныеУчастки(СубъектРФ);
ОчиститьСвязиАдресныхОбъектов(СубъектРФ);
ОчиститьПричиныИзмененияАдреса(СубъектРФ);
ОчиститьДополнительныеСведения(СубъектРФ);
ОчиститьАдресныеОриентиры(СубъектРФ);
ОчиститьУровниСокращенийАдресныхСведений();
СброситьИнформациюОЗагрузкеВерсии(СубъектРФ);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Путь к файлу на веб сервере, содержащему информацию по версиям адресных сведений.
//
// Возвращаемое значение:
// Строка - путь к файлу описания данных.
//
Функция АдресФайлаОписанияДоступныхВерсий()
Возврат "http://downloads.1c.ru/ipp/ITSREPV/V8Update/fias2/version.zip";
КонецФункции
// Путь к веб сервису контактной информации
//
// Возвращаемое значение:
// Строка - путь к файлу описания данных.
//
Функция АдресВебСервисаКонтактнойИнформации() Экспорт
Возврат "https://api.orgaddress.1c.ru";
КонецФункции
// Пространство имен для операций XDTO.
//
// Возвращаемое значение:
// Строка
//
Функция ПространствоИмен()
Возврат "http://www.v8.1c.ru/ssl/AddressSystem";
КонецФункции
// Проверяет наличие в конфигурации подсистемы ПолучениеФайловИзИнтернета для определения возможности
// обновлений адресного классификатора через интернет.
//
// Возвращаемое значение:
// Булево - доступна загрузка адресных сведений из интернет
//
Функция ДоступнаЗагрузкаАдресныхСведенийИзИнтернет() Экспорт
Возврат ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета");
КонецФункции
// Проверяет наличие обновлений адресного классификатора на веб сервере
// для тех объектов, которые ранее уже загружались.
//
// Возвращаемое значение:
// ТаблицаЗначений - описание добавленных и измененных субъектов. Содержит Колонки:
// * КодСубъектаРФ - Число - код субъекта РФ.
// * Наименование - Строка - наименование субъекта РФ.
// * Сокращение - Строка - сокращение субъекта РФ.
// * Индекс - Число - почтовый индекс.
// * Идентификатор - УникальныйИдентификатор - идентификатор субъекта.
// * Адрес - Строка - адрес для скачивания файла данных региона.
// * ДоступноОбновление - Булево - флаг доступности обновления для данного региона.
// * Загружено - Булево - флаг того, что данные хоть раз загружались.
// * ДатаОбновления - Дата - дата обновления адресных сведений.
//
Функция ДоступныеВерсииАдресныхСведений(ПараметрыВыгрузки = Неопределено, АдресВоВременномХранилище = Неопределено) Экспорт
Результат = Новый ТаблицаЗначений;
ТипСтрока = Новый ОписаниеТипов("Строка");
ТипЧисло = Новый ОписаниеТипов("Число");
ТипБулево = Новый ОписаниеТипов("Булево");
ТипДата = Новый ОписаниеТипов("Дата");
Колонки = Результат.Колонки;
Колонки.Добавить("КодСубъектаРФ", ТипЧисло);
Колонки.Добавить("Наименование", ТипСтрока);
Колонки.Добавить("Сокращение", ТипСтрока);
Колонки.Добавить("Индекс", ТипЧисло);
Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор") );
Колонки.Добавить("Адрес", ТипСтрока);
Колонки.Добавить("ДоступноОбновление", ТипБулево);
Колонки.Добавить("Загружено", ТипБулево);
Колонки.Добавить("ДатаОбновления", ТипДата);
Результат.Индексы.Добавить("КодСубъектаРФ");
Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
Возврат Результат;
КонецЕсли;
МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
АдресОписания = АдресИнтернетаВключаяПорт(АдресФайлаОписанияДоступныхВерсий());
РезультатПолученияФайла = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес);
Если Не РезультатПолученияФайла.Статус Тогда
Возврат Результат;
КонецЕсли;
// Получен zip, внутри которого xml.
КаталогДляРаспаковки = ПолучитьИмяВременногоФайла();
Архив = Новый ЧтениеZipФайла(РезультатПолученияФайла.Путь);
Архив.ИзвлечьВсе(КаталогДляРаспаковки);
ФайлОписания = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогДляРаспаковки) + "version.xml";
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ФайлОписания);
ДоступныеДанные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип( ПространствоИмен(), "Publications") );
ЧтениеXML.Закрыть();
ФайловаяСистема.УдалитьВременныйФайл(КаталогДляРаспаковки);
ФайловаяСистема.УдалитьВременныйФайл(РезультатПолученияФайла.Путь);
ДатаПоследнейВерсии = '00000000';
ПоследняяПубликация = Неопределено;
Для Каждого Публикация Из ДоступныеДанные.ПолучитьСписок("Publication") Цикл
Если Публикация.UpdateDate > ДатаПоследнейВерсии Тогда
ДатаПоследнейВерсии = Публикация.UpdateDate - 86400;
ПоследняяПубликация = Публикация;
КонецЕсли;
КонецЦикла;
Если ПоследняяПубликация = Неопределено Тогда
// Нет данных совсем
Возврат Результат;
КонецЕсли;
// Сравниваем то что в регистре, и то что прочитали.
ТекущиеСубъекты = СведенияОЗагрузкеСубъектовРФ();
Для Каждого ЗаписьРегиона Из ПоследняяПубликация.ПолучитьСписок("Region") Цикл
Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ЗаписьРегиона.AOGUID);
ТекущийСубъект = ТекущиеСубъекты.Найти(Идентификатор, "Идентификатор");
Если ТекущийСубъект = Неопределено Тогда
Продолжить;
КонецЕсли;
СтрокаРегиона = Результат.Добавить();
СтрокаРегиона.КодСубъектаРФ = ЗаписьРегиона.REGIONCODE;
СтрокаРегиона.Наименование = ЗаписьРегиона.FORMALNAME;
СтрокаРегиона.Сокращение = ЗаписьРегиона.SHORTNAME;
СтрокаРегиона.Индекс = ЗаписьРегиона.POSTALCODE;
СтрокаРегиона.Идентификатор = Идентификатор;
СтрокаРегиона.Адрес = ЗаписьРегиона.Url;
СтрокаРегиона.Загружено = ТекущийСубъект <> Неопределено И ТекущийСубъект.Загружено;
СтрокаРегиона.ДатаОбновления = ДатаПоследнейВерсии;
Если ЗначениеЗаполнено(ТекущийСубъект.ДатаВерсии) Тогда
СтрокаРегиона.ДоступноОбновление = ТекущийСубъект = Неопределено // Новый регион
Или ТекущийСубъект.ДатаВерсии < ДатаПоследнейВерсии // Обновленный регион
Или (ТекущийСубъект.КодСубъектаРФ <> ЗаписьРегиона.REGIONCODE);// Обновленные данные существующего субъекта.
КонецЕсли;
КонецЦикла;
Если АдресВоВременномХранилище <> Неопределено Тогда
Ответ = Новый Структура("Отказ, Таблица");
Ответ.Отказ = Ложь;
Ответ.Таблица = Результат;
ПоместитьВоВременноеХранилище(Ответ, АдресВоВременномХранилище);
КонецЕсли;
Возврат Результат;
КонецФункции
// Вычитываем справочную информацию и информацию о версии.
//
Функция СлужебныеАдресныеСведения(КаталогФайлов)
Набор = РегистрыСведений.СлужебныеАдресныеСведения.СоздатьНаборЗаписей();
Сведения = Набор.ВыгрузитьКолонки("Тип, Идентификатор, Ключ, Значение");
Сведения.Индексы.Добавить("Тип, Идентификатор, Ключ");
Результат = Новый Структура("Сведения", Сведения);
ТекущаяЗапись = Неопределено;
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(Неопределено, КаталогФайлов, "ADDRSTATUS", "AddressStatuses");
Попытка
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
ТипЗаписи = ТекущаяЗапись.ЗначениеАтрибута("TYPE");
Значение = ТекущаяЗапись.ЗначениеАтрибута("VALUE");
Если СтрСравнить(ТипЗаписи, "STRSTAT") = 0
И ТекущаяЗапись.ЗначениеАтрибута("ID") = "3"
И СтрСравнить(Значение, "Литера") <> 0 Тогда
Продолжить;
КонецЕсли;
Запись = Сведения.Добавить();
Запись.Тип = ТипЗаписи;
Запись.Идентификатор = ТекущаяЗапись.ЗначениеАтрибута("ID");
Запись.Ключ = ТекущаяЗапись.ЗначениеАтрибута("KEY");
Запись.Значение = Значение;
КонецЦикла;
НенужныеСимволы = СтрСоединить(СтрРазделить(ФайлЗагрузки.ДатаВерсии, "0123456789"));
ДатаВерсии = Дата(СтрСоединить(СтрРазделить(ФайлЗагрузки.ДатаВерсии, НенужныеСимволы)));
Результат.Вставить("Версия", ФайлЗагрузки.Версия);
Результат.Вставить("ДатаВерсии", ДатаВерсии);
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
Исключение
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
ВызватьИсключение;
КонецПопытки;
Возврат Результат;
КонецФункции
// Возвращает признак того, является ли строка данных контактной информации XML данными.
//
// Параметры:
// Текст - Строка - проверяемая строка.
//
// Возвращаемое значение:
// Булево - результат проверки.
//
Функция ЭтоКонтактнаяИнформацияВJSON(Знач Текст)
Возврат ТипЗнч(Текст) = Тип("Строка") И СтрНачинаетсяС(СокрЛ(Текст), "{");
КонецФункции
// Вычитываем информацию о адресных сокращениях.
//
Функция АдресныеСокращенияИзФайла(КаталогФайлов)
Набор = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
Сведения = Набор.ВыгрузитьКолонки("Сокращение, Уровень, Значение");
Сведения.Индексы.Добавить("Сокращение, Уровень");
ТекущаяЗапись = Неопределено;
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(Неопределено, КаталогФайлов, "SOCRBASE", "AddressStatuses");
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
ТипЗаписи = ТекущаяЗапись.ЗначениеАтрибута("TYPE");
Ключ = ТекущаяЗапись.ЗначениеАтрибута("KEY");
Если СтрСравнить(ТипЗаписи, "SOCRBASE") = 0 И ЗначениеЗаполнено(Ключ) Тогда
Запись = Сведения.Добавить();
Запись.Уровень = ТекущаяЗапись.ЗначениеАтрибута("ID");
Запись.Сокращение = Ключ;
Запись.Значение = ТекущаяЗапись.ЗначениеАтрибута("VALUE");
КонецЕсли;
КонецЦикла;
Результат = Новый Структура("Сведения", Сведения);
Результат.Вставить("Версия", ФайлЗагрузки.Версия);
Результат.Вставить("ДатаВерсии", ФайлЗагрузки.ДатаВерсии);
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
Возврат Результат;
КонецФункции
Процедура ЗагрузитьАдресныеОбъекты(КодСубъектаРФ, КаталогФайлов, ЗагружатьОднимНабором)
Связи = СвязиАдресныхОбъектов(КодСубъектаРФ, КаталогФайлов, ЗагружатьОднимНабором);
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ADDROBJ", "AddressObjects");
Если ФайлЗагрузки = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Загрузка адресных сведений прервана. В загружаемых файлах не найден файл с адресными сведениями.'");
КонецЕсли;
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Замещать = Истина;
КоличествоЗаписейВНаборе = 0;
РазмерПорции = МаксимальныйРазмерНабораЗаписей();
Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
Попытка
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
Запись = Набор.Добавить();
Запись.КодСубъектаРФ = КодСубъектаРФ;
Запись.Уровень = ТекущаяЗапись.ЗначениеАтрибута("AOLEVEL");
Запись.Идентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("AOGUID"));
Если Запись.Уровень > 1 Тогда
Запись.РодительскийИдентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("PARENTGUID"));
Запись.МуниципальныйРодительскийИдентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("PARENTGUIDMUN"));
КонецЕсли;
Запись.Наименование = ТекущаяЗапись.ЗначениеАтрибута("FORMALNAME");
Запись.Сокращение = ТекущаяЗапись.ЗначениеАтрибута("SHORTNAME");
Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("EXTRAGUID"));
Запись.КодКЛАДР = ТекущаяЗапись.ЗначениеАтрибута("CODE");
ПреобразоватьЗаписьДляКраткойЗаписиАдресов(Запись, Связи);
Если ЗагружатьОднимНабором Тогда
Продолжить;
КонецЕсли;
Если КоличествоЗаписейВНаборе < РазмерПорции Тогда
КоличествоЗаписейВНаборе = КоличествоЗаписейВНаборе + 1;
Продолжить;
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
Замещать = Ложь;
КоличествоЗаписейВНаборе = 0;
Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
КонецЦикла;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
Исключение
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПреобразоватьЗаписьДляКраткойЗаписиАдресов(Запись, Связи)
Если Запись.Уровень = 31 Тогда
Запись.Сокращение =ИсправлениеСокращений(Запись.Сокращение);
Запись.Наименование = КраткоеНаписаниеМуниципальныхРайонов(Запись.Наименование, Запись.Сокращение);
КонецЕсли;
Если Запись.Уровень = 41 Тогда
Запись.Сокращение =ИсправлениеСокращений(Запись.Сокращение);
Запись.Наименование = КраткоеНаписаниеПоселений(Запись.Наименование, Запись.Сокращение);
КонецЕсли;
// Городской округ - город - населенный пункт
Связь = Связи.Найти(Запись.Идентификатор, "Идентификатор");
Если Связь <> Неопределено Тогда
Запись.МуниципальныйРодительскийИдентификатор = Связь.МуниципальныйРодительскийИдентификатор;
КонецЕсли;
КонецПроцедуры
// Обратная совместимость
//
Функция ИсправлениеСокращений(Сокращение)
// АПК: 1297-выкл Данные адресного классификатора, не локализуются
Если СтрСравнить(Сокращение, "г. п.") = 0 Тогда
Возврат "г.п.";
КонецЕсли;
Если СтрСравнить(Сокращение, "вн.тер") = 0
Или СтрСравнить(Сокращение, "вн.тер.") = 0 Тогда
Возврат "вн.тер.г.";
КонецЕсли;
Если СтрСравнить(Сокращение, "мун.окр.") = 0
Или СтрСравнить(Сокращение, "мун. окр.") = 0 Тогда
Возврат "м.о.";
КонецЕсли;
// АПК: 1297-вкл
Возврат Сокращение;
КонецФункции
Процедура ЗагрузитьДомаЗданияСтроения(КодСубъектаРФ, КаталогФайлов, ЗагружатьОднимНабором)
Сжатие = Новый СжатиеДанных(9);
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "HOUSE", "Houses");
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Набор = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
Замещать = Истина;
КоличествоЗаписейВНаборе = 0;
РазмерПорции = МаксимальныйРазмерНабораЗаписей();
Попытка
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Или ПустаяСтрока(ТекущаяЗапись.ЗначениеАтрибута("AOGUID")) Тогда
Продолжить;
КонецЕсли;
Запись = Набор.Добавить();
Запись.КодСубъектаРФ = КодСубъектаРФ;
Запись.АдресныйОбъект = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("AOGUID"));
Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("EXTRAGUID"));
Запись.Строения = Новый ХранилищеЗначения(ТекущаяЗапись.ЗначениеАтрибута("BUILDINGS"), Сжатие);
Если ЗагружатьОднимНабором Тогда
Продолжить;
КонецЕсли;
Если КоличествоЗаписейВНаборе < РазмерПорции Тогда
КоличествоЗаписейВНаборе = КоличествоЗаписейВНаборе + 1;
Продолжить;
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
Замещать = Ложь;
КоличествоЗаписейВНаборе = 0;
Набор = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
КонецЦикла;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
Исключение
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ЗагрузитьЗемельныеУчастки(КодСубъектаРФ, КаталогФайлов, ЗагружатьОднимНабором)
Сжатие = Новый СжатиеДанных(9);
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "STEAD", "Steads");
Если ФайлЗагрузки = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Набор = РегистрыСведений.ЗемельныеУчастки.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
Замещать = Истина;
КоличествоЗаписейВНаборе = 0;
РазмерПорции = МаксимальныйРазмерНабораЗаписей();
Попытка
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
Запись = Набор.Добавить();
Запись.КодСубъектаРФ = КодСубъектаРФ;
Запись.АдресныйОбъект = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("PARENTGUID"));
Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("EXTRAGUID"));
Запись.Участки = Новый ХранилищеЗначения(ТекущаяЗапись.ЗначениеАтрибута("NUMBER"), Сжатие);
Если ЗагружатьОднимНабором Тогда
Продолжить;
КонецЕсли;
Если КоличествоЗаписейВНаборе < РазмерПорции Тогда
КоличествоЗаписейВНаборе = КоличествоЗаписейВНаборе + 1;
Продолжить;
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
Замещать = Ложь;
КоличествоЗаписейВНаборе = 0;
Набор = РегистрыСведений.ЗемельныеУчастки.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
КонецЦикла;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
Исключение
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Функция СвязиАдресныхОбъектов(КодСубъектаРФ, КаталогФайлов, ЗагружатьОднимНабором)
ТаблицаСвязейАдресныхОбъектов = Новый ТаблицаЗначений;
ТаблицаСвязейАдресныхОбъектов.Колонки.Добавить("МуниципальныйРодительскийИдентификатор", Новый ОписаниеТипов("УникальныйИдентификатор"));
ТаблицаСвязейАдресныхОбъектов.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор"));
ТаблицаСвязейАдресныхОбъектов.Индексы.Добавить("МуниципальныйРодительскийИдентификатор");
ТаблицаСвязейАдресныхОбъектов.Индексы.Добавить("Идентификатор");
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "LINK", "Links");
Если ФайлЗагрузки = Неопределено Тогда
Возврат ТаблицаСвязейАдресныхОбъектов;
КонецЕсли;
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Попытка
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
СвязьАдресныхОбъектов = ТаблицаСвязейАдресныхОбъектов.Добавить();
СвязьАдресныхОбъектов.Идентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("AOGUID"));
СвязьАдресныхОбъектов.МуниципальныйРодительскийИдентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("MUNPARENTGUID"));
КонецЦикла;
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
Исключение
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
ВызватьИсключение;
КонецПопытки;
Возврат ТаблицаСвязейАдресныхОбъектов;
КонецФункции
Процедура ЗагрузитьСвязиАдресныхОбъектов(КодСубъектаРФ, КаталогФайлов, ЗагружатьОднимНабором)
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "LINK", "Links");
Если ФайлЗагрузки = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Набор = РегистрыСведений.СвязиАдресныхОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
Замещать = Истина;
КоличествоЗаписейВНаборе = 0;
РазмерПорции = МаксимальныйРазмерНабораЗаписей();
Попытка
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
Запись = Набор.Добавить();
Запись.КодСубъектаРФ = КодСубъектаРФ;
Запись.Идентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("AOGUID"));
Запись.МуниципальныйРодительскийИдентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("MUNPARENTGUID"));
Если ЗагружатьОднимНабором Тогда
Продолжить;
КонецЕсли;
Если КоличествоЗаписейВНаборе < РазмерПорции Тогда
КоличествоЗаписейВНаборе = КоличествоЗаписейВНаборе + 1;
Продолжить;
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
Замещать = Ложь;
КоличествоЗаписейВНаборе = 0;
Набор = РегистрыСведений.СвязиАдресныхОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
КонецЦикла;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
Исключение
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ЗагрузитьДополнительныеСведения(КодСубъектаРФ, КаталогФайлов, ЗагружатьИсториюИзменений)
Набор = РегистрыСведений.ДополнительныеАдресныеСведения.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ЗагрузитьВНаборДополнительныеСведенияИзФайла(Набор, "EXTRAACT", КаталогФайлов, КодСубъектаРФ);
Если ЗагружатьИсториюИзменений Тогда
ЗагрузитьВНаборДополнительныеСведенияИзФайла(Набор, "EXTRAHIS", КаталогФайлов, КодСубъектаРФ);
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ЗагрузитьВНаборДополнительныеСведенияИзФайла(Набор, Знач ИмяФайла, Знач КаталогФайлов, Знач КодСубъектаРФ)
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, ИмяФайла, "AdditionalAddressInfo");
Если ФайлЗагрузки = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
Запись = Набор.Добавить();
Запись.КодСубъектаРФ = КодСубъектаРФ;
Запись.Идентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("EXTRAGUID"));
Запись.ПочтовыйИндекс = ТекущаяЗапись.ЗначениеАтрибута("POSTALCODE");
Запись.OKATO = ТекущаяЗапись.ЗначениеАтрибута("OKATO");
Запись.ОКТМО = ТекущаяЗапись.ЗначениеАтрибута("OKTMO");
Запись.КодИФНСФЛ = ТекущаяЗапись.ЗначениеАтрибута("IFNSFL");
Запись.КодИФНСЮЛ = ТекущаяЗапись.ЗначениеАтрибута("IFNSUL");
Запись.КодУчасткаИФНСФЛ = ТекущаяЗапись.ЗначениеАтрибута("TERRIFNSFL");
Запись.КодУчасткаИФНСЮЛ = ТекущаяЗапись.ЗначениеАтрибута("TERRIFNSUL");
КонецЦикла;
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
КонецПроцедуры
Процедура ЗагрузитьИсториюАдресныхОбъектов(КодСубъектаРФ, КаталогФайлов, ЗагружатьОднимНабором)
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ARCHOBJ", "ArchiveObjects");
Если ФайлЗагрузки = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Загрузка адресных сведений прервана. В загружаемых файлах не найден файл с адресными сведениями.'");
КонецЕсли;
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Замещать = Истина;
КоличествоЗаписейВНаборе = 0;
РазмерПорции = МаксимальныйРазмерНабораЗаписей();
Набор = РегистрыСведений.ИсторияАдресныхОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
Попытка
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
Запись = Набор.Добавить();
Запись.КодСубъектаРФ = КодСубъектаРФ;
Запись.Уровень = ТекущаяЗапись.ЗначениеАтрибута("AOLEVEL");
Запись.Идентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("AOID"));
Запись.АдресныйОбъект = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("AOGUID"));
Запись.РодительскийИдентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("PARENTGUID"));
Запись.МуниципальныйРодительскийИдентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("PARENTGUIDMUN"));
Запись.ДополнительныеАдресныеСведения = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("EXTRAGUID"));
Запись.Наименование = ТекущаяЗапись.ЗначениеАтрибута("FORMALNAME");
Запись.Сокращение = ТекущаяЗапись.ЗначениеАтрибута("SHORTNAME");
Запись.Операция = ТекущаяЗапись.ЗначениеАтрибута("OPERSTATUS");
Если ЗначениеЗаполнено(ТекущаяЗапись.ЗначениеАтрибута("STARTDATE")) Тогда
Запись.НачалоДействияЗаписи = Дата(ТекущаяЗапись.ЗначениеАтрибута("STARTDATE"));
КонецЕсли;
Если ЗначениеЗаполнено(ТекущаяЗапись.ЗначениеАтрибута("ENDDATE")) Тогда
Запись.ОкончаниеДействияЗаписи = Дата(ТекущаяЗапись.ЗначениеАтрибута("ENDDATE"));
КонецЕсли;
Запись.ТекущийКодСубъектаРФ = КодСубъектаРФ;
Если ЗагружатьОднимНабором Тогда
Продолжить;
КонецЕсли;
Если КоличествоЗаписейВНаборе < РазмерПорции Тогда
КоличествоЗаписейВНаборе = КоличествоЗаписейВНаборе + 1;
Продолжить;
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
Замещать = Ложь;
КоличествоЗаписейВНаборе = 0;
Набор = РегистрыСведений.ИсторияАдресныхОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
КонецЦикла;
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(Набор, Замещать);
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
Исключение
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ЗагрузитьПричиныИзмененияАдреса(КодСубъектаРФ, КаталогФайлов)
Сжатие = Новый СжатиеДанных(9);
Набор = РегистрыСведений.ПричиныИзмененияАдресныхСведений.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ARCHDOCS", "RegulatoryDocs");
Если ФайлЗагрузки = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения;
Пока ТекущаяЗапись.Прочитать() Цикл
Если ТекущаяЗапись.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
Продолжить;
КонецЕсли;
Запись = Набор.Добавить();
Запись.КодСубъектаРФ = КодСубъектаРФ;
Запись.Идентификатор = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("DOCID"));
Запись.ИзмененныйОбъект = УникальныйИдентификаторИзСтроки64(ТекущаяЗапись.ЗначениеАтрибута("OBJID"));
Запись.СодержитОписание = ТекущаяЗапись.ЗначениеАтрибута("ISDESCR");
Запись.Описание = Новый ХранилищеЗначения(ТекущаяЗапись.ЗначениеАтрибута("DESCR"), Сжатие);
КонецЦикла;
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
КонецПроцедуры
Процедура УстановитьИнформациюОЗагрузкеВерсии(КодСубъектаРФ, Версия, ДатаВерсии, ДатаЗагрузки)
Набор = РегистрыСведений.ЗагруженныеВерсииАдресныхСведений.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОсновнаяЗапись = Набор.Добавить();
ОсновнаяЗапись.КодСубъектаРФ = КодСубъектаРФ;
ОсновнаяЗапись.Версия = Версия;
ОсновнаяЗапись.ДатаВерсии = ДатаВерсии;
ОсновнаяЗапись.ДатаЗагрузки = ДатаЗагрузки;
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура СброситьИнформациюОЗагрузкеВерсии(КодСубъектаРФ)
Набор = РегистрыСведений.ЗагруженныеВерсииАдресныхСведений.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ОчиститьАдресныеОбъекты(КодСубъектаРФ)
// Очищаем, не трогая запись региона.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АдресныеОбъекты.Идентификатор КАК Идентификатор,
| АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
| АдресныеОбъекты.РодительскийИдентификатор КАК РодительскийИдентификатор,
| АдресныеОбъекты.МуниципальныйРодительскийИдентификатор КАК МуниципальныйРодительскийИдентификатор,
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР,
| АдресныеОбъекты.ДополнительныеАдресныеСведения КАК ДополнительныеАдресныеСведения,
| АдресныеОбъекты.Уровень КАК Уровень
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
|ГДЕ
| АдресныеОбъекты.КодСубъектаРФ = &КодСубъектаРФ
| И АдресныеОбъекты.Уровень = 1";
Запрос.УстановитьПараметр("КодСубъектаРФ", КодСубъектаРФ);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
СтрокаРегиона = Классификатор.Найти(КодСубъектаРФ, "КодСубъектаРФ");
Если СтрокаРегиона = Неопределено Тогда
Возврат;
КонецЕсли;
СведенияОбРегионе = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СтрокаРегиона);
Иначе
СведенияОбРегионе = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(РезультатЗапроса.Выгрузить()[0]);
КонецЕсли;
НачатьТранзакцию();
Попытка
Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
НоваяЗапись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, СведенияОбРегионе);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ОчиститьДомаЗданияСтроения(КодСубъектаРФ)
Набор = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ОчиститьЗемельныеУчастки(КодСубъектаРФ)
Набор = РегистрыСведений.ЗемельныеУчастки.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ОчиститьСвязиАдресныхОбъектов(КодСубъектаРФ)
Набор = РегистрыСведений.СвязиАдресныхОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ОчиститьДополнительныеСведения(КодСубъектаРФ)
Набор = РегистрыСведений.ДополнительныеАдресныеСведения.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ОчиститьИсториюАдресныхОбъектов(КодСубъектаРФ)
Набор = РегистрыСведений.ИсторияАдресныхОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ОчиститьПричиныИзмененияАдреса(КодСубъектаРФ)
Набор = РегистрыСведений.ПричиныИзмененияАдресныхСведений.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ОчиститьАдресныеОриентиры(КодСубъектаРФ)
Набор = РегистрыСведений.ОриентирыАдресныхОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
КонецПроцедуры
Процедура ОчиститьУровниСокращенийАдресныхСведений()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| АдресныеОбъекты.Уровень
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
|ГДЕ
| АдресныеОбъекты.Уровень > 1";
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
Возврат;
КонецЕсли;
НачатьТранзакцию();
Попытка
БлокировкаДанных = Новый БлокировкаДанных;
БлокировкаДанных.Добавить("РегистрСведений.УровниСокращенийАдресныхСведений");
БлокировкаДанных.Заблокировать();
// Т.к. адресный классификатор не содержит сведений, то очищаем таблицу адресных сведений.
УровниСокращенийАдресныхСведений = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
УровниСокращенийАдресныхСведений.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ЗаписьЖурналаРегистрации(НСтр("ru = 'Не удалось очистить регистр сведений Уровни сокращений адресных сведений.'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
// Инициализирует структуру описания файла данных адресных сведений.
//
Функция ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, КлючВида, ИмяОписывающегоУзла)
Если КодСубъектаРФ = Неопределено Тогда
ИмяИсходногоФайла = КлючВида;
Иначе
ИмяИсходногоФайла = Формат(КодСубъектаРФ, "ЧЦ=2; ЧН=; ЧВН=") + "_" + КлючВида;
КонецЕсли;
Результат = Новый Структура;
// Как архив
Файл = НайтиФайл(КаталогФайлов, ИмяИсходногоФайла + ".ZIP");
Если Файл.Существует Тогда
ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( ПолучитьИмяВременногоФайла() );
ЧтениеZipФайла = Новый ЧтениеZipФайла(Файл.ПолноеИмя);
Элемент = ЧтениеZipФайла.Элементы[0];
ЧтениеZipФайла.Извлечь(Элемент, ВременныйКаталог);
Результат.Вставить("Путь", ВременныйКаталог);
Результат.Вставить("ПолноеИмя", ВременныйКаталог + Элемент.ПолноеИмя);
Результат.Вставить("УдалитьПутьПриЗакрытии", Истина);
Иначе
// Как обычный файл
Результат.Вставить("Путь", КаталогФайлов);
Результат.Вставить("УдалитьПутьПриЗакрытии", Ложь);
Результат.Вставить("ПолноеИмя", КаталогФайлов + ИмяИсходногоФайла + ".FI");
КонецЕсли;
// Тип заголовка
СвойствоЗаголовка = ФабрикаXDTO.Пакеты.Получить(ПространствоИмен()).КорневыеСвойства.Получить(ИмяОписывающегоУзла);
ТипXDTOЗаголовка = СвойствоЗаголовка.Тип;
// Тип записи
Заголовок = ФабрикаXDTO.Создать(ТипXDTOЗаголовка);
ТипXDTOЗаписи = Неопределено;
Для Каждого Свойство Из ТипXDTOЗаголовка.Свойства Цикл
Если Заголовок.ПолучитьСписок(Свойство.ЛокальноеИмя) <> Неопределено Тогда
ТипXDTOЗаписи = Свойство.Тип;
Прервать;
КонецЕсли;
КонецЦикла;
Если ТипXDTOЗаписи = Неопределено Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В файле ""%1"" не найден список записей в типе %2'"), Результат.ПолноеИмя, Результат.ТипXDTO);
КонецЕсли;
Результат.Вставить("ТипXDTO", ТипXDTOЗаголовка);
Результат.Вставить("ТипXDTOЗаписи", ТипXDTOЗаписи);
Результат.Вставить("Версия");
Результат.Вставить("ДатаВерсии");
Результат.Вставить("ФайлЧтения", Новый ЧтениеFastInfoset);
ФайлЧтения = Результат.ФайлЧтения;
ПроверкаФайла = Новый Файл(Результат.ПолноеИмя);
Если Не ПроверкаФайла.Существует() Тогда
Возврат Неопределено;
КонецЕсли;
ФайлЧтения.ОткрытьФайл(Результат.ПолноеИмя);
// Встаем на первый узел с данными.
КореньНайден = ФайлЧтения.ПерейтиКСодержимому() <> ТипУзлаXML.Ничего;
Пока КореньНайден Цикл
Если ФайлЧтения.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлЧтения.ЛокальноеИмя = ИмяОписывающегоУзла Тогда
Результат.Версия = ФайлЧтения.ЗначениеАтрибута("Version");
Результат.ДатаВерсии = ФайлЧтения.ЗначениеАтрибута("UpdateDate");
Прервать;
КонецЕсли;
КореньНайден = ФайлЧтения.Прочитать();
КонецЦикла;
Если НЕ КореньНайден Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В файле ""%1"" не найден корневой узел %2'"), Результат.ПолноеИмя, ИмяОписывающегоУзла);
КонецЕсли;
Результат.Вставить("КодСубъектаРФ", КодСубъектаРФ);
Результат.Вставить("КлючВида", КлючВида);
УказательНаФайл = Новый Файл(Результат.ПолноеИмя);
Результат.Вставить("РазмерФайла", УказательНаФайл.Размер());
Возврат Результат;
КонецФункции
// Поиск первого файла по маске без учета регистра (особенностей операционной системы).
//
// Параметры:
// Каталог - Строка - каталог, в котором ищется файл.
// МаскаИмениФайла - Строка - имя искомого файла.
//
// Возвращаемое значение:
// Структура - описание найденного файла. Содержит поля:
// * Существует - Булево - флаг того, что указанный файл существует.
// * Имя - Строка - характеристика найденного файла, см. описания типа Файл.
// * ИмяБезРасширения - Строка - характеристика найденного файла, см. описания типа Файл.
// * ПолноеИмя - Строка - характеристика найденного файла, см. описания типа Файл.
// * Путь - Строка - характеристика найденного файла, см. описания типа Файл.
// * Расширение - Строка - характеристика найденного файла, см. описания типа Файл.
//
Функция НайтиФайл(Каталог, МаскаИмениФайла)
НеУчитыватьРегистр = ОбщегоНазначения.ЭтоWindowsСервер();
Если НеУчитыватьРегистр Тогда
Маска = ВРег(МаскаИмениФайла);
Иначе
Маска = "";
Для Позиция = 1 По СтрДлина(МаскаИмениФайла) Цикл
Символ = Сред(МаскаИмениФайла, Позиция, 1);
ВерхнийРегистр = ВРег(Символ);
НижнийРегистр = НРег(Символ);
Если ВерхнийРегистр = НижнийРегистр Тогда
Маска = Маска + Символ;
Иначе
Маска = Маска + "[" + ВерхнийРегистр + НижнийРегистр + "]";
КонецЕсли;
КонецЦикла;
КонецЕсли;
Результат = Новый Структура("Существует, Имя, ИмяБезРасширения, ПолноеИмя, Путь, Расширение", Ложь);
Варианты = НайтиФайлы(Каталог, Маска);
Если Варианты.Количество() > 0 Тогда
Результат.Существует = Истина;
ЗаполнитьЗначенияСвойств(Результат, Варианты[0]);
КонецЕсли;
Возврат Результат;
КонецФункции
// Завершает работу с набором данных.
//
Процедура ЗакрытьФайлЗагрузкиСубъектаРФ(ОписаниеФайла)
ОписаниеФайла.ФайлЧтения.Закрыть();
ОписаниеФайла.ФайлЧтения = Неопределено;
Если ОписаниеФайла.УдалитьПутьПриЗакрытии Тогда
ФайловаяСистема.УдалитьВременныйФайл(ОписаниеФайла.Путь);
КонецЕсли;
КонецПроцедуры
// Противоположность ОбщегоНазначенияКлиентСервер.СтруктураURI
//
Функция URIПоСтруктуре(СтруктураURI)
Результат = "";
// Протокол
Если Не ПустаяСтрока(СтруктураURI.Схема) Тогда
Результат = Результат + СтруктураURI.Схема + "://";
КонецЕсли;
// Авторизация
Если Не ПустаяСтрока(СтруктураURI.Логин) Тогда
Результат = Результат + СтруктураURI.Логин + ":" + СтруктураURI.Пароль + "@";
КонецЕсли;
// Все остальное
Результат = Результат + СтруктураURI.Хост;
Если Не ПустаяСтрока(СтруктураURI.Порт) Тогда
Результат = Результат + ":" + ?(ТипЗнч(СтруктураURI.Порт) = Тип("Число"), Формат(СтруктураURI.Порт, ""), СтруктураURI.Порт);
КонецЕсли;
Результат = Результат + "/" + СтруктураURI.ПутьНаСервере;
Возврат Результат;
КонецФункции
// Подстановка порта в адрес загрузки для профилей безопасности.
//
Функция АдресИнтернетаВключаяПорт(Адрес)
Результат = Новый Структура;
СоставАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(Адрес);
Если ПустаяСтрока(СоставАдреса.Порт) Тогда
Протокол = ВРег(СоставАдреса.Схема);
Если Протокол = "HTTP" Тогда
СоставАдреса.Порт = 80;
ИначеЕсли Протокол = "HTTPS" Тогда
СоставАдреса.Порт = 443;
КонецЕсли;
Результат.Вставить("Адрес", URIПоСтруктуре(СоставАдреса) );
Иначе
Результат.Вставить("Адрес", Адрес);
КонецЕсли;
ИмяФайла = СоставАдреса.ПутьНаСервере;
ПозицияПараметра = СтрНайти(ИмяФайла, "?");
Если ПозицияПараметра > 0 Тогда
ИмяФайла = Лев(ИмяФайла, ПозицияПараметра - 1);
КонецЕсли;
ИмяФайла = СтрЗаменить(ИмяФайла, Символы.ПС, "");
ИмяФайла = СтрЗаменить(ИмяФайла, "/", Символы.ПС);
ИмяФайла = СтрЗаменить(ИмяФайла, "\", Символы.ПС);
Результат.Вставить("ИмяФайла", СокрЛП(СтрПолучитьСтроку(ИмяФайла, СтрЧислоСтрок(ИмяФайла))));
Возврат Результат;
КонецФункции
// Заполняет коды по структуре адреса.
//
Функция ЗаполнитьКодыАдреса(Результат, ИдентификаторАдресногоОбъекта, СведенияОДоме)
Коды = КодыПоИдентификаторуАдресногоОбъекта(ИдентификаторАдресногоОбъекта, СведенияОДоме);
Если Коды <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(Результат, Коды);
Для каждого КлючЗначение Из Результат Цикл
Если СтрСравнить(КлючЗначение.Ключ, "Идентификатор") <> 0 Тогда
Результат[КлючЗначение.Ключ] = Формат(КлючЗначение.Значение, "ЧГ=0");
Если СтрСравнить(КлючЗначение.Ключ, "ОКТМО") = 0
И СтрДлина(Результат[КлючЗначение.Ключ]) <> 8
И СтрДлина(Результат[КлючЗначение.Ключ]) <> 11 Тогда
Результат[КлючЗначение.Ключ] = "0" + Результат[КлючЗначение.Ключ];
КонецЕсли;
КонецЕсли;
КонецЦикла;
Результат.Вставить("ИдентификаторДома", ?(ЗначениеЗаполнено(Коды.ИдентификаторДома), Коды.ИдентификаторДома, ""));
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция ВыполнитьЗапросЧерезВебСервис(СтрокаЗапроса, ВремяОжидания = 60)
Сервис = АдресныйКлассификаторПовтИсп.СервисКлассификатора1С(ВремяОжидания);
Результат = Новый Структура("Отказ, ПодробноеПредставлениеОшибки, КодСостояния, Данные");
ТекстURL = ПрефиксВерсииЗапроса() + СтрокаЗапроса;
HTTPЗапрос = Новый HTTPЗапрос(ТекстURL);
Попытка
Ответ = Сервис.Получить(HTTPЗапрос);
Исключение
ОбработатьОшибкуОбращенияКВебСервису(Результат, Ответ, ИнформацияОбОшибке(), ТекстURL);
Возврат Результат;
КонецПопытки;
Результат.Отказ = Ложь;
Результат.КодСостояния = Ответ.КодСостояния;
Если Результат.КодСостояния = 200 Тогда
ПолученныеДанные = Ответ.ПолучитьТелоКакСтроку("UTF-8");
Результат.Данные = СтрокуJSONВСтруктуру(ПолученныеДанные);
Иначе
ОбработатьОшибкуОбращенияКВебСервису(Результат, Ответ, ИнформацияОбОшибке(), ТекстURL);
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ОбработатьОшибкуОбращенияКВебСервису(Результат, Знач Ответ, ИнформацияОбОшибке, ТекстURL)
Результат.Отказ = Истина;
Если Ответ = Неопределено Тогда
Возврат;
КонецЕсли;
ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
Если ПустаяСтрока(ПредставлениеОшибки) Тогда
ПредставлениеОшибки = НСтр("ru = 'Веб-сервис для работы с адресами не доступен по причине:
|- не подключена интернет-поддержка пользователей;
|- неполадки у интернет-провайдера;
|- подключение к серверу блокирует межсетевой экран,
| антивирусная программа или другое программное обеспечение;
|- сервис отключен или на техническом обслуживании.'");
КонецЕсли;
Результат.ПодробноеПредставлениеОшибки = ПредставлениеОшибки;
ОтветОтСервера = Ответ.ПолучитьТелоКакСтроку("UTF-8");
ЗаписатьОшибкуЗапросаКВебСервисуВЖурналРегистрации(ОтветОтСервера, Результат, ТекстURL, Ответ.КодСостояния);
КонецПроцедуры
Процедура ЗаписатьОшибкуЗапросаКВебСервисуВЖурналРегистрации(ОтветОтСервераСтрокой, Результат, ТекстURL, КодСостояния)
ШаблонТекстОтветаСервера = НСтр("ru = '%1
|Техническая информация. При запросе: %2
|сервер вернул HTTP Код: %3
|с текстом: %4'");
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстОтветаСервера,
Результат.ПодробноеПредставлениеОшибки, ТекстURL, КодСостояния, ОтветОтСервераСтрокой);
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);
КонецПроцедуры
// Конвертация
Функция СтруктураВСтрокуJSON(Значение)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Значение,, "АдаптацияПолейКонтактнойИнформации", АдресныйКлассификаторСлужебный);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Функция АдаптацияПолейКонтактнойИнформации(Свойство, Значение, ДополнительныеПараметрыФункцииПреобразования, Отказ) Экспорт
Если ТипЗнч(Значение) = Тип("Null") Тогда
Возврат "";
КонецЕсли;
Если ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда
Возврат Строка(Значение);
КонецЕсли;
КонецФункции
Функция JSONВКонтактнуюИнформациюПоПолям(Значение)
Результат = ОписаниеНовойКонтактнойИнформации();
КонтактнаяИнформация = СтрокуJSONВСтруктуру(Значение);
ЗаполнитьЗначенияСвойств(Результат, КонтактнаяИнформация);
УстановкаТипаКузбассКемеровскойОбласти(Результат);
Возврат Результат;
КонецФункции
Функция СтрокуJSONВСтруктуру(Значение)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Значение);
Результат = ПрочитатьJSON(ЧтениеJSON,,,, "ВосстановлениеПолейКонтактнойИнформации", АдресныйКлассификаторСлужебный);
ЧтениеJSON.Закрыть();
Возврат Результат;
КонецФункции
Функция ВосстановлениеПолейКонтактнойИнформации(Свойство, Значение, ДополнительныеПараметрыФункцииПреобразования) Экспорт
Если СтрЗаканчиваетсяНа(ВРег(Свойство), "ID") И СтрДлина(Значение) = 36 Тогда
Возврат Новый УникальныйИдентификатор(Значение);
КонецЕсли;
Если СтрСравнить(Свойство, "houseType") = 0 Тогда
Возврат ТРег(Значение);
КонецЕсли;
Если (СтрСравнить(Свойство, "buildings") = 0
ИЛИ СтрСравнить(Свойство, "apartments") = 0)
И ТипЗнч(Значение) = Тип("Массив") Тогда
Для Каждого ЗначениеМассива Из Значение Цикл
ЗначениеМассива.type = ТРег(ЗначениеМассива.type);
КонецЦикла;
Возврат Значение;
КонецЕсли;
КонецФункции
// Описание национальных полей структуры контактной информации для хранения ее в формате JSON.
// Основной список полей определяется в одноименной функции общего модуля .
//
// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации -
// Тип контактной информации, определяющий состав полей контактной информации.
//
// Возвращаемое значение:
// Структура - поля контактной информации c типом Адрес добавленные к основным полям:
// * ID - Строка - идентификационный код последнего адресного объекта в иерархи адреса.
// * AddressType - Строка - установленный пользователем тип адреса(только для адресов РФ).
// Варианты: "Муниципальный", "Административно-территориальный".
// * AreaCode - Строка - код региона РФ.
// * AreaID - Строка - идентификатор региона.
// * District - Строка - представление района у адресов по административно-территориальному делению.
// * DistrictType - Строка - сокращение района у адресов по административно-территориальному делению.
// * DistrictID - Строка - идентификатор региона у адресов по административно-территориальному делению.
// * MunDistrict - Строка - представление муниципального района у адресов по муниципальному делению.
// * MunDistrictType - Строка - сокращение муниципального района у адресов по муниципальному делению.
// * MunDistrictID - Строка - идентификатор муниципального района у адресов по муниципальному делению.
// * CityID - Строка - идентификатор муниципального города у адресов по административно-территориальному делению.
// * Settlement - Строка - представление поселения у адресов по муниципальному делению.
// * SettlementType - Строка - сокращение поселения у адресов по муниципальному делению.
// * SettlementID - Строка - идентификатор поселения.
// * CityDistrict - Строка - представление внутригородского района.
// * CityDistrictType - Строка - сокращение внутригородского района.
// * CityDistrictID - Строка - идентификатор внутригородского района.
// * Territory - Строка - представление территории.
// * TerritoryType - Строка - сокращение территории.
// * TerritoryID - Строка - идентификатор территории.
// * Locality - Строка - представление населенного пункта.
// * LocalityType - Строка - сокращение населенного пункта.
// * LocalityID - Строка - идентификатор населенного пункта.
// * StreetID - Строка - идентификатор улицы.
// * HouseType - Строка - тип дома, владения.
// * HouseNumber - Строка - номер дома, владения.
// * HouseID - Строка - идентификатор дома.
// * Buildings - Массив - содержит структуры(поля структуры: type, number) с перечнем корпусов (строений) адреса.
// * Apartments - Массив - содержит структуры(поля структуры: type, number) с перечнем помещений адреса.
// * CodeKLADR - Строка - код КЛАДР.
// * OKTMO - Строка - код ОКТМО.
// * OKATO - Строка - код ОКАТО.
// * IFNSFLCode - Строка - код ИФНСФЛ.
// * IFNSULCode - Строка - код ИФНСЮЛ.
// * IFNSFLAreaCode - Строка - код участка ИФНСФЛ.
// * IFNSULAreaCode - Строка - код участка ИФНСЮЛ.
//
Функция ОписаниеНовойКонтактнойИнформации()
Результат = Новый Структура;
Результат.Вставить("value", "");
Результат.Вставить("comment", "");
Результат.Вставить("type", "Адрес");
Результат.Вставить("country", "");
Результат.Вставить("addressType", АдресВСвободнойФорме());
Результат.Вставить("countryCode", "");
Результат.Вставить("ZIPcode", "");
Результат.Вставить("area", "");
Результат.Вставить("areaType", "");
Результат.Вставить("city", "");
Результат.Вставить("cityType", "");
Результат.Вставить("street", "");
Результат.Вставить("streetType", "");
Результат.Вставить("id", "");
Результат.Вставить("areaCode", "");
Результат.Вставить("areaId", "");
Результат.Вставить("district", "");
Результат.Вставить("districtType", "");
Результат.Вставить("districtId", "");
Результат.Вставить("munDistrict", "");
Результат.Вставить("munDistrictType", "");
Результат.Вставить("munDistrictId", "");
Результат.Вставить("cityId", "");
Результат.Вставить("settlement", "");
Результат.Вставить("settlementType", "");
Результат.Вставить("settlementId", "");
Результат.Вставить("cityDistrict", "");
Результат.Вставить("cityDistrictType", "");
Результат.Вставить("cityDistrictId", "");
Результат.Вставить("territory", "");
Результат.Вставить("territoryType", "");
Результат.Вставить("territoryId", "");
Результат.Вставить("locality", "");
Результат.Вставить("localityType", "");
Результат.Вставить("localityId", "");
Результат.Вставить("streetId", "");
Результат.Вставить("houseType", "");
Результат.Вставить("houseNumber", "");
Результат.Вставить("houseId", "");
Результат.Вставить("stead", "");
Результат.Вставить("steadId", "");
Результат.Вставить("buildings", Новый Массив);
Результат.Вставить("apartments", Новый Массив);
Результат.Вставить("codeKLADR", "");
Результат.Вставить("oktmo", "");
Результат.Вставить("okato", "");
Результат.Вставить("asInDocument", "");
Результат.Вставить("ifnsFLCode", "");
Результат.Вставить("ifnsULCode", "");
Результат.Вставить("ifnsFLAreaCode", "");
Результат.Вставить("ifnsULAreaCode", "");
Возврат Результат;
КонецФункции
Процедура СписокДомовИзЗагруженныхСведений(Знач ВариантыДомов, Знач ИдентификаторАдресногоОбъекта, Знач СтрокаПоиска, Знач ТочноеСовпадение)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ДомаЗданияСтроения.Строения КАК Строения,
| ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО,
| ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс,
| ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ,
| ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК ОКАТО,
| ЕСТЬNULL(АдресныеОбъекты.КодКЛАДР, """") КАК КодКЛАДР
|ИЗ
| РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО (ДополнительныеСведения.Идентификатор = ДомаЗданияСтроения.ДополнительныеАдресныеСведения)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Идентификатор = ДомаЗданияСтроения.АдресныйОбъект)
|ГДЕ
| ДомаЗданияСтроения.АдресныйОбъект = &АдресныйОбъект";
Запрос.УстановитьПараметр("АдресныйОбъект", ИдентификаторАдресногоОбъекта);
Запись = Запрос.Выполнить().Выбрать();
Пока Запись.Следующий() Цикл
Если ЗначениеЗаполнено(Запись.Строения) Тогда
Описание = Запись.Строения.Получить();
Если ЗначениеЗаполнено(Описание) Тогда
ИзвлечьСписокДомов(Описание, СтрокаПоиска, ВариантыДомов, Запись, ТочноеСовпадение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Возвращаемое значение:
// ТаблицаЗначений:
// * ДомЧислом - Число
// * Дом - Строка
// * Корпус - Строка
// * Строение - Строка
// * Значение - см. ОписаниеДомаИСтроения
// * Представление - Строка
// * Идентификатор - Строка
//
Функция КонструкторСпискаДомов() Экспорт
ВариантыДомов = Новый ТаблицаЗначений;
ВариантыДомов.Колонки.Добавить("ДомЧислом", ОбщегоНазначения.ОписаниеТипаЧисло(12));
ВариантыДомов.Колонки.Добавить("Дом", ОбщегоНазначения.ОписаниеТипаСтрока(20));
ВариантыДомов.Колонки.Добавить("Корпус", ОбщегоНазначения.ОписаниеТипаСтрока(20));
ВариантыДомов.Колонки.Добавить("Строение", ОбщегоНазначения.ОписаниеТипаСтрока(20));
ВариантыДомов.Колонки.Добавить("Значение");
ВариантыДомов.Колонки.Добавить("Представление");
ВариантыДомов.Колонки.Добавить("Идентификатор");
Возврат ВариантыДомов;
КонецФункции
Функция СопоставлениеУровнейАдреса()
Уровни = Новый Массив;
Уровни.Добавить("Area");
Уровни.Добавить("MunDistrict");
Уровни.Добавить("District");
Уровни.Добавить("Settlement");
Уровни.Добавить("City");
Уровни.Добавить("CityDistrict");
Уровни.Добавить("Locality");
Уровни.Добавить("Territory");
Уровни.Добавить("Street");
Возврат Уровни;
КонецФункции
Процедура УстановитьЗначениеУровняАдреса(Адрес, СтруктураДанных, ИмяУровня)
Адрес[ИмяУровня] = СокрЛП(СтруктураДанных[ИмяУровня]);
Адрес[ИмяУровня + "Type"] = СокрЛП(СтруктураДанных[ИмяУровня + "Type"]);
Адрес[ИмяУровня + "Id"] = СтруктураДанных[ИмяУровня + "Id"];
КонецПроцедуры
// Возвращает структуру, описывающую населенный пункт в иерархии младший-старший
// для текущего адресного классификатора. Имена ключей структуры зависят от
// классификатора.
//
// Параметры:
// Идентификатор - УникальныйИдентификатор - идентификатор объекта. Если указан, то структура
// заполняется данными для этого объекта.
// ВариантКлассификатора - Строка - требуемый вид классификатора.
//
// Возвращаемое значение:
// Структура - описание населенного пункта.
//
Функция СформироватьАдресПоДаннымИзКлассификатора(АдресныеСведенияДанные)
Адрес = ОписаниеНовойКонтактнойИнформации();
ЗаполнитьЗначенияСвойств(Адрес, АдресныеСведенияДанные);
Если ПустаяСтрока(Адрес.Country) Тогда
Адрес.Вставить("Country", Строка(ОсновнаяСтрана()));
КонецЕсли;
Для каждого ИмяУровня Из СопоставлениеУровнейАдреса() Цикл
УстановитьЗначениеУровняАдреса(Адрес, АдресныеСведенияДанные, ИмяУровня);
КонецЦикла;
Возврат Адрес;
КонецФункции
Функция СведенияОДоме()
СведенияОДоме = Новый Структура();
СведенияОДоме.Вставить("НомерДома", "");
СведенияОДоме.Вставить("ТипДома", "");
СведенияОДоме.Вставить("НомерКорпуса", "");
СведенияОДоме.Вставить("НомерСтроения", "");
СведенияОДоме.Вставить("ТипСтроения", "");
Возврат СведенияОДоме;
КонецФункции
/////////////////////////////////////
// Обратная совместимость
// Возвращает признак того, является ли строка данных контактной информации XML данными.
//
// Параметры:
// Текст - Строка - проверяемая строка.
//
// Возвращаемое значение:
// Булево - результат проверки.
//
Функция ЭтоКонтактнаяИнформацияВXML(Знач Текст)
Возврат ТипЗнч(Текст) = Тип("Строка") И СтрНачинаетсяС(СокрЛ(Текст), "<");
КонецФункции
Функция АдресВСвободнойФорме()
Возврат "ВСвободнойФорме";
КонецФункции
// Возвращает значения уровней 90(дополнительный элемент) и 91(подчиненный) из адреса.
//
Функция ЗначениеДополнительныхЭлементов(Знач XDTOАдрес)
Результат = Новый Структура("ДополнительныйЭлемент, ПодчиненныйЭлемент");
АдресРФ = НациональныйАдрес(XDTOАдрес);
Если АдресРФ = Неопределено Тогда
Возврат Результат;
КонецЕсли;
ДополнительныйЭлементАдреса = НайтиДополнительныйЭлементАдреса(АдресРФ).Значение;
Результат.ДополнительныйЭлемент = ДополнительныйЭлементАдреса;
Результат.ПодчиненныйЭлемент = ДополнительныйЭлементАдреса(АдресРФ, XPathДополнительногоОбъектаАдресации(91));
Возврат Результат;
КонецФункции
// Читает и устанавливает здания и помещения адреса.
//
// Параметры:
// XDTOАдрес - ОбъектXDTO - контактная информация или XDTO адреса.
// НовоеЗначение - Структура - устанавливаемое значение. Ожидаются поля:
// * Здания - ТаблицаЗначений:
// ** Тип - Строка - тип внутреннего классификатора дополнительных адресных
// объектов. Например "Корпус".
// ** Значение - Строка - значение номера дома, квартиры и т.п.
// * Помещения - ТаблицаЗначений - с колонками, аналогично полю Здание.
//
// Возвращаемое значение:
// Структура - текущие данные. Содержит поля:
// * Здания - ТаблицаЗначений:
// ** Тип - Строка - тип внутреннего классификатора дополнительных адресных объектов.
// Например "Корпус".
// ** Сокращение - Строка - сокращение названия для использования в представлении.
// ** Значение - Строка - значение номера дома, квартиры и т.п.
// ** ПутьXPath - Строка - путь к значению объекта.
// * Помещения - ТаблицаЗначений - с колонками, аналогично полю Здание.
//
Функция ЗданияИПомещенияАдреса(XDTOАдрес, НовоеЗначение = Неопределено)
Результат = Новый Структура("Здания, Помещения",
ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид"),
ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид"));
АдресРФ = НациональныйАдрес(XDTOАдрес);
Если АдресРФ = Неопределено Тогда
Возврат Результат;
КонецЕсли;
Если НовоеЗначение <> Неопределено Тогда
// Запись
Если НовоеЗначение.Свойство("Здания") Тогда
Для Каждого Строка Из НовоеЗначение.Здания Цикл
ВставитьЗданиеПомещение(XDTOАдрес, Строка.Тип, Строка.Значение);
КонецЦикла;
КонецЕсли;
Если НовоеЗначение.Свойство("Помещения") Тогда
Для Каждого Строка Из НовоеЗначение.Помещения Цикл
ВставитьЗданиеПомещение(XDTOАдрес, Строка.Тип, Строка.Значение);
КонецЦикла;
КонецЕсли;
Возврат НовоеЗначение
КонецЕсли;
// Чтение
Для Каждого ДопЭлемент Из АдресРФ.ДопАдрЭл Цикл
Если ДопЭлемент.Номер <> Неопределено Тогда
КодОбъекта = ДопЭлемент.Номер.Тип;
ТипОбъекта = ТипОбъектаПоКодуСериализации(КодОбъекта);
Если ТипОбъекта <> Неопределено Тогда
Вид = ТипОбъекта.Тип;
Если Вид = 1 Или Вид = 2 Тогда
НоваяСтрока = Результат.Здания.Добавить();
ИначеЕсли Вид = 3 Тогда
НоваяСтрока = Результат.Помещения.Добавить();
Иначе
НоваяСтрока = Неопределено;
КонецЕсли;
Если НоваяСтрока <> Неопределено Тогда
НоваяСтрока.Тип = ТипОбъекта.Наименование;
НоваяСтрока.Значение = ДопЭлемент.Номер.Значение;
НоваяСтрока.Сокращение = ТипОбъекта.Сокращение;
НоваяСтрока.ПутьXPath = XPathНомераДополнительногоОбъектаАдресации(НоваяСтрока.Тип);
НоваяСтрока.Вид = Вид;
КонецЕсли;
Иначе
НоваяСтрока = Результат.Помещения.Добавить();
НоваяСтрока.Тип = ДопЭлемент.Номер.Тип;
НоваяСтрока.Значение = ДопЭлемент.Номер.Значение;
НоваяСтрока.Сокращение = ДопЭлемент.Номер.Тип;
НоваяСтрока.ПутьXPath = XPathНомераДополнительногоОбъектаАдресации("2000");
НоваяСтрока.Вид = 3;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Результат.Здания.Сортировать("Вид");
Результат.Помещения.Сортировать("Вид");
Возврат Результат;
КонецФункции
Процедура ВставитьЗданиеПомещение(XDTOАдрес, Тип, Значение)
Если ПустаяСтрока(Значение) Тогда
Возврат;
КонецЕсли;
Запись = XDTOАдрес.Получить(XPathНомераДополнительногоОбъектаАдресации(Тип));
Если Запись = Неопределено Тогда
Запись = XDTOАдрес.ДопАдрЭл.Добавить( ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип));
Запись.Номер = ФабрикаXDTO.Создать(Запись.Свойства().Получить("Номер").Тип);
Запись.Номер.Значение = Значение;
КодТипа = КодСериализацииОбъектаАдресации(Тип);
Если КодТипа = Неопределено Тогда
КодТипа = Тип;
КонецЕсли;
Запись.Номер.Тип = КодТипа
Иначе
Запись.Значение = Значение;
КонецЕсли;
КонецПроцедуры
// Конструктор таблицы значений.
//
Функция ТаблицаЗначений(СписокКолонок, СписокИндексов = "")
ТаблицаРезультата = Новый ТаблицаЗначений;
Для Каждого КлючЗначение Из (Новый Структура(СписокКолонок)) Цикл
ТаблицаРезультата.Колонки.Добавить(КлючЗначение.Ключ);
КонецЦикла;
СтрокиИндексов = СтрЗаменить(СписокИндексов, "|", Символы.ПС);
Для НомерИндекса = 1 По СтрЧислоСтрок(СтрокиИндексов) Цикл
КолонкиИндекса = СокрЛП(СтрПолучитьСтроку(СтрокиИндексов, НомерИндекса));
Для Каждого КлючЗначение Из (Новый Структура(КолонкиИндекса)) Цикл
ТаблицаРезультата.Индексы.Добавить(КлючЗначение.Ключ);
КонецЦикла;
КонецЦикла;
Возврат ТаблицаРезультата;
КонецФункции
Функция КодСериализацииДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента = "")
Если Уровень = 90 Тогда
Если ВРег(ТипаАдресногоЭлемента) = "ГСК" Тогда
Возврат "10600000";
ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "СНТ" Тогда
Возврат "10300000";
ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "ТЕР" Тогда
Возврат "10700000";
Иначе
Возврат "10200000";
КонецЕсли;
ИначеЕсли Уровень = 91 Тогда
Возврат "10400000";
КонецЕсли;
// Все остальное - считаем ориентиром.
Возврат "Местоположение";
КонецФункции
// Возвращает XPath для дополнительного объекта адресации по умолчанию.
//
// Параметры:
// Уровень - Число - уровень объекта. 90 - дополнительный(Варианты: ГСК, СНТ, ТЕР), 91 - подчиненный, -1 -
// Ориентир.
//
// Возвращаемое значение:
// Строка - XPath
//
Функция XPathДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента = "")
КодСериализации = КодСериализацииДополнительногоОбъектаАдресации(Уровень, ТипаАдресногоЭлемента);
Возврат "ДопАдрЭл[ТипАдрЭл='" + КодСериализации + "']";
КонецФункции
Функция ПочтовыйИндексАдреса(XDTOАдрес, НовоеЗначение = Неопределено)
АдресРФ = НациональныйАдрес(XDTOАдрес);
Если АдресРФ = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если НовоеЗначение = Неопределено Тогда
// Чтение
Результат = АдресРФ.Получить(XPathПочтовогоИндекса());
Если Результат <> Неопределено Тогда
Результат = Результат.Значение;
КонецЕсли;
Возврат Результат;
КонецЕсли;
// Запись
КодИндекса = КодСериализацииПочтовогоИндекса();
ЗаписьИндекса = АдресРФ.Получить(XPathПочтовогоИндекса());
Если ЗаписьИндекса = Неопределено Тогда
ДопАдрЭл = АдресРФ.ДопАдрЭл; // СписокXDTO
ЗаписьИндекса = ДопАдрЭл.Добавить(ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип));
ЗаписьИндекса.ТипАдрЭл = КодИндекса;
КонецЕсли;
ЗаписьИндекса.Значение = СокрЛП(НовоеЗначение);
Возврат НовоеЗначение;
КонецФункции
Функция КодСериализацииОбъектаАдресации(СтрокаЗначения)
Ключ = ВРег(СокрЛП(СтрокаЗначения));
Для Каждого Элемент Из ТипыОбъектовАдресацииАдресаРФ() Цикл
Если Элемент.Ключ = Ключ Тогда
Возврат Элемент.Код;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
// Возвращает массив структур с информацией о частях адреса согласно приказу ФНС ММВ-7-1/525 от 31.08.2011.
//
// Возвращаемое значение:
// Массив из см. СтрокаОбъектаАдресации
//
Функция ТипыОбъектовАдресацииАдресаРФ()
Результат = Новый Массив;
// Код, Наименование, Тип, Порядок, КодАдресногоКлассификатора
// Тип: 1 - владение, 2 - здание, 3 - помещение.
Результат.Добавить(СтрокаОбъектаАдресации("1010", "Дом", 1, 1, 2)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("1020", "Владение", 1, 2, 1)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("1030", "Домовладение", 1, 3, 3)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("1050", "Корпус", 2, 1)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("1060", "Строение", 2, 2, 1)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("1080", "Литера", 2, 3, 3)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("1090", "Литер", 2, 6, 3)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("1070", "Сооружение", 2, 4, 2)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("1040", "Участок", 2, 5)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2010", "Квартира", 3, 1)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2030", "Офис", 3, 2)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2040", "Бокс", 3, 3)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2020", "Помещение", 3, 4)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2050", "Комната", 3, 5)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2060", "Этаж", 3, 6)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2070", "А/я", 3, 7)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2080", "В/ч", 3, 8)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2090", "П/о", 3, 9)); // не локализуется
// Наши сокращения для поддержки обратной совместимости при парсинге.
Результат.Добавить(СтрокаОбъектаАдресации("2010", "кв.", 3, 6)); // не локализуется
Результат.Добавить(СтрокаОбъектаАдресации("2030", "оф.", 3, 7)); // не локализуется
// Ввод помещения вручную.
Результат.Добавить(СтрокаОбъектаАдресации("2000", "", 3, 0));
// Уточняющие объекты
Результат.Добавить(СтрокаОбъектаАдресации("10100000", НСтр("ru = 'Почтовый индекс'")));
Результат.Добавить(СтрокаОбъектаАдресации("10200000", НСтр("ru = 'Адресная точка'")));
Результат.Добавить(СтрокаОбъектаАдресации("10300000", НСтр("ru = 'Садовое товарищество'")));
Результат.Добавить(СтрокаОбъектаАдресации("10400000", НСтр("ru = 'Элемент улично-дорожной сети, планировочной структуры дополнительного адресного элемента'")));
Результат.Добавить(СтрокаОбъектаАдресации("10500000", НСтр("ru = 'Промышленная зона'")));
Результат.Добавить(СтрокаОбъектаАдресации("10600000", НСтр("ru = 'Гаражно-строительный кооператив'")));
Результат.Добавить(СтрокаОбъектаАдресации("10700000", НСтр("ru = 'Территория'")));
Возврат Результат;
КонецФункции
// Параметры:
// Код - Строка
// Наименование - Строка
// Тип - Число
// Порядок - Число
// КодАдресногоКлассификатора - Число
// Возвращаемое значение:
// Структура:
// * Ключ - Строка
// * Сокращение - Строка
// * КодАдресногоКлассификатора - Число
// * Порядок - Число
// * Тип - Число
// * Наименование - Строка
// * Код - Строка
//
Функция СтрокаОбъектаАдресации(Код, Наименование, Тип = 0, Порядок = 0, КодАдресногоКлассификатора = 0)
СтруктураОбъектаАдресации = Новый Структура;
СтруктураОбъектаАдресации.Вставить("Код", Код);
СтруктураОбъектаАдресации.Вставить("Наименование", Наименование);
СтруктураОбъектаАдресации.Вставить("Тип", Тип);
СтруктураОбъектаАдресации.Вставить("Порядок", Порядок);
СтруктураОбъектаАдресации.Вставить("КодАдресногоКлассификатора", КодАдресногоКлассификатора);
СтруктураОбъектаАдресации.Вставить("Сокращение", НРег(Наименование));
СтруктураОбъектаАдресации.Вставить("Ключ", ВРег(Наименование));
Возврат СтруктураОбъектаАдресации;
КонецФункции
// Возвращает код дополнительной части адреса для почтового индекса.
//
// Возвращаемое значение:
// Строка - код
//
Функция КодСериализацииПочтовогоИндекса()
Возврат КодСериализацииОбъектаАдресации(НСтр("ru = 'Почтовый индекс'"));
КонецФункции
// Читает и устанавливает район адреса.
//
// Параметры:
// XDTOАдрес - ОбъектXDTO - контактная информация или XDTO адреса.
// НовоеЗначение - Строка - устанавливаемое значение.
//
// Возвращаемое значение:
// Строка - новое значение.
//
Функция РайонАдреса(XDTOАдрес, НовоеЗначение = Неопределено)
Если НовоеЗначение = Неопределено Тогда
// Чтение
XDTOТип = XDTOАдрес.Тип();
Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен(), "АдресРФ")
Или XDTOТип = ФабрикаXDTO.Тип("http://www.v8.1c.ru/ssl/contactinfo_ru", "АдресРФ") Тогда
АдресРФ = XDTOАдрес;
Иначе
АдресРФ = XDTOАдрес.Состав;
КонецЕсли;
Если ТипЗнч(АдресРФ) = Тип("ОбъектXDTO") Тогда
Возврат ПолучитьXDTOРеквизитОбъекта(АдресРФ, XPathРайона());
КонецЕсли;
Возврат Неопределено;
КонецЕсли;
// Запись
Запись = СвРайМО(XDTOАдрес);
Запись.Район = НовоеЗначение;
Возврат НовоеЗначение;
КонецФункции
Функция СвРайМО(АдресРФ)
Если АдресРФ.СвРайМО <> Неопределено Тогда
Возврат АдресРФ.СвРайМО;
КонецЕсли;
АдресРФ.СвРайМО = ФабрикаXDTO.Создать( АдресРФ.Свойства().Получить("СвРайМО").Тип );
Возврат АдресРФ.СвРайМО;
КонецФункции
// Возвращает XPath для района.
//
// Возвращаемое значение:
// Строка - XPath
//
Функция XPathРайона()
Возврат "СвРайМО/Район";
КонецФункции
// Возвращает извлеченный XDTO российского адреса или Неопределено для адреса иностранного.
//
// Параметры:
// ОбъектИнформации - ОбъектXDTO - контактная информация или XDTO адреса.
//
// Возвращаемое значение:
// ОбъектXDTO - российский адрес.
// Неопределено - нет российского адреса.
//
Функция НациональныйАдрес(ОбъектИнформации)
Результат = Неопределено;
ТипXDTO = Тип("ОбъектXDTO");
Если ТипЗнч(ОбъектИнформации) = ТипXDTO Тогда
ПространствоИмен = ПространствоИмен();
Если ОбъектИнформации.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация") Тогда
Адрес = ОбъектИнформации.Состав;
Иначе
Адрес = ОбъектИнформации;
КонецЕсли;
Если ТипЗнч(Адрес) = ТипXDTO И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда
Адрес = Адрес.Состав;
КонецЕсли;
Если ТипЗнч(Адрес) = ТипXDTO Тогда
Результат = Адрес;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЗначениеСтроенияИлиПомещения(Тип, Значение)
Возврат Новый Структура("type, number", Тип, Значение);
КонецФункции
// Возвращает дополнительный адреса.
//
Функция НайтиДополнительныйЭлементАдреса(АдресРФ)
ВариантыДополнительногоЭлементаАдреса = ВариантыДополнительногоЭлементаАдреса();
ПутьXPath = "";
ДополнительныйЭлементАдреса = Неопределено;
Для каждого ВариантДополнительныйЭлементАдреса Из ВариантыДополнительногоЭлементаАдреса Цикл
ПутьXPath = XPathДополнительногоОбъектаАдресации(90, ВариантДополнительныйЭлементАдреса);
ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, ПутьXPath);
Если ДополнительныйЭлементАдреса <> Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Новый Структура("Значение, XPath", ДополнительныйЭлементАдреса, ПутьXPath);
КонецФункции
Функция ВариантыДополнительногоЭлементаАдреса()
ВариантыДополнительногоЭлементаАдреса = Новый Массив;
ВариантыДополнительногоЭлементаАдреса.Добавить("СНТ");
ВариантыДополнительногоЭлементаАдреса.Добавить("ГСК");
ВариантыДополнительногоЭлементаАдреса.Добавить("ТЕР");
ВариантыДополнительногоЭлементаАдреса.Добавить("");
Возврат ВариантыДополнительногоЭлементаАдреса;
КонецФункции
// Читает дополнительные элемент адреса по его пути.
//
// Параметры:
// XDTOАдрес - ОбъектXDTO - контактная информация или XDTO адреса.
// XPathЭлемента - Строка - путь к элементу.
//
// Возвращаемое значение:
// Строка - значение элемента.
//
Функция ДополнительныйЭлементАдреса(XDTOАдрес, XPathЭлемента)
АдресРФ = НациональныйАдрес(XDTOАдрес);
Если АдресРФ = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Результат = АдресРФ.Получить(XPathЭлемента);
Если Результат <> Неопределено Тогда
Возврат Результат.Значение;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура СформироватьКодыКЛАДР(КодКЛАДР, Адрес, КодыКЛАДР)
КодКЛАДР = Формат(КодКЛАДР, "ЧРГ=''; ЧГ=0");
Если СтрДлина(КодКЛАДР) = 17 Тогда
КодыКЛАДР.Улица = КодКЛАДР;
КодКЛАДР = Лев(КодКЛАДР, 13);
Иначе
КодКЛАДР = Лев(КодКЛАДР, 13);
КонецЕсли;
Если СтрДлина(КодКЛАДР) = 12 Тогда
КодКЛАДР = "0" + КодКЛАДР;
КонецЕсли;
Если СтрДлина(КодКЛАДР) = 13 Тогда
Если ЗначениеЗаполнено(Адрес.Area) Тогда
КодыКЛАДР.Регион = Лев(КодКЛАДР, 2) + "00000000000";
КонецЕсли;
Если ЗначениеЗаполнено(Адрес.District) Тогда
КодыКЛАДР.Район = Лев(КодКЛАДР, 5) + "00000000";
КонецЕсли;
Если ЗначениеЗаполнено(Адрес.City) Тогда
КодыКЛАДР.Город = Лев(КодКЛАДР, 8) + "00000";
КонецЕсли;
Если ЗначениеЗаполнено(Адрес.Settlement) Тогда
КодыКЛАДР.НаселенныйПункт = Лев(КодКЛАДР, 11) + "00";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Получение глубокого свойства объекта.
//
Функция ПолучитьXDTOРеквизитОбъекта(ОбъектXTDO, XPath)
// Переносов строки в XPath не ожидаем.
СтрокаСвойств = СтрЗаменить(СтрЗаменить(XPath, "/", Символы.ПС), Символы.ПС + Символы.ПС, "/");
ЧислоСвойств = СтрЧислоСтрок(СтрокаСвойств);
Если ЧислоСвойств = 1 Тогда
Результат = ОбъектXTDO.Получить(СтрокаСвойств);
Если ТипЗнч(Результат) = Тип("ОбъектXDTO") Тогда
Возврат Результат.Значение;
КонецЕсли;
Возврат Результат;
КонецЕсли;
Результат = ?(ЧислоСвойств = 0, Неопределено, ОбъектXTDO);
Для Индекс = 1 По ЧислоСвойств Цикл
Результат = Результат.Получить(СтрПолучитьСтроку(СтрокаСвойств, Индекс));
Если Результат = Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Возвращает строку с описанием типа по коду части адреса.
// Противоположность функции "КодСериализацииОбъектаАдресации".
//
// Параметры:
// Код - Строка - код
//
// Возвращаемое значение:
// Число - тип
//
Функция ТипОбъектаПоКодуСериализации(Код)
Для Каждого Элемент Из ТипыОбъектовАдресацииАдресаРФ() Цикл
Если Элемент.Код = Код Тогда
Возврат Элемент;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
// Возвращает XPath для номера дополнительного объекта адресации.
//
// Параметры:
// СтрокаЗначения - Строка - искомый тип, например "Дом", "Корпус".
//
// Возвращаемое значение:
// Строка - XPath
//
Функция XPathНомераДополнительногоОбъектаАдресации(СтрокаЗначения)
Код = КодСериализацииОбъектаАдресации(СтрокаЗначения);
Если Код = Неопределено Тогда
Код = СтрЗаменить(СтрокаЗначения, "'", "");
КонецЕсли;
Возврат "ДопАдрЭл/Номер[Тип='" + Код + "']";
КонецФункции
// Возвращает XPath для почтового индекса.
//
// Возвращаемое значение:
// Строка - XPath
//
Функция XPathПочтовогоИндекса()
Возврат "ДопАдрЭл[ТипАдрЭл='" + КодСериализацииПочтовогоИндекса() + "']";
КонецФункции
Функция АдресПустой(Знач Владелец)
// Список игнорируемых при сравнении свойств текущего владельца - особенности контактной информации.
СписокИгнорируемыхПолей = Новый Соответствие;
СписокИгнорируемыхПолей.Вставить("value", Истина);
СписокИгнорируемыхПолей.Вставить("comment", Истина);
СписокИгнорируемыхПолей.Вставить("type", Истина);
СписокИгнорируемыхПолей.Вставить("addressType", Истина);
СписокИгнорируемыхПолей.Вставить("country", Истина);
СписокИгнорируемыхПолей.Вставить("countryCode", Истина);
Для каждого ПолеАдреса Из Владелец Цикл
Если СписокИгнорируемыхПолей.Получить(ПолеАдреса.Ключ) <> Истина И ЗначениеЗаполнено(ПолеАдреса.Значение) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Функция ЗаполненыВсеИдентификаторыОбъекта(Адрес)
Для каждого ИмяУровня Из ИменаУровнейАдреса(Адрес.Type, Истина) Цикл
Если ЗначениеЗаполнено(Адрес[ИмяУровня]) И ПустаяСтрока(Адрес[ИмяУровня + "Id"]) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Функция КонтактнаяИнформацияВФорматеКлючЗначениеВJSON(Адрес)
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
АдресСтруктура = КонтактнаяИнформацияВСтруктуруJSON(МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(Адрес));
Возврат АдресСтруктура;
КонецЕсли;
ВызватьИсключение НСтр("ru = 'Переданный адрес не может быть преобразован в функции АдресныйКлассификаторСлужебный.КодыАдреса.'");
КонецФункции
Функция ЭтоКонтактнаяИнформацияВФорматеКлючЗначение(Адрес)
Возврат СтрНайти(ВРег(Адрес),"РЕГИОН=") > 0;
КонецФункции
Функция МаксимальныйРазмерНабораЗаписей()
Возврат 3000;
КонецФункции
Функция ЭтоГородФедеральногоЗначения(Город)
НазванияГородовФедеральногоЗначения = НазванияГородовФедеральногоЗначения();
Возврат НазванияГородовФедеральногоЗначения.Получить(ВРег(Город)) = Истина;
КонецФункции
// Возвращает массив наименований регионов - городов федерального значения.
Функция НазванияГородовФедеральногоЗначения()
Результат = Новый Соответствие;
Результат.Вставить("МОСКВА Г", Истина);
Результат.Вставить("САНКТ-ПЕТЕРБУРГ Г", Истина);
Результат.Вставить("СЕВАСТОПОЛЬ Г", Истина);
Результат.Вставить("БАЙКОНУР Г", Истина);
Возврат Результат;
КонецФункции
Функция ОписаниеЗемельногоУчастка()
ОписаниеДома = Новый Структура;
ОписаниеДома.Вставить("Дом", "");
ОписаниеДома.Вставить("Идентификатор");
ОписаниеДома.Вставить("Индекс", "");
ОписаниеДома.Вставить("ОКТМО", "");
ОписаниеДома.Вставить("ОКАТО", "");
ОписаниеДома.Вставить("КодИФНСФЛ", "");
ОписаниеДома.Вставить("КодИФНСЮЛ", "");
ОписаниеДома.Вставить("КодУчасткаИФНСФЛ", "");
ОписаниеДома.Вставить("КодУчасткаИФНСЮЛ", "");
ОписаниеДома.Вставить("КодКЛАДР", "");
Возврат ОписаниеДома;
КонецФункции
// Извлекает список земельных участков из регистра сведений ЗемельныеУчастки.
//
Процедура ИзвлечьСписокЗемельныхУчастков(СтрокаСоСпискомУчастков, СтрокаПоиска, ВариантыЗемельныхУчастков, Запись, ТочноеСовпадение)
МассивУчастков = СтрРазделить(СтрокаСоСпискомУчастков, Символы.Таб, Ложь);
ПодборВариантовЗемельныхУчастков = ЗначениеЗаполнено(СтрокаПоиска);
Для каждого Участок Из МассивУчастков Цикл
НомерУчастка = СтрРазделить(Сред(Участок, 25), "~", Истина);
ОписаниеУчастка = ОписаниеЗемельногоУчастка();
ОписаниеУчастка.Дом = НомерУчастка[0];
ОписаниеУчастка.Идентификатор = УникальныйИдентификаторИзСтроки64(Лев(Участок, 24));
ОписаниеУчастка.Индекс = Формат(Запись.ПочтовыйИндекс, "ЧГ=0");
ОписаниеУчастка.ОКТМО = Формат(Запись.ОКТМО, "ЧГ=0");
ОписаниеУчастка.ОКАТО = Формат(Запись.ОКАТО, "ЧГ=0");
ОписаниеУчастка.КодИФНСФЛ = Формат(Запись.КодИФНСФЛ, "ЧГ=0");
ОписаниеУчастка.КодИФНСЮЛ = Формат(Запись.КодИФНСЮЛ, "ЧГ=0");
ОписаниеУчастка.КодУчасткаИФНСФЛ = Формат(Запись.КодУчасткаИФНСФЛ, "ЧГ=0");
ОписаниеУчастка.КодУчасткаИФНСЮЛ = Формат(Запись.КодУчасткаИФНСЮЛ, "ЧГ=0");
ОписаниеУчастка.КодКЛАДР = Формат(Запись.КодКЛАДР, "ЧГ=0");
Если ПодборВариантовЗемельныхУчастков Тогда
Если ТочноеСовпадение И СтрСравнить(ОписаниеУчастка.Дом, СтрокаПоиска) = 0 Тогда
ЗемельныйУчасток = ВариантыЗемельныхУчастков.Добавить();
ЗемельныйУчасток.Представление = НомерУчастка[0];
ЗемельныйУчасток.Значение = ОписаниеУчастка;
ИначеЕсли СтрНачинаетсяС(ОписаниеУчастка.Дом, СтрокаПоиска) Тогда
ЗемельныйУчасток = ВариантыЗемельныхУчастков.Добавить();
ЗемельныйУчасток.Представление = НомерУчастка[0];
ЗемельныйУчасток.Значение = ОписаниеУчастка;
КонецЕсли;
Иначе
ЗемельныйУчасток = ВариантыЗемельныхУчастков.Добавить();
ЗемельныйУчасток.Представление = НомерУчастка[0];
ЗемельныйУчасток.Значение = ОписаниеУчастка;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура УстановитьИдентификаторыДляМуниципальногоАдреса(Адрес)
КопияАдреса = ОбщегоНазначения.СкопироватьРекурсивно(Адрес);
КопияАдреса.munDistrict = "";
КопияАдреса.munDistrictType = "";
КопияАдреса.settlement = "";
КопияАдреса.settlementType = "";
УстановитьИдентификаторыАдресаПоЗагруженнымДанным(КопияАдреса);
ЗаполнитьЗначенияСвойств(Адрес, КопияАдреса, "cityDistrictId,localityId,territoryId,
|streetId, houseId, steadId");
КонецПроцедуры
Процедура СписокЗемельныхУчастковИзЗагруженныхСведений(Знач ВариантыЗемельныхУчастков, Знач ИдентификаторАдресногоОбъекта, Знач СтрокаПоиска, Знач ТочноеСовпадение)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЗемельныеУчастки.Участки КАК Участки,
| ЕСТЬNULL(ДополнительныеСведения.ОКТМО, """") КАК ОКТМО,
| ЕСТЬNULL(ДополнительныеСведения.ПочтовыйИндекс, """") КАК ПочтовыйИндекс,
| ЕСТЬNULL(ДополнительныеСведения.КодИФНСФЛ, """") КАК КодИФНСФЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодИФНСЮЛ, """") КАК КодИФНСЮЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСФЛ, """") КАК КодУчасткаИФНСФЛ,
| ЕСТЬNULL(ДополнительныеСведения.КодУчасткаИФНСЮЛ, """") КАК КодУчасткаИФНСЮЛ,
| ЕСТЬNULL(ДополнительныеСведения.OKATO, """") КАК ОКАТО,
| ЕСТЬNULL(АдресныеОбъекты.КодКЛАДР, """") КАК КодКЛАДР
|ИЗ
| РегистрСведений.ЗемельныеУчастки КАК ЗемельныеУчастки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеАдресныеСведения КАК ДополнительныеСведения
| ПО (ДополнительныеСведения.Идентификатор = ЗемельныеУчастки.ДополнительныеАдресныеСведения)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
| ПО (АдресныеОбъекты.Идентификатор = ЗемельныеУчастки.АдресныйОбъект)
|ГДЕ
| ЗемельныеУчастки.АдресныйОбъект = &АдресныйОбъект";
Запрос.УстановитьПараметр("АдресныйОбъект", ИдентификаторАдресногоОбъекта);
Запись = Запрос.Выполнить().Выбрать();
Пока Запись.Следующий() Цикл
Если ЗначениеЗаполнено(Запись.Участки) Тогда
Описание = Запись.Участки.Получить();
Если ЗначениеЗаполнено(Описание) Тогда
ИзвлечьСписокЗемельныхУчастков(Описание, СтрокаПоиска, ВариантыЗемельныхУчастков, Запись, ТочноеСовпадение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Загрузка адресного классификатора.
// Загрузка всех данных классификатора адресов.
//
// Параметры:
// КодыСубъектовРФ - Массив - содержит числовые коды регионов-субъектов для загрузки.
//
// ОписаниеФайлов - Строка
// - Массив - каталог на сервере, в котором находятся файлы данных. Ожидается, что имена
// файлов будут в верхнем регистре.
// Массив элементов типа ОписаниеПередаваемогоФайла или структур с полями:
// * Имя - Строка - имя или полное имя передаваемого файла.
// * Хранение - ДвоичныеДанные
// - Строка - описание хранения файла. Строка
// может быть путем на файловой системе или адресом во временном
// хранилище.
// ОповещатьОПрогрессе - Булево - флаг оповещения о прогрессе (см ДлительныеОперации.СообщитьПрогресс).
//
Процедура ЗагрузитьКлассификаторАдресов(КодыСубъектовРФ, ОписаниеФайлов, ПараметрыЗагрузки)
ДатаЗагрузки = ТекущаяУниверсальнаяДата();
Если ТипЗнч(ОписаниеФайлов) = Тип("Строка") Тогда
// Файлы уже подготовлены
КаталогФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ОписаниеФайлов);
Иначе
КаталогФайлов = ИзвлечьФайлыВКаталог(ОписаниеФайлов);
КонецЕсли;
Попытка
СлужебныеАдресныеСведения = СлужебныеАдресныеСведения(КаталогФайлов);
ОбновитьСлужебныеАдресныеСведения(СлужебныеАдресныеСведения);
// 2. Все заказанные субъекты
ВсегоСубъектов = КодыСубъектовРФ.Количество();
НомерПоПорядку = 0;
Для Каждого СубъектРФ Из КодыСубъектовРФ Цикл
НаименованиеРегиона = АдресныйКлассификатор.НаименованиеРегионаПоКоду(СубъектРФ);
НомерПоПорядку = НомерПоПорядку + 1;
Если ПараметрыЗагрузки.ОповещатьОПрогрессе Тогда
ОсталосьДляЗагрузки = ВсегоСубъектов - НомерПоПорядку;
ОповеститьОПрогрессе(НаименованиеРегиона, СубъектРФ, ОсталосьДляЗагрузки);
КонецЕсли;
Попытка
ЗагрузитьАдресныеСведенияПоРегиону(СубъектРФ, КаталогФайлов, ПараметрыЗагрузки);
// Ставим версию данных загрузки региона.
УстановитьИнформациюОЗагрузкеВерсии(СубъектРФ, СлужебныеАдресныеСведения.Версия, СлужебныеАдресныеСведения.ДатаВерсии, ДатаЗагрузки);
Исключение
// Во время загрузки возникла ошибка, очищаем частично загруженные данные.
КодыСубъектаРФ = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СубъектРФ);
ОчиститьКлассификаторАдресов(КодыСубъектаРФ);
ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,
,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось загрузить адресные сведения субъекта РФ: %1 %2
|по причине: %3'"), СубъектРФ, НаименованиеРегиона, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
ВызватьИсключение;
КонецПопытки;
КонецЦикла;
// 4. Загружаем сокращения адресов.
// Эти данные будут нужны при разборах адреса из строки.
ОбновитьАдресныеСокращения(КаталогФайлов);
// 5. Очищаем временный каталог.
ФайловаяСистема.УдалитьВременныйФайл(КаталогФайлов);
Исключение
// Очищаем временный каталог.
ФайловаяСистема.УдалитьВременныйФайл(КаталогФайлов);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
// Вспомогательные
Функция ОбрезанноеНазвание(ИсходноеНазвание, ВырезаемаяПодстрока);
ПозицияВырезки = СтрНайти(ВРег(ИсходноеНазвание), ВРег(ВырезаемаяПодстрока));
ОбрезаннаяСтрока = ИсходноеНазвание;
Если ПозицияВырезки > 0 Тогда
ОбрезаннаяСтрока = Лев(ИсходноеНазвание, ПозицияВырезки - 1)
+ Сред(ИсходноеНазвание, ПозицияВырезки + СтрДлина(ВырезаемаяПодстрока));
КонецЕсли;
Возврат СокрЛП(ОбрезаннаяСтрока);
КонецФункции
#КонецОбласти
#Область АдресныйКлассификаторВМоделиСервиса
// Регистрирует обработчики поставляемых данных за день и за все время.
//
// Параметры:
// Обработчики - ТаблицаЗначений - таблица для добавления обработчиков. Содержит колонки:
// * ВидДанных - Строка - код вида данных, обрабатываемый обработчиком.
// * КодОбработчика - Строка - будет использоваться при восстановлении обработки данных после сбоя.
// * Обработчик - ОбщийМодуль - модуль, содержащий экспортные процедуры:
// ДоступныНовыеДанные(Дескриптор, Загружать) Экспорт
// ОбработатьНовыеДанные(Дескриптор, ПутьКФайлу) Экспорт
// ОбработкаДанныхОтменена(Дескриптор) Экспорт
//
Процедура ЗарегистрироватьОбработчикиПоставляемыхДанных(Знач Обработчики)
Обработчик = Обработчики.Добавить();
Обработчик.ВидДанных = "ФИАС30";
Обработчик.КодОбработчика = "ФИАС30";
Обработчик.Обработчик = АдресныйКлассификаторСлужебный;
КонецПроцедуры
Функция ПараметрыАдресногоКлассификатора()
Возврат Новый Структура("Версия, Регион");
КонецФункции
Функция ПараметрыВерсииИзФайла(Знач Дескриптор)
ПараметрыВерсии = ПараметрыАдресногоКлассификатора();
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
Для Каждого Характеристика Из Дескриптор.Properties.Property Цикл
Если Характеристика.Code = "Регион" Тогда
ПараметрыВерсии.Регион = ОписаниеТипаЧисло.ПривестиЗначение(Характеристика.Value);
ИначеЕсли Характеристика.Code = "Версия" Тогда
ПараметрыВерсии.Версия = ОписаниеТипаЧисло.ПривестиЗначение(Характеристика.Value);
КонецЕсли;
КонецЦикла;
Возврат ПараметрыВерсии;
КонецФункции
Функция ОписаниеПоследнейЗагрузкиАдресногоКлассификатора(Знач КодРегиона)
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
Результат = ПараметрыАдресногоКлассификатора();
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("КодСубъектаРФ", КодРегиона);
Запрос.Текст =
"ВЫБРАТЬ
| ЗагруженныеВерсииАдресныхСведений.Версия,
| ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ КАК Регион
|ИЗ
| РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений
|ГДЕ
| ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ = &КодСубъектаРФ";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Результат.Версия = ОписаниеТипаЧисло.ПривестиЗначение(Выборка.Версия);
Результат.Регион = Выборка.Регион;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПроверитьНаличиеНовыхДанных(Знач Дескриптор)
ПараметрыНовыхДанных = ПараметрыВерсииИзФайла(Дескриптор);
Если ПараметрыНовыхДанных.Версия = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ПараметрыНовыхДанных.Регион) Тогда
Возврат Истина;
КонецЕсли;
ПараметрыТекущихДанных = ОписаниеПоследнейЗагрузкиАдресногоКлассификатора(ПараметрыНовыхДанных.Регион);
Если ПараметрыТекущихДанных.Версия = Неопределено
ИЛИ ПараметрыНовыхДанных.Версия > ПараметрыТекущихДанных.Версия Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Процедура ОбработатьАдресныйКлассификатор(Знач Дескриптор, Знач ПутьКФайлу)
КаталогФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла());
Попытка
ЧтениеZIP = Новый ЧтениеZipФайла(ПутьКФайлу);
ЧтениеZIP.ИзвлечьВсе(КаталогФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
ЧтениеZIP.Закрыть();
// Загружаем только то, что передано в файлах.
СубъектыРФ = Новый Массив;
ТипЧисло = Новый ОписаниеТипов("Число");
ОписаниеФайлов = Новый Массив;
Для Каждого Файл Из НайтиФайлы(КаталогФайлов, "??.ZIP") Цикл
КодРегиона = ТипЧисло.ПривестиЗначение(Лев(Файл.Имя, 2));
Если КодРегиона > 0 Тогда
СубъектыРФ.Добавить(КодРегиона);
КонецЕсли;
ОписаниеФайлов.Добавить( Новый Структура("Имя, Хранение", Файл.ПолноеИмя, Файл.ПолноеИмя));
КонецЦикла;
Если СубъектыРФ.Количество() > 0 Тогда
ПараметрыЗагрузки = ПараметрыЗагрузкиКлассификатораАдресов();
ПараметрыЗагрузки.ЗагружатьИсториюАдресов = Истина;
ПараметрыЗагрузки.ЗагружатьПорциями = Истина;
ПараметрыЗагрузки.ОповещатьОПрогрессе = Ложь;
ЗагрузитьКлассификаторАдресов(СубъектыРФ, ОписаниеФайлов, ПараметрыЗагрузки);
КонецЕсли;
Исключение
ФайловаяСистема.УдалитьВременныйФайл(КаталогФайлов);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура УстановкаТипаКузбассКемеровскойОбласти(КонтактнаяИнформацияПоПолям) Экспорт
// АПК: 1297-выкл Данные адресного классификатора, не локализуются
Если СтрСравнить(КонтактнаяИнформацияПоПолям.area, "Кемеровская область - Кузбасс") = 0 Тогда
КонтактнаяИнформацияПоПолям.area = "Кемеровская область -";
КонтактнаяИнформацияПоПолям.areaType= "Кузбасс";
КонецЕсли;
// АПК: 1297-вкл
КонецПроцедуры
Функция НаименованиеРегионаБезТипа(Наименование)
// АПК: 1297-выкл Данные адресного классификатора, не локализуются
Возврат СтрНачинаетсяС(ВРег(Наименование), ВРег("Ханты-Мансийский Автономный округ - Югра")); // @Non-NLS-1
// АПК: 1297-вкл
КонецФункции
#КонецОбласти
#КонецОбласти