10697 lines
709 KiB
Plaintext
10697 lines
709 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// 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-вкл
|
||
КонецФункции
|
||
|
||
#КонецОбласти
|
||
|
||
#КонецОбласти
|