Files
2026-04-08 23:40:00 +03:00

5085 lines
339 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2025, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Форма параметризуется:
//
// Заголовок - Строка - заголовок формы.
// ЗначенияПолей - Строка - сериализованное значение контактной информации или пустая строка для
// ввода нового.
// Представление - Строка - представление адреса (используется только при работе со старыми данными).
// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - описание того, что мы
// редактируем.
// Комментарий - Строка - необязательный комментарий, для подстановки в поле "Комментарий".
//
// ВозвращатьСписокЗначений - Булево - необязательный флаг того, что возвращаемое значение поля.
// КонтактнаяИнформация будет иметь тип СписокЗначений (совместимость).
//
// Результат выбора:
// Структура - поля:
// * КонтактнаяИнформация - Строка - XML контактной информации.
// * Представление - Строка - Представление.
// * Комментарий - Строка - Комментарий.
// * ВведеноВСвободнойФорме - Булево - флаг ввода.
//
#Область ОписаниеПеременных
&НаКлиенте
Перем ПредставлениеАдресаКеш;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не Параметры.Свойство("ОткрытаПоСценарию") Тогда
ВызватьИсключение НСтр("ru = 'Обработка не предназначена для непосредственного использования.'");
КонецЕсли;
// Настройки формы
СведенияОАдресномКлассификаторе = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.СведенияОДоступностиАдресногоКлассификатора();
ЕстьЗагруженныйКлассификатор = СведенияОАдресномКлассификаторе.Получить("ИспользоватьЗагруженные");
ВебКлассификаторДоступен = СведенияОАдресномКлассификаторе.Получить("КлассификаторДоступен");
ИспользуетсяАдресныйКлассификатор = СведенияОАдресномКлассификаторе.Получить("ИспользуетсяАдресныйКлассификатор");
ВебСервисИспользуется = ВебКлассификаторДоступен;
Если Не ИспользуетсяАдресныйКлассификатор Тогда
ОтключитьВозможностьВыбораАдресныхСведенийИзКлассификатора();
КонецЕсли;
ЕстьПравоЗагружатьКлассификатор = Обработки.РасширенныйВводКонтактнойИнформации.ЕстьВозможностьИзмененияАдресногоКлассификатора();
Параметры.Свойство("ВозвращатьСписокЗначений", ВозвращатьСписокЗначений);
ОсновнаяСтрана = РаботаСАдресамиКлиентСервер.ОсновнаяСтрана();
ВидКИ = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(Параметры.ВидКонтактнойИнформации);
ВидКонтактнойИнформации = ВидКИ;
ПриСозданииНаСервереХранитьИсториюИзменений();
Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), Строка(ВидКИ.Ссылка), Параметры.Заголовок);
СкрыватьНеактуальныеАдреса = ВидКонтактнойИнформации.СкрыватьНеактуальныеАдреса;
ТолькоНациональныйАдрес = ВидКонтактнойИнформации.ТолькоНациональныйАдрес;
ТипКонтактнойИнформации = ВидКонтактнойИнформации.Тип;
МеждународныйФорматАдреса = ВидКонтактнойИнформации.МеждународныйФорматАдреса;
Элементы.АдресВСвободнойФорме.Видимость = Не ВидКонтактнойИнформации.ПроверятьКорректность;
Элементы.ПредставлениеАдресаКонтекстноеМенюВвестиАдресВСвободнойФорме.Видимость = Не ВидКонтактнойИнформации.ПроверятьКорректность;
// Пытаемся заполнить из параметров.
ЗначенияПолей = ОпределитьЗначениеАдреса();
Если ПустаяСтрока(ЗначенияПолей) Тогда
НаселенныйПунктДетально = УправлениеКонтактнойИнформацией.ОписаниеНовойКонтактнойИнформации(Перечисления.ТипыКонтактнойИнформации.Адрес); // Новый адрес
НаселенныйПунктДетально.AddressType = РаботаСАдресамиКлиентСервер.МуниципальныйАдрес();
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(ЗначенияПолей) Тогда
ДанныеАдреса = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(ЗначенияПолей, Перечисления.ТипыКонтактнойИнформации.Адрес);
НаселенныйПунктДетально = РаботаСАдресами.ПодготовитьАдресДляВвода(ДанныеАдреса);
Иначе
XDTOКонтактная = ИзвлечьСтарыйФорматАдреса(ЗначенияПолей, ТипКонтактнойИнформации);
ДанныеАдреса = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(XDTOКонтактная, ТипКонтактнойИнформации);
НаселенныйПунктДетально = РаботаСАдресами.ПодготовитьАдресДляВвода(ДанныеАдреса);
КонецЕсли;
Если МеждународныйФорматАдреса И Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес();
ИначеЕсли ЗначениеЗаполнено(Параметры.ТипАдреса) Тогда
УстановитьТипАдресаИзПараметра(Параметры.ТипАдреса);
КонецЕсли;
ЗаполнениеПолейАдресаДляРанееВведенныхАдресов();
ЗаполнитьПредопределенныеВариантыАдреса();
УстановитьЗначениеРеквизитовПоКонтактнойИнформации(НаселенныйПунктДетально);
Если ЗначениеЗаполнено(НаселенныйПунктДетально.Comment) Тогда
Элементы.ОсновныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;
Элементы.СтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Комментарий);
Иначе
Элементы.ОсновныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
КонецЕсли;
Если ТолькоНациональныйАдрес Тогда
Элементы.Страна.Видимость = Ложь;
Элементы.ОКТМО.Видимость = ВидКонтактнойИнформации.УказыватьОКТМО;
Если Страна <> ОсновнаяСтрана Тогда
ОсновнаяСтранаНаименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОсновнаяСтрана, "Наименование");
// Считаем адрес российским
ТекстПредупрежденияПриОткрытии = НСтр("ru = 'Адрес введен некорректно: допускается ввод только национальных адресов.
|Значение поля ""Страна"" было изменено на %1, проверьте остальные поля.'");
ТекстПредупрежденияПриОткрытии = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупрежденияПриОткрытии, ОсновнаяСтранаНаименование);
ПолеПредупрежденияПриОткрытии = "Страна";
Модифицированность = Истина;
Элементы.Страна.Доступность = Ложь;
Элементы.Страна.Видимость = Истина;
КонецЕсли;
Если СтрНачинаетсяС(ВРег(НаселенныйПунктДетально.value), ВРег(НаселенныйПунктДетально.country) + ",") Тогда
ЧастиАдреса = СтрРазделить(НаселенныйПунктДетально.value, ",");
ЧастиАдреса.Удалить(0);
НаселенныйПунктДетально.value = СокрЛП(СтрСоединить(ЧастиАдреса, ","));
ПредставлениеАдреса = НаселенныйПунктДетально.value;
КонецЕсли;
Страна = ОсновнаяСтрана;
ИначеЕсли МеждународныйФорматАдреса Тогда
Элементы.ПроверитьЗаполнениеАдреса.Видимость = Ложь;
Элементы.АдресныйКлассификаторУстарел.Видимость = Ложь;
Элементы.МуниципальноеДеление.Видимость = Ложь;
Элементы.АдминистративноТерриториальноеДеление.Видимость = Ложь;
Элементы.ЗаполнитьПоПочтовомуИндексу.Видимость = Ложь;
Элементы.ЗагрузитьКлассификатор.Видимость = Ложь;
Элементы.ГруппаИнформация.Видимость = Ложь;
Элементы.ГруппаТребуетсяПомощь.Видимость = Ложь;
Элементы.СтраницаТипАдреса.ТекущаяСтраница = Элементы.СтраницаДругойАдрес;
КонецЕсли;
НаселенныйПунктДетально.Country = НаименованиеСтраны(Страна, МеждународныйФорматАдреса);
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Элементы.ГруппаИнформационныеСообщения.Видимость = Ложь;
Элементы.НаселенныйПункт.МногострочныйРежим = Истина;
Элементы.ФормаКомандаПрименить.Отображение = ОтображениеКнопки.Картинка;
Элементы.ТипДома.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.Авто;
Элементы.ТипСтроения.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.Авто;
КонецЕсли;
ОпределитьОтображениеЭлементовИЦветов(Параметры.ТолькоПросмотр);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
Если ЕстьПравоЗагружатьКлассификатор Тогда
ТексСообщения = СтроковыеФункции.ФорматированнаяСтрока(
НСтр("ru = 'Для автоподбора и проверки адресов загрузите адресные сведения. <a href=load>Загрузить</a>'"));
Элементы.ИнформацияОЗагрузкеАдресныеСведений.Заголовок = ТексСообщения;
Иначе
Элементы.ИнформацияОЗагрузкеАдресныеСведений.Заголовок = НСтр("ru = 'Для автоподбора и проверки адресов обратитесь к администратору для загрузки адресных сведений.'");
Элементы.ЗагрузитьКлассификатор.Видимость = Ложь;
КонецЕсли;
Иначе
Элементы.ЗагрузитьКлассификатор.Видимость = Ложь;
Элементы.СведенияОбАдресе.Видимость = Ложь;
КонецЕсли;
УстановитьКлючИспользованияФормы();
СформироватьМенюДобавленияСтроенийИПомещений();
СформироватьТекстНужнаПомощь();
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType)
И Не ЗначениеЗаполнено(НаселенныйПункт) Тогда
УстановитьЗначенияПолейПослеИзмененияПредставленияНаСервере(ПредставлениеАдреса, Неопределено);
КонецЕсли;
ИдентификаторНаселенногоПункта = ИдентификаторАдреса(НаселенныйПунктДетально, Ложь);
СодержитУлицы = РаботаСАдресами.АдресСодержитУлицы(ИдентификаторНаселенногоПункта, НаселенныйПунктДетально.AddressType);
Элементы.Улица.ПодсказкаВвода = УстановитьПодсказкуВводаДляУлиц(СодержитУлицы);
// СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку") Тогда
МодульОбращенияВТехническуюПоддержкуСлужебный = ОбщегоНазначения.ОбщийМодуль(
"ОбращенияВТехническуюПоддержкуСлужебный");
МодульОбращенияВТехническуюПоддержкуСлужебный.ПриСозданииНаСервере(ЭтотОбъект);
Иначе
Элементы.ГруппаОбращенияВТехническуюПоддержку.Видимость = Ложь;
КонецЕсли;
// Конец СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
Если Не ОбщегоНазначенияКлиентСервер.ЭтоВариантИнтерфейса85() Тогда
Элементы.Переместить(Элементы.ФормаКомандаПрименить, Элементы.ПанельВнизу);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЗначениеЗаполнено(ТекстПредупрежденияПриОткрытии) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстПредупрежденияПриОткрытии,, ПолеПредупрежденияПриОткрытии);
КонецЕсли;
ОтобразитьПоляПоТипуАдреса();
ОбновитьМенюДобавленияСтроенийИПомещений();
ПоказатьПодсказкуПоТипАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Оповещение = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект);
ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ЗавершениеРаботы);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "АдресныйКлассификаторАктуализирован" ИЛИ ИмяСобытия = "ЗагруженАдресныйКлассификатор" Тогда
СообщениеОНеобходимостиЗагрузкиКлассификатора();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура")
И ВыбранноеЗначение.Свойство("КраткоеПредставлениеОшибки")
И ЗначениеЗаполнено(ВыбранноеЗначение.КраткоеПредставлениеОшибки) Тогда
ПоказатьПредупреждение(, ВыбранноеЗначение.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура СтранаПриИзменении(Элемент)
ОтобразитьЭлементыФормыВСоответствиеСоСтраной();
КонецПроцедуры
&НаКлиенте
Процедура СтранаОчистка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура СтранаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
Если Ожидание = 0 Тогда
// Формирование списка быстрого выбора.
Если ПустаяСтрока(Текст) Тогда
ДанныеВыбора = Новый СписокЗначений;
КонецЕсли;
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СтранаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
Если ПустаяСтрока(Текст) Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
#Если ВебКлиент Тогда
// Обход особенности платформы.
СтандартнаяОбработка = Ложь;
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.Добавить(Страна);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура СтранаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") И ВыбранноеЗначение.Свойство("Код") Тогда
НаселенныйПунктДетально.CountryCode = ВыбранноеЗначение.Код;
Иначе
НаселенныйПунктДетально.CountryCode = КодСтраны(ВыбранноеЗначение);
КонецЕсли;
УправлениеКонтактнойИнформациейКлиент.СтранаМираОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ИндексНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если МеждународныйФорматАдреса Тогда
СтандартнаяОбработка = Ложь;
ДанныеВыбора = Новый СписокЗначений;
Возврат;
КонецЕсли;
Если СтрДлина(Индекс) = 6 Тогда
ФормаВыбораУлицПоИндексу(Индекс);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИндексИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
Если МеждународныйФорматАдреса Тогда
Возврат;
КонецЕсли;
Если СтрДлина(СокрЛП(Текст)) = 6 И СтрСравнить(Индекс, Текст) <> 0 И Страна = ОсновнаяСтрана Тогда
СтандартнаяОбработка = Ложь;
НаселенныйПунктДетально.ZipCode = Текст;
ФормаВыбораУлицПоИндексу(Текст);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИндексОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
НаселенныйПунктДетально.ZipCode = Текст;
Если МеждународныйФорматАдреса Тогда
Возврат;
КонецЕсли;
Если СтрДлина(СокрЛП(Текст)) = 6 И СтрСравнить(Индекс, Текст) <> 0 И Страна = ОсновнаяСтрана Тогда
СтандартнаяОбработка = Ложь;
ФормаВыбораУлицПоИндексу(Текст);
Иначе
Индекс = Текст;
ОбновитьПредставлениеАдреса();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИндексПриИзменении(Элемент)
НаселенныйПунктДетально.ZipCode = Индекс;
ОбновитьПредставлениеАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ОКТМОПриИзменении(Элемент)
НаселенныйПунктДетально.OKTMO = ОКТМО;
КонецПроцедуры
&НаКлиенте
Процедура КомментарийПриИзменении(Элемент)
НаселенныйПунктДетально.Comment = Комментарий;
ПодключитьОбработчикОжидания("УстановитьПиктограммуКомментария", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ТипДомаПриИзменении(Элемент)
Если СтрСравнить(ТипДома, РаботаСАдресамиКлиентСервер.НаименованиеЗемельногоУчастка()) <> 0 Тогда
НаселенныйПунктДетально.HouseType = ТипДома;
Элементы.ТипСтроения.Доступность = Истина;
Элементы.Строение.Доступность = Истина;
Если ЗначениеЗаполнено(НаселенныйПунктДетально.stead) Тогда
НаселенныйПунктДетально.HouseNumber = НаселенныйПунктДетально.stead;
НаселенныйПунктДетально.stead = "";
НаселенныйПунктДетально.steadId = "";
ОбновитьПредставлениеАдреса();
ИначеЕсли ЗначениеЗаполнено(НаселенныйПунктДетально.HouseNumber) Тогда
ОбновитьПредставлениеАдреса();
КонецЕсли;
Иначе
НаселенныйПунктДетально.HouseType = "";
Элементы.ТипСтроения.Доступность = Ложь;
Элементы.Строение.Доступность = Ложь;
Если ЗначениеЗаполнено(НаселенныйПунктДетально.HouseNumber)
Или НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
НаселенныйПунктДетально.stead = НаселенныйПунктДетально.HouseNumber;
НаселенныйПунктДетально.HouseNumber = "";
НаселенныйПунктДетально.HouseId = "";
Строение = "";
НаселенныйПунктДетально.buildings.Очистить();
ОбновитьПредставлениеАдреса();
ПодключитьОбработчикОжидания("ОтобразитьДополнительныеЗданияКлиент", 0.1, Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДомПриИзменении(Элемент)
Если ЭтоЗемельныйУчасток(ТипДома) Тогда
НаселенныйПунктДетально.stead = Дом;
Иначе
НаселенныйПунктДетально.HouseNumber = Дом;
Если ПустаяСтрока(НаселенныйПунктДетально.HouseType) Тогда
НаселенныйПунктДетально.HouseType = ТипДома;
КонецЕсли;
КонецЕсли;
НайденныйИдентификатор = ИдентификаторАдреса(НаселенныйПунктДетально, Истина);
Если ЗначениеЗаполнено(НайденныйИдентификатор) Тогда
НайденныйИндекс = НайтиИндексУДома(НайденныйИдентификатор, Дом);
Если ЗначениеЗаполнено(НайденныйИндекс) Тогда
Индекс = НайденныйИндекс;
НаселенныйПунктДетально.ZipCode = Индекс;
КонецЕсли;
КонецЕсли;
НаселенныйПунктДетально.apartmentId = "";
ЗаполнитьУровниДомовИЗемельныхУчастков();
ОбновитьПредставлениеАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ДомОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
СтандартнаяОбработка = Ложь;
НаселенныйПунктДетально.apartmentId = "";
ЗаполнитьПоляДомовСтроенийЗемельныхУчастков(ВыбранноеЗначение);
Элементы.Дом.ОбновитьТекстРедактирования();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СтроениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
СтандартнаяОбработка = Ложь;
НаселенныйПунктДетально.apartmentId = "";
ЗаполнитьПоляДомовСтроенийЗемельныхУчастков(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТипСтроенияПриИзменении(Элемент)
Если НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
НаселенныйПунктДетально.buildings[0].Type = ТипСтроения;
КонецЕсли;
ОбновитьМенюДобавленияСтроенийИПомещений();
ОбработкаИзмененияАдреса();
КонецПроцедуры
&НаКлиенте
Процедура СтроениеПриИзменении(Элемент)
ЭтоНовый = Истина;
Для каждого Помещения Из НаселенныйПунктДетально.buildings Цикл
Если СтрСравнить(Помещения.Type, ТипСтроения) = 0 Тогда
Помещения.Type = ЭтотОбъект["ТипСтроения"];
Помещения.number = Строение;
ЭтоНовый = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоНовый Тогда
ИнформацияОСтроении = ЗначениеСтроенияИлиПомещения(ТипСтроения, Строение);
НаселенныйПунктДетально.buildings.Вставить(0, ИнформацияОСтроении);
ИначеЕсли ПустаяСтрока(ЭтотОбъект[Элемент.Имя]) Тогда
Для ИндексПозиции = 0 По НаселенныйПунктДетально.buildings.Количество() - 1 Цикл
СведенияОСтроении = НаселенныйПунктДетально.buildings[ИндексПозиции];
Если СтрСравнить(СведенияОСтроении.Type, ЭтотОбъект["ТипСтроения"]) =0 Тогда
НаселенныйПунктДетально.buildings.Удалить(ИндексПозиции);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
НаселенныйПунктДетально.apartmentId = "";
ОбновитьПредставлениеАдреса();
КонецПроцедуры
&НаКлиенте
Процедура СтроениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Текст) Тогда
Идентификатор = ИдентификаторАдреса(НаселенныйПунктДетально, Истина);
Если ЗначениеЗаполнено(Идентификатор) Тогда
ДанныеВыбора = СписокАвтоподбораВариантовДомов(Идентификатор, Дом);
Если ДанныеВыбора.Количество() > 1 Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТипСтроенияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Отбор = Новый Структура("Значение", ВыбранноеЗначение);
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если НайденныеСтроки[0].Видимость = Ложь Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТипПомещенияПриИзменении(Элемент)
Если Элемент.ВыделенныйТекст = НаименованиеПриДобавлениеПроизвольногоПомещения() Тогда
ЭтотОбъект[Элемент.Имя] = "";
КонецЕсли;
Если ПустаяСтрока(Помещение) Тогда
ОбновитьМенюДобавленияСтроенийИПомещений();
Возврат;
КонецЕсли;
Если НаселенныйПунктДетально.Apartments.Количество() > 0 Тогда
НаселенныйПунктДетально.Apartments[0].Type = ТипПомещения;
КонецЕсли;
Если ПустаяСтрока(ЭтотОбъект[Элемент.Имя]) Тогда
УдалитьПомещениеИзАдреса(ЭтотОбъект["ТипПомещения"]);
КонецЕсли;
ОбновитьМенюДобавленияСтроенийИПомещений();
ЗаполнитьИдентификаторПомещения();
ОбработкаИзмененияАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ПомещениеПриИзменении(Элемент)
ОбновитьДополнительныеЗдания = Истина;
Если ПустаяСтрока(ЭтотОбъект[Элемент.Имя]) Тогда
УдалитьПомещениеИзАдреса(ЭтотОбъект["ТипПомещения"]);
Иначе
ИнформацияОПомещении = ЗначениеСтроенияИлиПомещения(ТипПомещения, Помещение);
Если НаселенныйПунктДетально.Apartments.Количество() = 0 Тогда
НаселенныйПунктДетально.Apartments.Добавить(ИнформацияОПомещении);
ОбновитьДополнительныеЗдания = Ложь;
Иначе
Если СтрСравнить(НаселенныйПунктДетально.Apartments[0].type, ТипПомещения) = 0 Тогда
НаселенныйПунктДетально.Apartments[0] = ИнформацияОПомещении;
ОбновитьДополнительныеЗдания = Ложь;
Иначе
НаселенныйПунктДетально.Apartments.Вставить(0, ИнформацияОПомещении);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЗаполнитьИдентификаторПомещения();
ОбработкаИзмененияАдреса(ОбновитьДополнительныеЗдания);
КонецПроцедуры
&НаКлиенте
Процедура ТипПомещенияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Отбор = Новый Структура("Значение", ВыбранноеЗначение);
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если НайденныеСтроки[0].Видимость = Ложь Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НаселенныйПунктПриИзменении(Элемент)
ИзменитьСведенияОНаселенномПункте();
КонецПроцедуры
&НаКлиенте
Процедура НаселенныйПунктОчистка(Элемент, СтандартнаяОбработка)
ОчиститьНаселенныйПункт();
КонецПроцедуры
&НаКлиенте
Процедура НаселенныйПунктНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Если пришли впрямую после редактирования, то сбрасываем адрес.
Если Элемент.ТекстРедактирования <> НаселенныйПункт Тогда
Модифицированность = Истина;
НаселенныйПункт = Элемент.ТекстРедактирования;
ИзменитьСведенияОНаселенномПункте();
ИдентификаторНаселенногоПункта = Неопределено;
КонецЕсли;
ПараметрыФормы = ПараметрыОткрытияФормыНаселенногоПункта();
Оповещение = Новый ОписаниеОповещения("ПослеВводаСведенийНаселенногоПункта", ЭтотОбъект);
ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.НаселенныйПунктАдреса", ПараметрыФормы,
Элемент,,,, Оповещение, РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца);
КонецПроцедуры
&НаКлиенте
Процедура НаселенныйПунктОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ВыбранноеЗначение = Неопределено Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Если ЕстьПравоЗагружатьКлассификатор И ВыбранноеЗначение.ПредлагатьЗагрузкуКлассификатора = Истина Тогда
// Предлагаем загрузить классификатор.
ПредложениеЗагрузкиКлассификатора(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Данные для ""%1"" не загружены.'"),
ВыбранноеЗначение.Представление), ВыбранноеЗначение);
Иначе
УстановитьНаселенныйПунктПослеВыбора(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НаселенныйПунктАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если МеждународныйФорматАдреса Или УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
Возврат;
КонецЕсли;
ДанныеВыбора = Новый СписокЗначений;
ТекстДляАвтоПодбора = СокрЛП(Текст);
Если СтрДлина(ТекстДляАвтоПодбора) < 3 Или Не РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) Тогда
// Нет вариантов, список пуст, стандартную обработку не надо трогать.
Возврат;
КонецЕсли;
Результат = СписокАвтоподбораНаселенногоПункта(ТекстДляАвтоПодбора, ТипАдреса);
Если Результат.Отказ Тогда
Возврат;
КонецЕсли;
ДанныеВыбора = Результат.Данные;
// Стандартную обработку отключаем, только если есть наши варианты.
Если ДанныеВыбора.Количество() > 0 Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УлицаПриИзменении(Элемент)
ОбновитьСписокУровней(НаселенныйПунктДетально, "street", ЗначениеЗаполнено(Улица));
Если Не ЭтоРФАдрес() Или МеждународныйФорматАдреса Тогда
НаселенныйПунктДетально.Street = Улица;
ОбновитьПредставлениеАдреса();
Возврат;
КонецЕсли;
ЧастиАдреса = СтрРазделить(Улица, " ");
Если ЧастиАдреса.Количество() > 1 Тогда
ТипОбъекта = ЧастиАдреса[0];
ЧастиАдреса.Удалить(0);
Иначе
ТипОбъекта = "";
КонецЕсли;
Наименование = СокрЛП(СтрСоединить(ЧастиАдреса, " "));
НаселенныйПунктДетально.Street = Наименование;
НаселенныйПунктДетально.StreetType = ТипОбъекта;
НаселенныйПунктДетально.StreetID = "";
ОбновитьПредставлениеАдреса();
УстановитьИдентификаторыАдреса(НаселенныйПунктДетально);
КонецПроцедуры
&НаКлиенте
Процедура УлицаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Если пришли впрямую после редактирования, то сбрасываем.
Если Элемент.ТекстРедактирования <> Улица Тогда
Улица = Элемент.ТекстРедактирования;
КонецЕсли;
ИдентификаторНаселенногоПункта = ИдентификаторАдреса(НаселенныйПунктДетально, Ложь);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Родитель", ИдентификаторНаселенногоПункта);
ПараметрыФормы.Вставить("Уровень", РаботаСАдресамиКлиентСервер.СопоставлениеНаименованиеУровнюАдреса("STREET"));
ПараметрыФормы.Вставить("ТипАдреса", НаселенныйПунктДетально.AddressType);
Оповещение = Новый ОписаниеОповещения("ПослеВыбораУлицы", ЭтотОбъект);
ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыФормы, ЭтотОбъект,
,,, Оповещение, РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца);
КонецПроцедуры
&НаКлиенте
Процедура УлицаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если Страна <> ОсновнаяСтрана Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
Если ВыбранноеЗначение = Неопределено Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
ТипЗначения = ТипЗнч(ВыбранноеЗначение);
Если ТипЗначения = Тип("УникальныйИдентификатор") Тогда
СведенияОбАдресе = Новый Структура("Идентификатор", ВыбранноеЗначение);
ИначеЕсли ТипЗначения = Тип("Структура") Тогда
СведенияОбАдресе = ВыбранноеЗначение;
КонецЕсли;
СведенияОбАдресе.Вставить("Муниципальный", РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType));
СведенияОбАдресе.Вставить("Адрес", НаселенныйПунктДетально);
НаселенныйПунктУстановитьПоляАдреса(НаселенныйПунктДетально, СведенияОбАдресе, Истина);
ОбработкаИзмененияАдреса();
Элементы.Улица.ОбновитьТекстРедактирования();
КонецПроцедуры
&НаКлиенте
Процедура УлицаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
Если Не АвтоподборДоступен Тогда
Возврат;
КонецЕсли;
ДанныеВыбора = Новый СписокЗначений;
ИдентификаторНаселенногоПункта = ИдентификаторАдреса(НаселенныйПунктДетально, Ложь);
Если СтрДлина(Текст) < 2 Или Не ЗначениеЗаполнено(ИдентификаторНаселенногоПункта)Тогда
// Нет вариантов, список пуст, стандартную обработку не надо трогать.
Возврат;
КонецЕсли;
Результат = ВариантыУлицПоТексту(Текст);
Если Результат.Отказ Тогда
Возврат;
КонецЕсли;
Если Результат.Данные.Количество() = 0 Тогда
АдаптацияИдентификатораНаселенногоПункта(ИдентификаторНаселенногоПункта);
Результат = ВариантыУлицПоТексту(Текст);
Если Результат.Отказ Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ДанныеВыбора = Результат.Данные;
// Стандартную обработку отключаем, только если есть наши варианты.
Если ДанныеВыбора.Количество() > 0 Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УлицаОчистка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
НаселенныйПунктДетально.streetID = "";
НаселенныйПунктДетально.street = "";
НаселенныйПунктДетально.streetType = "";
Улица = "";
КонецПроцедуры
&НаКлиенте
Процедура ПредставлениеАдресаПриИзменении(Элемент)
ПредставлениеАдресаКеш = "";
НаселенныйПунктДетально.value = ПредставлениеАдреса;
ПодключитьОбработчикОжидания("УстановитьЗначенияПолейПослеИзмененияПредставления", 0.1, Истина);
КонецПроцедуры
// Дом, помещения
&НаКлиенте
Процедура ДомАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если Не АвтоподборДоступен Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Текст) Тогда
Идентификатор = ИдентификаторАдреса(НаселенныйПунктДетально, Истина);
Если ЗначениеЗаполнено(Идентификатор) Тогда
Если СтрСравнить(ТипДома, РаботаСАдресамиКлиентСервер.НаименованиеЗемельногоУчастка()) <> 0 Тогда
ДанныеВыбора = СписокАвтоподбораВариантовДомов(Идентификатор, Текст + "%");
Иначе
ДанныеВыбора = СписокАвтоподбораЗемельныхУчастков(Идентификатор, Текст + "%");
КонецЕсли;
Если ДанныеВыбора.Количество() > 0 Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура АдресНаДатуАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если СтрСравнить(Текст, НачалоУчета()) = 0 Или ПустаяСтрока(Текст) Тогда
Элементы.АдресНаДату.ФорматРедактирования = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура АдресНаДатуПриИзменении(Элемент)
Если Не ВводНовогоАдреса Тогда
Отбор = Новый Структура("Вид", ОписаниеВидаКонтактнойИнформации(ЭтотОбъект).Ссылка);
НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Результат = ОпределитьДатуДействия(АдресНаДату, НайденныеСтроки);
Если Результат.ТекущаяСтрока <> Неопределено Тогда
Тип = Результат.ТекущаяСтрока.Тип;
АдресДействуетС = Результат.ДействуетС;
НаселенныйПунктДетально = АдресСИсторией(Результат.ТекущаяСтрока.Значение);
Иначе
Тип = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес");
АдресДействуетС = АдресНаДату;
НаселенныйПунктДетально = РаботаСАдресамиКлиентСервер.ОписаниеНовойКонтактнойИнформации(Тип);
КонецЕсли;
ОбработкаИзмененияАдреса();
Если ЗначениеЗаполнено(Результат.ДействуетПо) Тогда
ТекстИсторическийАдрес = " " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'действует по %1'"), Формат(Результат.ДействуетПо - 10, "ДЛФ=DD"));
Иначе
ТекстИсторическийАдрес = НСтр("ru = 'действует по настоящее время.'");
КонецЕсли;
Элементы.АдресНаДату.РасширеннаяПодсказка.Заголовок = ТекстИсторическийАдрес;
Иначе
АдресДействуетС = АдресНаДату;
КонецЕсли;
ТекстНачалаУчета = НачалоУчета();
Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + ТекстНачалаУчета + """'");
КонецПроцедуры
&НаКлиенте
Процедура ИнформацияОЗагрузкеАдресныеСведенийОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если НавигационнаяСсылкаФорматированнойСтроки = "load"
И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
Оповещение = Новый ОписаниеОповещения("ПослеАвторизоватьНаСайтеПоддержкиПользователей", ЭтотОбъект);
МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент");
МодульАдресныйКлассификаторКлиент.АвторизоватьНаСайтеПоддержкиПользователей(Оповещение, ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДомНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ПоказатьСписокДомовИлиЗемельныхУчастков(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура СтроениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ПоказатьСписокДомовИлиЗемельныхУчастков(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПомещениеНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
ПоказатьСписокПомещений();
КонецПроцедуры
&НаКлиенте
Процедура ПомещениеОбработкаВыбора(Элемент, ВыбранноеЗначение, ДополнительныеДанные, ВыборДобавлением, СтандартнаяОбработка)
Если ВыбранноеЗначение = Неопределено Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
ЗаполнитьПоляПомещения(ВыбранноеЗначение);
КонецПроцедуры
&НаКлиенте
Процедура ПомещениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если Не АвтоподборДоступен Тогда
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Текст) Тогда
Возврат;
КонецЕсли;
ЭтоНациональныйАдрес = РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType)
Или РаботаСАдресамиКлиентСервер.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.addressType);
Если Не ЭтоНациональныйАдрес Тогда
Возврат;
КонецЕсли;
ИдентификаторДома = ИдентификаторАдреса(НаселенныйПунктДетально, Истина, Истина);
Если ЗначениеЗаполнено(ИдентификаторДома) Тогда
ДанныеВыбора = СписокАвтоподбораПомещений(ИдентификаторДома, Текст + "%");
Если ДанныеВыбора.Количество() > 0 Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОписаниеОбращенияВПоддержкуОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
// СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку") Тогда
СтандартнаяОбработка = Ложь;
МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
"ОбращенияВТехническуюПоддержкуСлужебныйКлиент");
Если НавигационнаяСсылка = "ВопросВПоддержку" Тогда
ПараметрыОбращения = МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент.ПараметрыОбращения();
ПараметрыОбращения.Тема = РаботаСАдресамиСлужебныйКлиент.ТемаОбращенияВПоддержку();
ПараметрыОбращения.ТехнологическаяИнформация = ИнформацияДляПоддержки(
ПредставлениеАдреса,
НаселенныйПунктДетально);
ОписаниеОшибок = Новый Массив;
ОшибкиЗаполнения = СписокОшибокЗаполнения(НаселенныйПунктДетально, ВидКонтактнойИнформации, Ложь, Ложь);
Для Каждого ОшибкаЗаполнения Из ОшибкиЗаполнения Цикл
ОписаниеОшибок.Добавить(ОшибкаЗаполнения.ТекстОшибки);
КонецЦикла;
ОписаниеОшибки = СтрСоединить(ОписаниеОшибок, "; ");
ПараметрыОбращения.Сообщение = РаботаСАдресамиСлужебныйКлиент.ТекстОбращенияВПоддержку(
ПредставлениеАдреса,
ОписаниеОшибки);
МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент.ОтправитьВопросВПоддержку(
ЭтотОбъект,
ПараметрыОбращения);
ИначеЕсли НавигационнаяСсылка = "ИнформацияДляОтправкиВПоддержку" Тогда
ПараметрыОбращения = МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент.ПараметрыОбращения();
ПараметрыОбращения.ТехнологическаяИнформация = ИнформацияДляПоддержки(
ПредставлениеАдреса,
НаселенныйПунктДетально);
МодульОбращенияВТехническуюПоддержкуСлужебныйКлиент.СкачатьИнформациюДляОтправкиВПоддержку(
ЭтотОбъект,
ПараметрыОбращения);
Иначе
Выражение = НСтр("ru = 'Действие для навигационной ссылки не определено.'");
ВызватьИсключение(Выражение, КатегорияОшибки.ОшибкаПереходаПоНавигационнойСсылке);
КонецЕсли;
КонецЕсли;
// Конец СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
КонецПроцедуры
&НаКлиенте
Процедура СведенияОбАдресеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
Если НавигационнаяСсылка = "СведенияОбАдресе"
И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
СтандартнаяОбработка = Ложь;
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("Адрес", ПредставлениеАдреса);
ПараметрыОткрытия.Вставить("СведенияОбАдресе", СведенияОбАдресе(НаселенныйПунктДетально));
МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент");
МодульАдресныйКлассификаторКлиент.ОткрытьСведенияОбАдресномКлассификаторе(ПараметрыОткрытия);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура РегионИностранногоАдресаПриИзменении(Элемент)
ЗаполнитьПолеИностранногоАдреса("area", РегионИностранногоАдреса);
КонецПроцедуры
&НаКлиенте
Процедура РайонИностранногоАдресаПриИзменении(Элемент)
ЗаполнитьПолеИностранногоАдреса("district", РайонИностранногоАдреса);
КонецПроцедуры
&НаКлиенте
Процедура ВнутригородскойРайонИностранногоАдресаПриИзменении(Элемент)
ЗаполнитьПолеИностранногоАдреса("locality", ВнутригородскойРайонИностранногоАдреса);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ПроверитьЗаполнениеАдреса(Команда)
Если РазрешитьВводАдресаВСвободнойФорме Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Адрес не может быть проверен, так как он введен в свободной форме.'"));
Возврат;
КонецЕсли;
ПредупреждатьОбОтсутствииОшибок = Истина;
ТребуетсяОбновление = Ложь;
СписокОшибок = СписокОшибокЗаполнения(НаселенныйПунктДетально, ВидКонтактнойИнформации, ПредупреждатьОбОтсутствииОшибок, ТребуетсяОбновление);
СообщитьОбОшибкахЗаполнения(СписокОшибок, ПредупреждатьОбОтсутствииОшибок, ТребуетсяОбновление);
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьАдрес(Команда)
ОчиститьАдресКлиент();
ОбработкаИзмененияАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоПочтовомуИндексу(Команда)
Если ЕстьЗагруженныйКлассификатор И СтрДлина(Индекс) = 6 Тогда
ФормаВыбораУлицПоИндексу(Индекс);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьКлассификатор(Команда)
ОткрытьФормуЗагрузкиКлассификатора();
КонецПроцедуры
&НаКлиенте
Процедура ВвестиАдресВСвободнойФорме(Команда)
ЭтоНациональныйАдрес = ЭтоНациональныйАдрес();
Если РазрешитьВводАдресаВСвободнойФорме Тогда
ВключаемыйТипАдреса = ?(УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType),
Неопределено, УправлениеКонтактнойИнформациейКлиентСервер.АдресВСвободнойФорме());
ПереключитьНаСтруктурированныйВвод(ВключаемыйТипАдреса);
ИначеЕсли ЭтоНациональныйАдрес() Тогда
ТекстВопроса = НСтр("ru = 'Ввести адрес в свободной форме?
|Адреса, введенные в свободной форме, могут не пройти проверку по адресному классификатору.'");
Оповещение = Новый ОписаниеОповещения("ВвестиАдресВСвободнойФормеЗавершение", ЭтотОбъект);
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , НСтр("ru = 'Подтверждение'"));
Иначе
ПереключитьАдресВСвободнойФорму();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура АвторизацияНаСайтеПоддержкиПользователей(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения("АвторизацияНаСайтеПоддержкиПользователейЗавершение", ЭтотОбъект);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
МодульИнтернетПоддержкаПользователейКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтернетПоддержкаПользователейКлиент");
МодульИнтернетПоддержкаПользователейКлиент.ПодключитьИнтернетПоддержкуПользователей(ОповещениеОЗакрытии, ЭтотОбъект);
КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ИсторияИзменений(Команда)
ДополнительныеПараметры = Новый Структура;
ОписаниеДополнительныхРеквизитов = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
СписокКонтактнойИнформации = ЗаполнитьСписокКонтактнойИнформации(ОписаниеВидаКонтактнойИнформации(ЭтотОбъект).Ссылка, ОписаниеДополнительныхРеквизитов);
ПараметрыФормы = Новый Структура("СписокКонтактнойИнформации", СписокКонтактнойИнформации);
ПараметрыФормы.Вставить("ВидКонтактнойИнформации", ОписаниеВидаКонтактнойИнформации(ЭтотОбъект).Ссылка);
ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр);
ПараметрыФормы.Вставить("ИзФормыВводаАдреса", Истина);
ПараметрыФормы.Вставить("ДействуетС", АдресНаДату);
ОповещениеОЗакрытие = Новый ОписаниеОповещения("ПослеЗакрытияФормыИстории", ЭтотОбъект, ДополнительныеПараметры);
ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ИсторияКонтактнойИнформации", ПараметрыФормы, ЭтотОбъект,,,, ОповещениеОЗакрытие);
КонецПроцедуры
&НаКлиенте
Процедура АдресНаЯндексКарты(Команда)
УправлениеКонтактнойИнформациейКлиент.ПоказатьАдресНаКарте(ПредставлениеАдреса, "Яндекс.Карты");
КонецПроцедуры
&НаКлиенте
Процедура АдресНаGoogleMaps(Команда)
УправлениеКонтактнойИнформациейКлиент.ПоказатьАдресНаКарте(ПредставлениеАдреса, "GoogleMaps");
КонецПроцедуры
&НаКлиенте
Процедура АдресныйКлассификаторУстарел(Команда)
СообщениеОПроверкеАдреса = НСтр("ru = 'Адресные сведения, загруженные в приложение, устарели.
|Рекомендуется выполнить обновление адресного классификатор, чтобы проверка адреса выполнялась корректно.'");
Если ЕстьПравоЗагружатьКлассификатор Тогда
ВопросОбОбновлениеАдресногоКлассификатора(СообщениеОПроверкеАдреса);
Иначе
СообщениеОПроверкеАдреса = СообщениеОПроверкеАдреса + Символы.ПС
+ НСтр("ru = 'Для обновления адресного классификатора обратитесь к администратору.'");
ПоказатьПредупреждение(, СообщениеОПроверкеАдреса);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура АдминистративноТерриториальноеДеление(Команда)
ПереключитьНаСтруктурированныйВвод(РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес());
КонецПроцедуры
&НаКлиенте
Процедура МуниципальноеДеление(Команда)
ПереключитьНаСтруктурированныйВвод(РаботаСАдресамиКлиентСервер.МуниципальныйАдрес());
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьКомментарий(Команда)
Элементы.ОсновныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;
Элементы.ОсновныеСтраницы.ТекущаяСтраница = Элементы.СтраницаКомментарий;
КонецПроцедуры
// Параметры:
// Команда - КомандаФормы
//
&НаКлиенте
Процедура Подключаемый_ДобавитьСтроениеИлиПомещение(Команда)
ТипСтроенияИлиПомещения = СтрРазделить(Команда.Имя, "_")[1];
Отбор = Новый Структура("Ключ", ТипСтроенияИлиПомещения);
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
НайденныеСтроки[0].Видимость = Ложь;
Идентификатор = СтрЗаменить(Новый УникальныйИдентификатор(),"-", "");
ИмяТекущего = ДобавитьПолеСтроенияИлиПомещения(Идентификатор, НайденныеСтроки[0].Тип,
НайденныеСтроки[0].Значение);
Если ИмяТекущего <> Неопределено Тогда
ТекущийЭлемент = Элементы[ИмяТекущего];
КонецЕсли;
Если НайденныеСтроки[0].Тип = "Помещение" Тогда
Значение = ?(НайденныеСтроки[0].Значение <> НСтр("ru = 'Другое'"), НайденныеСтроки[0].Значение, "");
ПомещенияАдреса = НаселенныйПунктДетально.Apartments; // Массив
ПомещенияАдреса.Добавить(ЗначениеСтроенияИлиПомещения(Значение, ЭтотОбъект[ИмяТекущего]));
Иначе
ЗданияАдреса = НаселенныйПунктДетально.buildings; // Массив
ЗданияАдреса.Добавить(ЗначениеСтроенияИлиПомещения(НайденныеСтроки[0].Значение, ЭтотОбъект[ИмяТекущего]));
КонецЕсли;
ОбновитьМенюДобавленияСтроенийИПомещений();
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьАдресВБуферОбмена(Команда)
УправлениеКонтактнойИнформациейКлиент.ПоместитьТекстВБуфераОбмена(ПредставлениеАдреса);
КонецПроцедуры
&НаКлиенте
Процедура КомандаПрименить(Команда)
ПодтвердитьИЗакрыть();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервереБезКонтекста
Функция ИнформацияДляПоддержки(ПредставлениеАдреса, НаселенныйПунктДетально)
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
СведенияОбАдресе = СведенияОбАдресе(НаселенныйПунктДетально);
ИнформацияДляПоддержки = МодульАдресныйКлассификаторСлужебный.ИнформацияДляПоддержки(
ПредставлениеАдреса,
СведенияОбАдресе);
Иначе
ИнформацияДляПоддержки = СтандартныеПодсистемыСервер.ИнформацияДляПоддержки();
КонецЕсли;
Возврат ИнформацияДляПоддержки
КонецФункции
&НаСервереБезКонтекста
Функция СведенияОбАдресе(НаселенныйПунктДетально)
АдресВJSON = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(НаселенныйПунктДетально);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("КодыАдреса", Истина);
Возврат РаботаСАдресами.СведенияОбАдресе(АдресВJSON, ДополнительныеПараметры);
КонецФункции
&НаСервереБезКонтекста
Функция АдресСИсторией(ЗначенияПолей)
Возврат УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(ЗначенияПолей, Перечисления.ТипыКонтактнойИнформации.Адрес);
КонецФункции
// Параметры:
// Результат - Структура:
// * Индекс - Строка
// ДополнительныеПараметры - Произвольный
//
&НаКлиенте
Процедура ПослеВыбораАдресаПоИндексу(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
Если Результат.Отказ Тогда
Если Результат.Свойство("Индекс") И НЕ ПустаяСтрока(Результат.Индекс) Тогда
ОбновитьПредставлениеАдреса();
Возврат;
Иначе
Если НЕ ПодборПоИндексуДоступен Тогда
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Индекс %1 не найден в адресном классификаторе'"),
Формат(Результат.Индекс, "ЧРГ=' '; ЧГ=0"));
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,,, "Объект.Индекс");
Иначе
ПроверитьДоступностьКлассификатора();
КонецЕсли;
КонецЕсли;
Возврат;
КонецЕсли;
ОчиститьАдресКлиент();
Если ТипЗнч(Результат) = Тип("Структура") Тогда
ПолученныйАдрес = ОпределитьАдресПоИдентификатору(Результат);
ЗаполнитьЗначенияСвойств(НаселенныйПунктДетально, ПолученныйАдрес);
Если ПустаяСтрока(НаселенныйПунктДетально.ZipCode) Тогда
НаселенныйПунктДетально.ZipCode = Формат(Результат.Индекс,"ЧГ=0");
КонецЕсли;
КонецЕсли;
ОбработкаИзмененияАдреса();
УстановитьФлагиВМенюПоТипуАдреса();
ТекущийЭлемент = Элементы.Дом;
Иначе
ОбновитьПредставлениеАдреса();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОтключитьВозможностьВыбораАдресныхСведенийИзКлассификатора()
Элементы.ГруппаИнформация.Видимость = Ложь;
Элементы.ПроверитьЗаполнениеАдреса.Видимость = Ложь;
Элементы.ЗаполнитьПоПочтовомуИндексу.Видимость = Ложь;
Элементы.ЗагрузитьКлассификатор.Видимость = Ложь;
Элементы.Улица.КнопкаВыбора = Ложь;
Элементы.Дом.КнопкаВыбора = Ложь;
Элементы.Строение.КнопкаВыбора = Ложь;
Элементы.Помещение.КнопкаВыбора = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьУровниДомовИЗемельныхУчастков()
ЗаполненыДома = Ложь;
Если ЗначениеЗаполнено(НаселенныйПунктДетально.houseNumber)
Или НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
ЗаполненыДома = Истина;
КонецЕсли;
ОбновитьСписокУровней(НаселенныйПунктДетально, "house", ЗаполненыДома);
ОбновитьСписокУровней(НаселенныйПунктДетально, "stead", ЗначениеЗаполнено(НаселенныйПунктДетально.stead));
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьИдентификаторПомещения()
НаселенныйПунктДетально.ApartmentId = "";
ПодключитьОбработчикОжидания("ЗаполнитьИдентификаторПомещенияДляПервогоПомещения", 0.2, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьИдентификаторПомещенияДляПервогоПомещения()
ЭтоНациональныйАдрес = РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType)
Или РаботаСАдресамиКлиентСервер.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.addressType);
Если Не ЭтоНациональныйАдрес Тогда
Возврат;
КонецЕсли;
Если НаселенныйПунктДетально.Apartments.Количество() > 1 Тогда
Возврат;
КонецЕсли;
ИдентификаторДома = ИдентификаторАдреса(НаселенныйПунктДетально, Истина, Истина);
Если Не ЗначениеЗаполнено(ИдентификаторДома) Тогда
Возврат;
КонецЕсли;
СписокПомещений = СписокАвтоподбораПомещений(ИдентификаторДома, Помещение);
Если СписокПомещений = Неопределено Или СписокПомещений.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ИдентификаторПомещения = "";
Для Каждого СвойстваПомещения Из СписокПомещений Цикл
Если СвойстваПомещения.Значение.ТипПомещения = ТипПомещения Тогда
ИдентификаторПомещения = СвойстваПомещения.Значение.ИдентификаторПомещения;
Прервать;
КонецЕсли;
КонецЦикла;
НаселенныйПунктДетально.ApartmentId = ИдентификаторПомещения;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьСписокУровней(НаселенныйПунктДетально, ИмяУровня, ЕстьЗначение)
Если ИмяУровня <> "district" Тогда
ПозицияМуниципальныйУровень = НаселенныйПунктДетально.munLevels.Найти(ИмяУровня);
Иначе
ПозицияМуниципальныйУровень = -1;
КонецЕсли;
Если ИмяУровня <> "munDistrict" И ИмяУровня <> "settlement" Тогда
ПозицияАдминистративнойУровень = НаселенныйПунктДетально.admLevels.Найти(ИмяУровня);
Иначе
ПозицияАдминистративнойУровень = -1;
КонецЕсли;
Если ЕстьЗначение Тогда
Если ПозицияМуниципальныйУровень = Неопределено Тогда
НаселенныйПунктДетально.munLevels.Добавить(ИмяУровня);
КонецЕсли;
Если ПозицияАдминистративнойУровень = Неопределено Тогда
НаселенныйПунктДетально.admLevels.Добавить(ИмяУровня);
КонецЕсли;
Иначе
Если ПозицияМуниципальныйУровень <> Неопределено И ПозицияМуниципальныйУровень >= 0 Тогда
НаселенныйПунктДетально.munLevels.Удалить(ПозицияМуниципальныйУровень);
КонецЕсли;
Если ПозицияАдминистративнойУровень <> Неопределено И ПозицияАдминистративнойУровень >= 0 Тогда
НаселенныйПунктДетально.admLevels.Удалить(ПозицияАдминистративнойУровень);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьМуниципальныеСведения(НаселенныйПунктДетально)
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
МодульАдресныйКлассификаторСлужебный.УстановитьИдентификаторыАдреса(НаселенныйПунктДетально);
ИдентификаторАдреса = ИдентификаторАдреса(НаселенныйПунктДетально, Истина);
Если ЗначениеЗаполнено(ИдентификаторАдреса) Тогда
СведенияОбАдресномОбъекта = МодульАдресныйКлассификаторСлужебный.СведенияОбАдресномОбъекта(ИдентификаторАдреса);
Результат = МодульАдресныйКлассификаторСлужебный.АктуальныеАдресныеСведения(СведенияОбАдресномОбъекта);
Если Не Результат.Отказ Тогда
ДанныеИзКлассификатора = РаботаСАдресами.ПодготовитьАдресДляВвода(Результат.Данные);
ЗаполнитьЗначенияСвойств(НаселенныйПунктДетально, ДанныеИзКлассификатора,
"munDistrict, munDistrictType,munDistrictId,settlement,settlementType,settlementId");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ВариантыУлицПоТексту(Знач Текст)
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Идентификатор", ИдентификаторНаселенногоПункта);
ДополнительныеПараметры.Вставить("ТипАдреса", НаселенныйПунктДетально.AddressType);
ДополнительныеПараметры.Вставить("Уровень", 8);
Результат = СписокАвтоподбораУлицы(Текст, ДополнительныеПараметры);
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ФормаВыбораУлицПоИндексу(Знач Текст)
Если Не ЭтоРФАдрес() Тогда
Возврат;
КонецЕсли;
Модифицированность = Истина;
Индекс = Текст;
Если АвтоподборДоступен Тогда
ПараметрыФормы = ПараметрыОткрытияФормаВыбораПоИндексу();
ПараметрыФормы.Индекс =СокрЛП(Текст);
Оповещение = Новый ОписаниеОповещения("ПослеВыбораАдресаПоИндексу", ЭтотОбъект);
ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс,,,, Оповещение);
Иначе
ОбновитьПредставлениеАдреса();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ЭтоРФАдрес()
Возврат РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType)
Или РаботаСАдресамиКлиент.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.addressType);
КонецФункции
&НаКлиенте
Процедура ВвестиАдресВСвободнойФормеЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
ПереключитьАдресВСвободнойФорму();
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьАдресВСвободнойФорму()
Элементы.ПроверитьЗаполнениеАдреса.Доступность = Ложь;
Если Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
РазрешитьВводАдресаВСвободнойФорме = Истина;
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.АдресВСвободнойФорме();
Элементы.АдресВСвободнойФорме.Пометка = Истина;
ОбновитьПредставлениеАдреса();
ПоказатьАдресВСвободнойФорме();
Возврат;
КонецЕсли;
РазрешитьВводАдресаВСвободнойФорме = Ложь;
ПереключитьОтображениеАдресВСвободнойФорме();
Если Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
ОтобразитьВыбранныйТипАдреса(НаселенныйПунктДетально.AddressType);
Возврат;
КонецЕсли;
Если РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) Тогда
// Попытка восстановить адрес по полям из представления.
НаселенныйПунктДетально = КонтактнаяИнформацияПоПредставлению(ПредставлениеАдреса, Комментарий, Истина);
ОтобразитьВыбранныйТипАдреса(НаселенныйПунктДетально.AddressType);
Возврат;
КонецЕсли;
ЧастиАдреса = СтрРазделить(ПредставлениеАдреса, ",");
Если СтрСравнить(Страна, ЧастиАдреса[0]) = 0 Тогда
ЧастиАдреса.Удалить(0);
КонецЕсли;
Если ЧастиАдреса.Количество() > 1 Тогда
ЧастьУлица = СокрЛП(ЧастиАдреса[ЧастиАдреса.Количество() - 1]);
ЧастиАдреса.Удалить(ЧастиАдреса.Количество() - 1);
Иначе
ЧастьУлица = "";
КонецЕсли;
ЧастьГород = СокрЛП(?(ЧастиАдреса.Количество() > 0, СтрСоединить(ЧастиАдреса, ","), ""));
Если СведенияОСтране.УчастникЕАЭС Тогда
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.АдресЕАЭС();
НаселенныйПунктДетально.Area = ЧастьГород;
Иначе
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес();
НаселенныйПунктДетально.City = ЧастьГород;
КонецЕсли;
НаселенныйПунктДетально.Street = ЧастьУлица;
ОтобразитьВыбранныйТипАдреса(НаселенныйПунктДетально.AddressType);
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьНаселенныйПункт()
ИдентификаторНаселенногоПункта = Неопределено;
УровниАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса("Все", Ложь);
Для каждого ИмяУровня Из УровниАдреса Цикл
Если НаселенныйПунктДетально.Свойство(ИмяУровня) Тогда
НаселенныйПунктДетально[ИмяУровня] = "";
НаселенныйПунктДетально[ИмяУровня + "Type"] = "";
НаселенныйПунктДетально[ИмяУровня + "Id"] = "";
ОбновитьСписокУровней(НаселенныйПунктДетально, ИмяУровня, Ложь);
КонецЕсли;
КонецЦикла;
НаселенныйПунктДетально.areaValue = "";
ОчиститьИдентификаторыАдреса();
ОбновитьПредставлениеАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ОтобразитьЭлементыФормыВСоответствиеСоСтраной()
СведенияОСтране = СведенияОСтране(Страна);
Если Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
ТипАдресаИзАдреса = НаселенныйПунктДетально.AddressType;
ПереопределитьТипаАдресаПоСтране(Страна, НаселенныйПунктДетально, СведенияОСтране, МеждународныйФорматАдреса);
ПеренестиЗначенияПолейАдресВПоляНовогоТипа(ТипАдресаИзАдреса);
ТипАдресаИзАдреса = НаселенныйПунктДетально.AddressType;
КонецЕсли;
УстановитьЗначенияНациональныхРеквизитовКонтактнойИнформации(НаселенныйПунктДетально);
ОтобразитьПоляПоТипуАдреса();
НужноОбновитьПреставление = ПривестиИндексКФорматуСтраны();
Если ЭтоНациональныйАдрес() Тогда
Восстановлен = ВосстановитьАдрес(ПредставлениеАдреса, НаселенныйПунктДетально, НаселенныйПунктДетально.AddressType);
Иначе
Восстановлен = Ложь;
КонецЕсли;
ОбновитьПредставлениеАдреса();
КонецПроцедуры
&НаСервере
Функция ВосстановитьАдрес(ПредставлениеАдреса, НаселенныйПункт, ТипАдреса)
Результат = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(ПредставлениеАдреса, Перечисления.ТипыКонтактнойИнформации.Адрес);
ВосстановленныйАдрес = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Результат, Перечисления.ТипыКонтактнойИнформации.Адрес);
Если УправлениеКонтактнойИнформацией.АдресВведенВСвободнойФорме(ВосстановленныйАдрес) Тогда
Возврат Ложь;
КонецЕсли;
ВосстановленныйАдрес.AddressType = ТипАдреса;
ЗаполнитьЗначенияСвойств(НаселенныйПунктДетально, ВосстановленныйАдрес);
УстановитьЗначениеРеквизитовПоКонтактнойИнформации(НаселенныйПунктДетально);
Возврат Истина;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура ПереопределитьТипаАдресаПоСтране(Страна, НаселенныйПунктДетально, СведенияОСтране, МеждународныйФорматАдреса)
Если РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) И Не МеждународныйФорматАдреса Тогда
Если СтрСравнить(НаселенныйПунктДетально.AddressType, РаботаСАдресамиКлиентСервер.МуниципальныйАдрес()) <> 0 Тогда
НаселенныйПунктДетально.AddressType = РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес();
КонецЕсли;
ИначеЕсли СведенияОСтране.УчастникЕАЭС Тогда
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.АдресЕАЭС();
Иначе
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПеренестиЗначенияПолейАдресВПоляНовогоТипа(ТипАдреса)
ИменаУровнейАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(ТипАдреса, Ложь);
СведенияАдреса = Новый Массив;
Для каждого ИмяУровня Из ИменаУровнейАдреса Цикл
Если НаселенныйПунктДетально.Свойство(ИмяУровня) И ЗначениеЗаполнено(НаселенныйПунктДетально[ИмяУровня]) Тогда
Сведения = ОписаниеСведенийАдреса();
Сведения.Наименование = НаселенныйПунктДетально[ИмяУровня];
Сведения.Сокращение = НаселенныйПунктДетально[ИмяУровня + "Type"];
Сведения.Представление = УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(
Сведения.Наименование, Сведения.Сокращение, СтрСравнить(ИмяУровня, "area") = 0);
СведенияАдреса.Добавить(Сведения);
КонецЕсли;
КонецЦикла;
ИменаВсехУровней = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса("Все", Ложь);
Для каждого ИмяУровня Из ИменаВсехУровней Цикл
НаселенныйПунктДетально[ИмяУровня] = "";
НаселенныйПунктДетально[ИмяУровня + "Type"] = "";
НаселенныйПунктДетально[ИмяУровня + "Id"] = "";
КонецЦикла;
ИменаУровнейНовогоТипа = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(НаселенныйПунктДетально.AddressType, Ложь);
ИмяУровня = ИменаУровнейНовогоТипа.Получить(0);
Разделитель = ", ";
Для Счетчик = 0 По СведенияАдреса.Количество() - 1 Цикл
Если ИменаУровнейНовогоТипа.Количество() > Счетчик Тогда
ИмяУровня = ИменаУровнейНовогоТипа.Получить(Счетчик);
ЗначениеСведенияАдреса = СведенияАдреса.Получить(Счетчик); // см. ОписаниеСведенийАдреса
НаселенныйПунктДетально[ИмяУровня] = ЗначениеСведенияАдреса.Наименование;
НаселенныйПунктДетально[ИмяУровня + "Type"] = ЗначениеСведенияАдреса.Сокращение;
Иначе
НаселенныйПунктДетально[ИмяУровня] = НаселенныйПунктДетально[ИмяУровня] + Разделитель + СведенияАдреса.Получить(Счетчик).Представление;
КонецЕсли;
КонецЦикла;
Если НаселенныйПунктДетально.Свойство("street") Тогда
Если ЭтоИностранныйАдрес(НаселенныйПунктДетально.AddressType) Тогда
НаселенныйПунктДетально["street"] = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеАдресногоОбъекта(
НаселенныйПунктДетально, "street", "Type");
НаселенныйПунктДетально["StreetType"] = ""; // В иностранном адресе нет сокращений.
Иначе
Если Не ЗначениеЗаполнено(НаселенныйПунктДетально["streetType"]) Тогда
ЧастиАдресногоОбъекта = СтрРазделить(НаселенныйПунктДетально["street"], " ");
Если ЧастиАдресногоОбъекта.Количество() > 1 Тогда
НаселенныйПунктДетально["StreetType"] = ЧастиАдресногоОбъекта[ЧастиАдресногоОбъекта.ВГраница()];
ЧастиАдресногоОбъекта.Удалить(ЧастиАдресногоОбъекта.ВГраница());
НаселенныйПунктДетально["street"] = СтрСоединить(ЧастиАдресногоОбъекта, " ");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЭтоИностранныйАдрес(НаселенныйПунктДетально.AddressType) Тогда
Если НаселенныйПунктДетально.Свойство("buildings") Тогда
Если ТипЗнч(НаселенныйПунктДетально["buildings"]) = Тип("Массив") И НаселенныйПунктДетально["buildings"].Количество() > 0 Тогда
ПерваяЗапись = НаселенныйПунктДетально["buildings"].Получить(0);
НаселенныйПунктДетально["buildings"] = Новый Массив;
НаселенныйПунктДетально["buildings"].Добавить(ПерваяЗапись);
Иначе
НаселенныйПунктДетально["buildings"] = Новый Массив;
КонецЕсли;
КонецЕсли;
Если НаселенныйПунктДетально.Свойство("apartments") Тогда
Если ТипЗнч(НаселенныйПунктДетально["apartments"]) = Тип("Массив") И НаселенныйПунктДетально["apartments"].Количество() > 0 Тогда
ПерваяЗапись = НаселенныйПунктДетально["apartments"].Получить(0);
НаселенныйПунктДетально["apartments"] = Новый Массив;
НаселенныйПунктДетально["apartments"].Добавить(ПерваяЗапись);
Иначе
НаселенныйПунктДетально["apartments"] = Новый Массив;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Возвращаемое значение:
// Структура:
// * Наименование - Строка
// * Сокращение - Строка
// * Представление - Строка
//
&НаКлиенте
Функция ОписаниеСведенийАдреса()
Сведения = Новый Структура;
Сведения.Вставить("Наименование", "");
Сведения.Вставить("Сокращение", "");
Сведения.Вставить("Представление", "");
Возврат Сведения;
КонецФункции
&НаКлиенте
Процедура АдаптацияИдентификатораНаселенногоПункта(ИдентификаторНаселенногоПункта)
Если НаселенныйПунктДетально["munDistrictId"] = ИдентификаторНаселенногоПункта
Или НаселенныйПунктДетально["districtId"] = ИдентификаторНаселенногоПункта Тогда
ИдентификаторНаселенногоПункта = НаселенныйПунктДетально["areaId"];
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтобразитьВыбранныйТипАдреса(ВыбранныйТипАдреса = Неопределено)
ПроверкаОбновленияПолейПослеИзмененияПредставления();
ПредставлениеАдресаКеш = Неопределено;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType)
И Элементы.АдресВСвободнойФорме.Пометка Тогда
Если РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) Тогда
// Попытка восстановить адрес по полям из представления.
НаселенныйПунктДетально = КонтактнаяИнформацияПоПредставлению(ПредставлениеАдреса, Комментарий, Истина);
Иначе
УдалитьСтрануИзПредставления();
ИменаУровней = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса("Все", Истина);
Для каждого ИмяУровня Из ИменаУровней Цикл
НаселенныйПунктДетально[ИмяУровня] = "";
НаселенныйПунктДетально[ИмяУровня + "Type"] = "";
НаселенныйПунктДетально[ИмяУровня + "Id"] = "";
КонецЦикла;
НаселенныйПунктДетально["HouseNumber"] = "";
НаселенныйПунктДетально["HouseType"] = "";
НаселенныйПунктДетально["houseId"] = "";
НаселенныйПунктДетально["buildings"] = Новый Массив;
НаселенныйПунктДетально["apartments"] = Новый Массив;
ТипАдреса = ?(СведенияОСтране.УчастникЕАЭС,
УправлениеКонтактнойИнформациейКлиентСервер.АдресЕАЭС(),
УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес());
НаселенныйПунктДетально.AddressType = ТипАдреса;
ЧастиАдреса = СтрРазделить(ПредставлениеАдреса, ",");
Если ЧастиАдреса.Количество() > 0 Тогда
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0));
ИндексИзАдреса = ОписаниеТипаЧисло.ПривестиЗначение(ЧастиАдреса.Получить(0));
Если ИндексИзАдреса >= 0 Тогда
НаселенныйПунктДетально["ZIPCode"] = СокрЛП(ЧастиАдреса.Получить(0));
ЧастиАдреса.Удалить(0);
КонецЕсли;
КонецЕсли;
ИменаУровнейНовогоТипа = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(ТипАдреса, Истина);
Для Счетчик = 0 По ЧастиАдреса.Количество() - 1 Цикл
Если ИменаУровнейНовогоТипа.Количество() > Счетчик Тогда
ИмяУровня = ИменаУровнейНовогоТипа.Получить(Счетчик);
НаселенныйПунктДетально[ИмяУровня] = СокрЛП(ЧастиАдреса.Получить(0));
Иначе
Прервать;
КонецЕсли;
ЧастиАдреса.Удалить(0);
КонецЦикла;
Если ЧастиАдреса.Количество() > 0 Тогда
СведенияОДоме = СтрРазделить(СокрЛП(ЧастиАдреса.Получить(0)), " ");
Если СведенияОДоме.Количество() > 1 Тогда
НаселенныйПунктДетально["HouseType"] = СведенияОДоме.Получить(0);
СведенияОДоме.Удалить(0);
КонецЕсли;
НаселенныйПунктДетально["HouseNumber"] = СтрСоединить(СведенияОДоме, " ");
ЧастиАдреса.Удалить(0);
КонецЕсли;
Если ЧастиАдреса.Количество() > 0 Тогда
СведенияОЗдании = СтрРазделить(СокрЛП(ЧастиАдреса.Получить(0)), " ");
НаселенныйПунктДетально["buildings"] = Новый Массив;
ТипЗданияИзАдреса = СведенияОЗдании.Получить(0);
СведенияОЗдании.Удалить(0);
ДанныеЗдания = СтрСоединить(СведенияОЗдании, " ");
ЗданиеИзАдреса = УправлениеКонтактнойИнформациейКлиентСервер.ЗначениеСтроенияИлиПомещения(ТипЗданияИзАдреса, ДанныеЗдания);
НаселенныйПунктДетально["buildings"].Добавить(ЗданиеИзАдреса);
ЧастиАдреса.Удалить(0);
КонецЕсли;
Если ЧастиАдреса.Количество() > 0 Тогда
СведенияОПомещении = СтрРазделить(СокрЛП(ЧастиАдреса.Получить(0)), " ");
НаселенныйПунктДетально["apartments"] = Новый Массив;
ТипПомещенияИзАдреса = СведенияОПомещении.Получить(0);
СведенияОПомещении.Удалить(0);
ДанныеПомещения = СтрСоединить(СведенияОПомещении, " ");
ПомещениеИзАдреса = УправлениеКонтактнойИнформациейКлиентСервер.ЗначениеСтроенияИлиПомещения(ТипПомещенияИзАдреса, ДанныеПомещения);
НаселенныйПунктДетально["apartments"].Добавить(ПомещениеИзАдреса);
ЧастиАдреса.Удалить(0);
КонецЕсли;
КонецЕсли;
ПереключитьОтображениеАдресВСвободнойФорме();
КонецЕсли;
Если ВыбранныйТипАдреса = РаботаСАдресамиКлиентСервер.МуниципальныйАдрес() Тогда
Если ПустаяСтрока(НаселенныйПунктДетально.munDistrict)
И ПустаяСтрока(НаселенныйПунктДетально.settlement) Тогда
УстановитьМуниципальныеСведения(НаселенныйПунктДетально);
КонецЕсли;
КонецЕсли;
Если ВыбранныйТипАдреса <> Неопределено Тогда
НаселенныйПунктДетально.AddressType = ВыбранныйТипАдреса;
КонецЕсли;
ОбработкаИзмененияАдреса();
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
ПроизвольныйВводАдреса = Ложь;
ПереключитьОтображениеАдресВСвободнойФорме();
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоИностранныйАдресИлиЕАЭС(НаселенныйПунктДетально.AddressType) Тогда
ВидимостьПолейИностраногоАдреса(Истина);
КонецЕсли;
УстановитьФлагиВМенюПоТипуАдреса();
ПоказатьПодсказкуПоТипАдреса();
КонецПроцедуры
&НаКлиенте
Процедура УдалитьСтрануИзПредставления()
НаименованиеСтраны = ВРег(НаименованиеСтраны(Страна,
ОписаниеВидаКонтактнойИнформации(ЭтотОбъект).МеждународныйФорматАдреса));
ПредставлениеАдреса = СокрЛП(ПредставлениеАдреса);
Если СтрНачинаетсяС(ВРег(ПредставлениеАдреса), НаименованиеСтраны) Тогда
Позиция = СтрДлина(НаименованиеСтраны) + 1;
Позиция = ?(Сред(ПредставлениеАдреса, Позиция, 1) = ",", Позиция + 1, Позиция);
ПредставлениеАдреса = СокрЛП(Сред(ПредставлениеАдреса, Позиция));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСписокДомовИлиЗемельныхУчастков(ВключитьОтбор)
Идентификатор = ИдентификаторАдреса(НаселенныйПунктДетально, Истина);
Если ЗначениеЗаполнено(Идентификатор) Тогда
НаименованиеАдресногоОбъекта = РаботаСАдресамиКлиентСервер.НаименованиеРодительскогоОбъекта(НаселенныйПунктДетально, Идентификатор);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ТипДома", ТипДома);
ПараметрыФормы.Вставить("Номер", Дом);
ПараметрыФормы.Вставить("Идентификатор", Идентификатор);
ПараметрыФормы.Вставить("НаименованиеАдресногоОбъекта", НаименованиеАдресногоОбъекта);
ПараметрыФормы.Вставить("Строение", Строение);
ПараметрыФормы.Вставить("ТипСтроения", ТипСтроения);
ПараметрыФормы.Вставить("Отбор", ВключитьОтбор);
ОповещениеОЗакрытие = Новый ОписаниеОповещения("ВыбранДом", ЭтотОбъект);
ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборДома", ПараметрыФормы,
ЭтотОбъект,,,, ОповещениеОЗакрытие, РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца);
Иначе
Если ЗначениеЗаполнено(ПредставлениеАдреса) Тогда
ТекстПредупреждения = НСтр("ru = 'Выбор из списка недоступен, т.к в адресном классификаторе отсутствует информация о нумерации домов для введенного адреса.'");
Иначе
ТекстПредупреждения = НСтр("ru = 'Для просмотра списка домов заполните поля адреса.'");
КонецЕсли;
ПоказатьПредупреждение(, ТекстПредупреждения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСписокПомещений()
ИдентификаторДома = ИдентификаторАдреса(НаселенныйПунктДетально, Истина, Истина);
Если ЗначениеЗаполнено(ИдентификаторДома) Тогда
ИдентификаторУлицы = ИдентификаторАдреса(НаселенныйПунктДетально, Истина);
НаименованиеАдресногоОбъекта = "";
Если ЗначениеЗаполнено(ИдентификаторУлицы) Тогда
НаименованиеАдресногоОбъекта = РаботаСАдресамиКлиентСервер.НаименованиеРодительскогоОбъекта(НаселенныйПунктДетально, ИдентификаторУлицы);
КонецЕсли;
НаименованиеДома = УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(Дом, НРег(ТипДома), Ложь);
НаименованиеАдресногоОбъекта = НаименованиеАдресногоОбъекта + " " + НаименованиеДома;
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Идентификатор", ИдентификаторДома);
ПараметрыФормы.Вставить("НаименованиеАдресногоОбъекта", НаименованиеАдресногоОбъекта);
ПараметрыФормы.Вставить("НомерПомещения", Помещение);
ПараметрыФормы.Вставить("ТипПомещения", ТипПомещения);
ОповещениеОЗакрытие = Новый ОписаниеОповещения("ВыбраноПомещение", ЭтотОбъект);
ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ВыборПомещения", ПараметрыФормы,
ЭтотОбъект,,,, ОповещениеОЗакрытие, РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца);
Иначе
Если ЗначениеЗаполнено(ПредставлениеАдреса) Тогда
ТекстПредупреждения = НСтр("ru = 'Выбор из списка недоступен, т.к в адресном классификаторе отсутствует информация о нумерации помещений для введенного адреса.'");
Иначе
ТекстПредупреждения = НСтр("ru = 'Для просмотра списка помещений заполните поля адреса.'");
КонецЕсли;
ПоказатьПредупреждение(, ТекстПредупреждения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВопросОбОбновлениеАдресногоКлассификатора(Знач СообщениеОПроверкеАдреса)
Кнопки = Новый СписокЗначений();
Кнопки.Добавить("Закрыть", НСтр("ru = 'Закрыть'"));
Кнопки.Добавить("ОбновитьКлассификатор", НСтр("ru = 'Обновить классификатор'"));
Оповещение = Новый ОписаниеОповещения("ПослеВопросОбОбновление", ЭтотОбъект);
ПоказатьВопрос(Оповещение, СообщениеОПроверкеАдреса, Кнопки);
КонецПроцедуры
&НаКлиенте
Процедура ВыбранДом(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
НаселенныйПунктДетально.apartmentId = "";
ЗаполнитьПоляДомовСтроенийЗемельныхУчастков(Результат);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыбраноПомещение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
ЗаполнитьПоляПомещения(Результат);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПиктограммуКомментария()
Элементы.СтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Комментарий);
КонецПроцедуры
// Возвращаемое значение:
// Структура:
// * ВидКонтактнойИнформации - см. УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации
// * НаселенныйПунктДетально - Структура
// * ОсновнаяСтрана - СправочникСсылка.СтраныМира
// * Страна - СправочникСсылка.СтраныМира
// * ИсключатьГородИзМуниципальногоАдреса - Булево
//
&НаКлиенте
Функция ОписаниеКонтекста()
Контекст = Новый Структура;
Контекст.Вставить("ВидКонтактнойИнформации", Новый Структура);
Контекст.Вставить("НаселенныйПунктДетально", Новый Структура);
Контекст.Вставить("ОсновнаяСтрана", Неопределено);
Контекст.Вставить("Страна", Неопределено);
Контекст.Вставить("ИсключатьГородИзМуниципальногоАдреса", Ложь);
ЗаполнитьЗначенияСвойств(Контекст, ЭтотОбъект);
Возврат Контекст;
КонецФункции
&НаКлиенте
Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
Если Модифицированность Тогда // При немодифицированности работает как "отмена".
Контекст = ОписаниеКонтекста();
Результат = РезультатВыбора(Контекст, ВозвращатьСписокЗначений);
// Флаги вида были прочитаны заново.
ВидКонтактнойИнформации = Контекст.ВидКонтактнойИнформации;
Если (ВидКонтактнойИнформации.ПроверятьКорректность И Не РазрешитьВводАдресаВСвободнойФорме
Или ВидКонтактнойИнформации.МеждународныйФорматАдреса)
И Результат.ОшибкиЗаполнения.Количество() > 0 Тогда
СообщитьОбОшибкахЗаполнения(Результат.ОшибкиЗаполнения, Ложь);
Возврат;
КонецЕсли;
Результат = Результат.ДанныеВыбора;
Если ВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда
ОбработатьКонтактнуюИнформациюСИсторией(Результат);
КонецЕсли;
Если ТипЗнч(Результат) = Тип("Структура") Тогда
Результат.Вставить("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов", КонтактнаяИнформацияОписаниеДополнительныхРеквизитов);
КонецЕсли;
СброситьМодифицированностьПриВыборе();
#Если ВебКлиент Тогда
ФлагЗакрытия = ЗакрыватьПриВыборе;
ЗакрыватьПриВыборе = Ложь;
ОповеститьОВыборе(Результат);
ЗакрыватьПриВыборе = ФлагЗакрытия;
#Иначе
ОповеститьОВыборе(Результат);
#КонецЕсли
СохранитьСостояниеФормы();
Иначе
Результат = Неопределено;
КонецЕсли;
Если (МодальныйРежим Или ЗакрыватьПриВыборе) И Открыта() Тогда
СброситьМодифицированностьПриВыборе();
СохранитьСостояниеФормы();
Закрыть(Результат);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьКонтактнуюИнформациюСИсторией(Результат)
Результат.Вставить("ДействуетС", ?(ВводНовогоАдреса, АдресНаДату, АдресДействуетС));
ИмяРеквизита = "";
Отбор = Новый Структура("Вид", Результат.Вид);
СтрокаДействующегоАдреса = Неопределено;
ДатаБылаИзменена = Истина;
ТекущаяДатаАдреса = ОбщегоНазначенияКлиент.ДатаСеанса();
Дельта = АдресНаДату - ТекущаяДатаАдреса;
МинимальнаяДельта = ?(Дельта > 0, Дельта, -Дельта);
НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
Если ЗначениеЗаполнено(НайденнаяСтрока.ИмяРеквизита) Тогда
ИмяРеквизита = НайденнаяСтрока.ИмяРеквизита;
КонецЕсли;
Если НайденнаяСтрока.ДействуетС = АдресНаДату Тогда
ДатаБылаИзменена = Ложь;
СтрокаДействующегоАдреса = НайденнаяСтрока;
Прервать;
КонецЕсли;
Дельта = ТекущаяДатаАдреса - НайденнаяСтрока.ДействуетС;
Дельта = ?(Дельта > 0, Дельта, -Дельта);
Если Дельта <= МинимальнаяДельта Тогда
МинимальнаяДельта = Дельта;
СтрокаДействующегоАдреса = НайденнаяСтрока;
КонецЕсли;
КонецЦикла;
Если СтрокаДействующегоАдреса <> Неопределено Тогда
ДанныеБылиИзменены = ДанныеБылиИзменены(Результат.Значение, СтрокаДействующегоАдреса.Значение);
Иначе
ДанныеБылиИзменены = Истина;
КонецЕсли;
Если ДатаБылаИзменена Тогда
Отбор = Новый Структура("ДействуетС, Вид", АдресДействуетС, Результат.Вид);
СтрокиСАдресом = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Если ДанныеБылиИзменены Тогда
НоваяКонтактнаяИнформация = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить();
ЗаполнитьЗначенияСвойств(НоваяКонтактнаяИнформация, Результат);
НоваяКонтактнаяИнформация.ЗначенияПолей = Результат.КонтактнаяИнформация;
НоваяКонтактнаяИнформация.Значение = Результат.Значение;
НоваяКонтактнаяИнформация.ДействуетС = АдресНаДату;
НоваяКонтактнаяИнформация.ХранитьИсториюИзменений = Истина;
Если СтрокаДействующегоАдреса = Неопределено Тогда
Отбор = Новый Структура("ЭтоИсторическаяКонтактнаяИнформация, Вид", Ложь, Результат.Вид);
НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
НайденнаяСтрока.ЭтоИсторическаяКонтактнаяИнформация = Истина;
НайденнаяСтрока.ИмяРеквизита = "";
КонецЦикла;
НоваяКонтактнаяИнформация.ИмяРеквизита = ИмяРеквизита;
НоваяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Ложь;
Иначе
НоваяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Истина;
Результат.Представление = СтрокаДействующегоАдреса.Представление;
Результат.КонтактнаяИнформация = СтрокаДействующегоАдреса.ЗначенияПолей;
Результат.Значение = СтрокаДействующегоАдреса.Значение;
КонецЕсли;
ИначеЕсли СтрокаДействующегоАдреса <> Неопределено
И СтрСравнить(Результат.Комментарий, СтрокаДействующегоАдреса.Комментарий) <> 0
И СтрокиСАдресом.Количество() > 0 Тогда
// Поменяли только комментарий.
СтрокиСАдресом[0].Комментарий = Результат.Комментарий;
КонецЕсли;
Иначе
Если ДанныеБылиИзменены Тогда
ЗаполнитьЗначенияСвойств(СтрокаДействующегоАдреса, Результат);
СтрокаДействующегоАдреса.ЗначенияПолей = Результат.КонтактнаяИнформация;
СтрокаДействующегоАдреса.Значение = Результат.Значение;
СтрокаДействующегоАдреса.ИмяРеквизита = ИмяРеквизита;
СтрокаДействующегоАдреса.ЭтоИсторическаяКонтактнаяИнформация = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДанныеБылиИзменены(ЗначениеПолейДо, ЗначениеПолейПосле)
Если СтрСравнить(ЗначениеПолейПосле, ЗначениеПолейДо) = 0 Тогда
Возврат Ложь;
КонецЕсли;
Если ЗначениеЗаполнено(ЗначениеПолейДо)И ЗначениеЗаполнено(ЗначениеПолейПосле) Тогда
ЗначенияДо = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(ЗначениеПолейДо, Перечисления.ТипыКонтактнойИнформации.Адрес);
ЗначенияПосле = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(ЗначениеПолейПосле, Перечисления.ТипыКонтактнойИнформации.Адрес);
Если СтрСравнить(ЗначенияДо.value, ЗначенияПосле.value) <> 0
Или СтрСравнить(ЗначенияДо.country, ЗначенияПосле.country) <> 0
Или СтрСравнить(ЗначенияДо.comment, ЗначенияПосле.comment) <> 0
Или СтрСравнить(ЗначенияДо.oktmo, ЗначенияПосле.oktmo) <> 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецЕсли;
Возврат Истина; // Один из вариантов пустой, другой заполнен.
КонецФункции
&НаКлиенте
Процедура ПослеЗакрытияФормыИстории(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ВводНовогоАдреса = ?(Результат.Свойство("ВводНовогоАдреса"), Результат.ВводНовогоАдреса, Ложь);
Если ВводНовогоАдреса Тогда
АдресДействуетС = АдресНаДату;
АдресНаДату = Результат.ТекущийАдрес;
Страна = ОсновнаяСтрана;
ТипАдреса = НаселенныйПунктДетально.addressType;
НаселенныйПунктДетально = РаботаСАдресамиКлиентСервер.ОписаниеНовойКонтактнойИнформации(ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес"));
НаселенныйПунктДетально.Country = Строка(Страна);
НаселенныйПунктДетально.addressType = ТипАдреса;
ОбработкаИзмененияАдреса();
Иначе
Отбор = Новый Структура("Вид", ОписаниеВидаКонтактнойИнформации(ЭтотОбъект).Ссылка);
НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
ИмяРеквизита = "";
Для Каждого СтрокаКонтактнойИнформации Из НайденныеСтроки Цикл
Если НЕ СтрокаКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда
ИмяРеквизита = СтрокаКонтактнойИнформации.ИмяРеквизита;
КонецЕсли;
КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Удалить(СтрокаКонтактнойИнформации);
КонецЦикла;
Для Каждого СтрокаКонтактнойИнформации Из Результат.История Цикл
ДанныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить();
ЗаполнитьЗначенияСвойств(ДанныеСтроки, СтрокаКонтактнойИнформации);
Если НЕ СтрокаКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда
ДанныеСтроки.ИмяРеквизита = ИмяРеквизита;
КонецЕсли;
Если НачалоДня(Результат.ТекущийАдрес) = НачалоДня(СтрокаКонтактнойИнформации.ДействуетС) Тогда
АдресНаДату = Результат.ТекущийАдрес;
НаселенныйПунктДетально = СтрокаJSONВСтруктуру(СтрокаКонтактнойИнформации.Значение);
Комментарий = НаселенныйПунктДетально.comment;
ОбработкаИзмененияАдреса();
КонецЕсли;
КонецЦикла;
КонецЕсли;
ОтобразитьИнформациюОДатахДействияАдреса(АдресНаДату);
Если НЕ Модифицированность Тогда
Модифицированность = Результат.Модифицированность;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СтрокаJSONВСтруктуру(Значение)
Возврат УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Значение, Перечисления.ТипыКонтактнойИнформации.Адрес);
КонецФункции
&НаКлиенте
Процедура СохранитьСостояниеФормы()
УстановитьКлючИспользованияФормы();
СохраняемыеВНастройкахДанныеМодифицированы = Истина;
КонецПроцедуры
&НаКлиенте
Процедура СброситьМодифицированностьПриВыборе()
Модифицированность = Ложь;
КопияКомментария = Комментарий;
КонецПроцедуры
// Параметры:
// Контекст - см. ОписаниеКонтекста
//
// ВозвращатьСписокЗначений - Булево
// Возвращаемое значение:
// Структура:
// * ДанныеВыбора - Структура:
// ** Представление - Строка
// ** КонтактнаяИнформация - Строка
// ** Значение - Строка
// ** Комментарий - Строка
// ** ВведеноВСвободнойФорме - Булево
// ** ВВидеГиперссылки - Булево
// ** Вид - СправочникСсылка.ВидыКонтактнойИнформации
// ** Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации
// * ОшибкиЗаполнения - Массив из Строка
//
&НаСервереБезКонтекста
Функция РезультатВыбора(Контекст, ВозвращатьСписокЗначений = Ложь)
// Обновляем некоторые флаги
ВидКИ = Контекст.ВидКонтактнойИнформации; // см. УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации
ЗначениеФлагов = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(ВидКИ.Ссылка);
ВидКИ.ТолькоНациональныйАдрес = ЗначениеФлагов.ТолькоНациональныйАдрес;
ВидКИ.ПроверятьКорректность = ЗначениеФлагов.ПроверятьКорректность;
НаселенныйПунктДетально = Контекст.НаселенныйПунктДетально;
Результат = Новый Структура("ДанныеВыбора, ОшибкиЗаполнения");
НаселенныйПунктДетально.Value = РаботаСАдресамиКлиентСервер.ПредставлениеАдреса(НаселенныйПунктДетально, ВидКИ.ВключатьСтрануВПредставление);
Если ВозвращатьСписокЗначений Тогда
ДанныеВыбора = Обработки.РасширенныйВводКонтактнойИнформации.КонтактнаяИнформацияВСтаруюСтруктуру(НаселенныйПунктДетально);
ИначеЕсли Контекст.Страна = Контекст.ОсновнаяСтрана И ПустаяСтрока(НаселенныйПунктДетально.Value) Тогда
ДанныеВыбора = "";
Иначе
ДанныеВыбора = НаселенныйПунктДетально;
КонецЕсли;
КонтактнаяИнформация = "";
Если ТипЗнч(ДанныеВыбора) = Тип("Структура") Тогда
Если ПустаяСтрока(ДанныеВыбора.countryCode) Тогда
СведенияОСтране = УправлениеКонтактнойИнформацией.ДанныеСтраныМира(Неопределено, ДанныеВыбора.Country);
Если СведенияОСтране <> Неопределено Тогда
ДанныеВыбора.countryCode = СведенияОСтране.Код;
КонецЕсли;
КонецЕсли;
Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(ДанныеВыбора);
УправлениеКонтактнойИнформациейЛокализация.ПриКонвертированииКонтактнуюИнформациюИзJSONВXML(ДанныеВыбора,
КонтактнаяИнформация, Перечисления.ТипыКонтактнойИнформации.Адрес);
Иначе
Значение = "";
КонецЕсли;
Результат.ДанныеВыбора = Новый Структура;
Результат.ДанныеВыбора.Вставить("КонтактнаяИнформация", КонтактнаяИнформация);
Результат.ДанныеВыбора.Вставить("Значение", Значение);
Результат.ДанныеВыбора.Вставить("Представление", НаселенныйПунктДетально.Value);
Результат.ДанныеВыбора.Вставить("Комментарий", НаселенныйПунктДетально.Comment);
Результат.ДанныеВыбора.Вставить("ВведеноВСвободнойФорме",
УправлениеКонтактнойИнформациейСлужебный.АдресВведенВСвободнойФорме(НаселенныйПунктДетально));
// ошибки заполнения
Результат.ОшибкиЗаполнения = Новый Массив;
ПроверятьКорректность = ВидКИ.ПроверятьКорректность Или ВидКИ.МеждународныйФорматАдреса;
Если ПроверятьКорректность И ЗначениеЗаполнено(Значение) Тогда
Результат.ОшибкиЗаполнения = Обработки.РасширенныйВводКонтактнойИнформации.ОшибкиЗаполненияАдреса(
Значение, ВидКИ);
КонецЕсли;
Результат.ДанныеВыбора.Вставить("ВВидеГиперссылки", Контекст.ВидКонтактнойИнформации.ВидРедактирования = "Диалог");
// Подавляем перенос строк в возвращаемом отдельно представлении.
Результат.ДанныеВыбора.Представление = СокрЛП(СтрЗаменить(Результат.ДанныеВыбора.Представление, Символы.ПС, " "));
Результат.ДанныеВыбора.Вставить("Вид",ВидКИ.Ссылка);
Результат.ДанныеВыбора.Вставить("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Функция СписокОшибокЗаполнения(Адрес, ВидКонтактнойИнформации, ПредупреждатьОбОтсутствии, ТребуетсяОбновление = Ложь)
Результат = Обработки.РасширенныйВводКонтактнойИнформации.ОшибкиЗаполненияАдреса(Адрес, ВидКонтактнойИнформации);
ОпределитьНеобходимостьОбновленияКлассификатора(Адрес, ТребуетсяОбновление);
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Процедура ОпределитьНеобходимостьОбновленияКлассификатора(Знач НаселенныйПунктДетально, ТребуетсяОбновление)
// проверка источника
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
ИнформацияОбОбновление = МодульАдресныйКлассификаторСлужебный.ОписаниеПоследнейЗагрузки(НаселенныйПунктДетально.AreaID);
ТребуетсяОбновление = ИнформацияОбОбновление.НеобходимоОбновление;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция НаименованиеРегиона(НаселенныйПункт)
Возврат СокрЛП(НаселенныйПункт.area + " " + НаселенныйПункт.areaType);
КонецФункции
&НаСервереБезКонтекста
Функция АдресныеСведенияКлассификатораЗагружены(НаименованиеРегиона)
Результат = Новый Структура;
Результат.Вставить("АдресныйКлассификаторДоступен", Ложь);
Результат.Вставить("РегионЗагружен", Ложь);
Результат.Вставить("СведенияУстарели", Ложь);
Результат.Вставить("ТекстОшибки", "");
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
Результат.АдресныйКлассификаторДоступен = Истина;
МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор");
КодРегиона = МодульАдресныйКлассификатор.КодРегионаПоНаименованию(НаименованиеРегиона);
СведенияОАдресномКлассификаторе = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.СведенияОДоступностиАдресногоКлассификатора();
Результат.ТекстОшибки = СведенияОАдресномКлассификаторе["ТекстОшибки"];
СведенияОРегиона = СведенияОАдресномКлассификаторе.Получить(КодРегиона);
Если ТипЗнч(СведенияОРегиона) = Тип("Структура") Тогда
Результат.РегионЗагружен = СведенияОРегиона.ИспользоватьЗагруженные;
ОписаниеДаты = Новый ОписаниеТипов("Дата");
ДатаЗагрузки = ОписаниеДаты.ПривестиЗначение(СведенияОРегиона.ДатаЗагрузки);
Если ТекущаяДатаСеанса() - ДатаЗагрузки > 2592000 Тогда
Результат.СведенияУстарели = Истина; // Данным более 30 дней.
КонецЕсли;
Иначе
Результат.РегионЗагружен = СведенияОАдресномКлассификаторе.Получить("ИспользоватьЗагруженные");
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Функция ЗаполнитьСписокКонтактнойИнформации(ВидКонтактнойИнформации, КонтактнаяИнформацияОписаниеДополнительныхРеквизитов)
Отбор = Новый Структура("Вид", ВидКонтактнойИнформации);
НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
СписокКонтактнойИнформации = Новый Массив;
Для каждого СтрокаКонтактнойИнформации Из НайденныеСтроки Цикл
КонтактнаяИнформация = НовыйСписокКонтактнойИнформации();
ЗаполнитьЗначенияСвойств(КонтактнаяИнформация, СтрокаКонтактнойИнформации);
СписокКонтактнойИнформации.Добавить(КонтактнаяИнформация);
КонецЦикла;
Возврат СписокКонтактнойИнформации;
КонецФункции
&НаКлиенте
Процедура ЗаполнитьПолеИностранногоАдреса(ИмяПоля, ЗначениеПоля)
НаселенныйПунктДетально[ИмяПоля] = ЗначениеПоля;
НаселенныйПунктДетально[ИмяПоля + "Type"] = "";
НаселенныйПунктДетально[ИмяПоля + "ID"] = "";
ОбновитьСписокУровней(НаселенныйПунктДетально, ИмяПоля, ЗначениеЗаполнено(ЗначениеПоля));
ОбновитьПредставлениеАдреса();
КонецПроцедуры
// Возвращаемое значение:
// Структура:
// * Представление - Строка
// * Значение - Строка
// * ЗначенияПолей - Строка
// * ДействуетС - Неопределено, Дата
// * Комментарий - Строка
//
&НаСервереБезКонтекста
Функция НовыйСписокКонтактнойИнформации()
Результат = Новый Структура;
Результат.Вставить("Представление", "");
Результат.Вставить("Значение", "");
Результат.Вставить("ЗначенияПолей", "");
Результат.Вставить("ДействуетС", Неопределено);
Результат.Вставить("Комментарий", "");
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ПослеЗагрузкиАдресногоКлассификатора(Результат, ДополнительныеПараметры) Экспорт
Если ТипЗнч(НаселенныйПунктДетально) = Тип("Структура") И НаселенныйПунктДетально.Свойство("areaId") Тогда
СообщениеОНеобходимостиОбновленияКлассификатора(НаселенныйПунктДетально.areaId);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СообщениеОНеобходимостиОбновленияКлассификатора(Идентификатор = Неопределено)
Элементы.АдресныйКлассификаторУстарел.Видимость = Ложь;
Если НЕ ВебСервисИспользуется И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
ИнформацияОбОбновление = МодульАдресныйКлассификаторСлужебный.ОписаниеПоследнейЗагрузки(Идентификатор);
Элементы.АдресныйКлассификаторУстарел.Видимость = ИнформацияОбОбновление.НеобходимоОбновление;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПривестиИндексКФорматуСтраны()
ИндексБылИзменен = Ложь;
МаксимальнаяДлинаПочтовогоИндекса = ?(ЭтоНациональныйАдрес(), 6, 10);
Элементы.Индекс.ОграничениеТипа = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(МаксимальнаяДлинаПочтовогоИндекса));
Если ЭтоНациональныйАдрес() И ЗначениеЗаполнено(Индекс) Тогда
ЛишниеСимволы = СтрСоединить(СтрРазделить(Индекс, "0123456789"), "");
Индекс = СтрСоединить(СтрРазделить(Индекс, ЛишниеСимволы), "");
Если ЗначениеЗаполнено(ЛишниеСимволы) Тогда
ИндексБылИзменен = Истина;
КонецЕсли;
Если СтрДлина(Индекс) > МаксимальнаяДлинаПочтовогоИндекса Тогда
Индекс = Лев(Индекс, МаксимальнаяДлинаПочтовогоИндекса);
НаселенныйПунктДетально.Zipcode = Индекс;
ИндексБылИзменен = Истина;
КонецЕсли;
КонецЕсли;
Возврат ИндексБылИзменен;
КонецФункции
&НаКлиенте
Функция ЭтоНациональныйАдрес()
Возврат РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) И Не МеждународныйФорматАдреса;
КонецФункции
&НаКлиенте
Процедура ОтобразитьПоляПоТипуАдреса()
ЭтоНациональныйАдрес = ЭтоНациональныйАдрес();
ОпределитьДоступностьАвтоПодборАдреса();
Если МеждународныйФорматАдреса Тогда
НаселенныйПунктДетально.Country = ?(ЗначениеЗаполнено(СведенияОСтране.МеждународноеНаименование),
СведенияОСтране.МеждународноеНаименование, ДанныеСтраныМира(СведенияОСтране).Наименование);
Иначе
НаселенныйПунктДетально.Country = ДанныеСтраныМира(СведенияОСтране).Наименование;
КонецЕсли;
УлицаЗаголовок = НСтр("ru = 'Улица'");
ОтображатьПоляИностранногоАдреса = Ложь;
Если ЭтоНациональныйАдрес Тогда
Если ПустаяСтрока(НаселенныйПунктДетально.AddressType) Тогда
НаселенныйПунктДетально.AddressType = РаботаСАдресамиКлиентСервер.МуниципальныйАдрес();
КонецЕсли;
ЭтоЗемельныйУчасток = ?(ЭтоЗемельныйУчасток(ТипДома), Истина, Ложь);
Элементы.ОКТМО.Видимость = ВидКонтактнойИнформации.УказыватьОКТМО;
ВебСервисИспользуется = ВебКлассификаторДоступен;
АвтоподборДоступен = ИспользуетсяАдресныйКлассификатор И (ВебКлассификаторДоступен Или ЕстьЗагруженныйКлассификатор);
ВидимостьСтроений = Истина;
Элементы.ГруппаДобавлениеСтроения.Видимость = Истина;
Элементы.ГруппаДобавлениеПомещения.Видимость = Истина;
Элементы.Дом.КнопкаВыбора = АвтоподборДоступен;
Элементы.Улица.КнопкаВыбора = АвтоподборДоступен;
Элементы.НаселенныйПункт.КнопкаВыбора = Истина;
Элементы.Строение.КнопкаВыбора = Ложь;
Элементы.Помещение.КнопкаВыбора = АвтоподборДоступен;
Элементы.Строение.Доступность = Не ЭтоЗемельныйУчасток;
Элементы.ТипСтроения.Доступность = Не ЭтоЗемельныйУчасток;
Элементы.НаселенныйПункт.ПодсказкаВвода = НСтр("ru = 'Выберите или введите название населенного пункта'");
Иначе
Элементы.ГруппаДобавлениеСтроения.Видимость = Ложь;
Элементы.ГруппаДобавлениеПомещения.Видимость = Ложь;
Если Не МеждународныйФорматАдреса Тогда
ВидимостьСтроений = Истина;
Элементы.Дом.КнопкаВыбора = Ложь;
Элементы.Строение.КнопкаВыбора = Ложь;
ОтображатьПоляИностранногоАдреса = Истина;
Элементы.Помещение.КнопкаВыбора = Ложь;
Иначе
УлицаЗаголовок = НСтр("ru = 'Адрес'");
ВидимостьСтроений = Ложь;
КонецЕсли;
Элементы.ОКТМО.Видимость = Ложь;
Элементы.ПроверитьЗаполнениеАдреса.Доступность = Ложь;
ВебСервисИспользуется = Ложь;
АвтоподборДоступен = Ложь;
Элементы.НаселенныйПункт.КнопкаВыбора = Ложь;
Элементы.НаселенныйПункт.ПодсказкаВвода = "";
Элементы.Улица.КнопкаВыбора = Ложь;
Элементы.Улица.ПодсказкаВвода = "";
КонецЕсли;
Элементы.Улица.Заголовок = УлицаЗаголовок;
ВидимостьПолейИностраногоАдреса(ОтображатьПоляИностранногоАдреса);
// Проверять, вводить в свободной форме и искать по индексу можем только российские адреса.
Элементы.Улица.МногострочныйРежим = Не ВидимостьСтроений; // Если нет строений, то улица многострочная
Элементы.ГруппаСтроенияИИнформация.Видимость = ВидимостьСтроений;
Элементы.ПроверитьЗаполнениеАдреса.Доступность = ЭтоНациональныйАдрес И АвтоподборДоступен;
Элементы.ЗаполнитьПоПочтовомуИндексу.Доступность = ЭтоНациональныйАдрес;
Элементы.МуниципальноеДеление.Доступность = ЭтоНациональныйАдрес;
Элементы.АдминистративноТерриториальноеДеление.Доступность = ЭтоНациональныйАдрес;
Если ВидКонтактнойИнформации.ВключатьСтрануВПредставление И ЭтоНациональныйАдрес() Тогда
ОбновитьПредставлениеАдреса();
КонецЕсли;
УстановитьФлагиВМенюПоТипуАдреса();
ПоказатьПодсказкуПоТипАдреса();
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
ПоказатьАдресВСвободнойФорме();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВидимостьПолейИностраногоАдреса(Видимость)
Элементы.РегионИностранногоАдреса.Видимость = Видимость;
Элементы.РайонИностранногоАдреса.Видимость = Видимость;
Элементы.ВнутригородскойРайонИностранногоАдреса.Видимость = Видимость;
КонецПроцедуры
&НаКлиенте
Процедура ОпределитьДоступностьАвтоПодборАдреса()
Если Не РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) Тогда
АвтоподборДоступен = Ложь;
Возврат;
КонецЕсли;
АвтоподборДоступен = ВебКлассификаторДоступен Или ЕстьЗагруженныйКлассификатор;
КонецПроцедуры
&НаСервере
Процедура ОпределитьОтображениеЭлементовИЦветов(ТолькоПросмотр)
ЦветФонаФормы = ЦветаСтиля.ЦветФонаФормы;
ЦветПоясняющегоТекста = ЦветаСтиля.ПоясняющийТекст;
Если Не ЕстьЗагруженныйКлассификатор Тогда
Элементы.ЗаполнитьПоПочтовомуИндексу.Видимость = Ложь;
Элементы.Улица.КнопкаВыбора = Ложь;
Элементы.Дом.КнопкаВыбора = Ложь;
Элементы.Строение.КнопкаВыбора = Ложь;
Элементы.Помещение.КнопкаВыбора = Ложь;
Элементы.НаселенныйПункт.ПодсказкаВвода = НСтр("ru = 'Выберите или введите название населенного пункта'");
КонецЕсли;
Если ВебКлассификаторДоступен Или МеждународныйФорматАдреса Тогда
Элементы.ГруппаИнформация.Видимость = Ложь;
Иначе
СведенияОЗагрузке = АдресныеСведенияКлассификатораЗагружены(НаименованиеРегиона(НаселенныйПунктДетально));
Если СведенияОЗагрузке.АдресныйКлассификаторДоступен Тогда
Если Не СведенияОЗагрузке.РегионЗагружен Тогда
ТекстОшибки = ДополнитьТекстОшибкиСсылкойДляЗагрузки(СведенияОЗагрузке);
Элементы.ИнформацияОЗагрузкеАдресныеСведений.Заголовок = ТекстОшибки;
Элементы.ГруппаИнформация.Видимость = Истина;
Иначе
Элементы.ГруппаИнформация.Видимость = Ложь;
Элементы.АдресныйКлассификаторУстарел.Видимость = СведенияОЗагрузке.СведенияУстарели;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ТолькоПросмотр Тогда
Элементы.ГруппаКомандаДобавить.Видимость = Ложь;
Элементы.ДобавитьКомментарий.Доступность = Ложь;
Элементы.ФормаОчиститьАдрес.Доступность = Ложь;
Элементы.АдресНаДату.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ДополнитьТекстОшибкиСсылкойДляЗагрузки(СведенияОЗагрузке)
Если ПустаяСтрока(СведенияОЗагрузке.ТекстОшибки) Тогда
Возврат "";
КонецЕсли;
Если Не ОбщегоНазначения.РазделениеВключено() Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
ИППодключена = МодульАдресныйКлассификаторСлужебный.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки();
Если Не ИППодключена Тогда
ТекстОшибки = СтроковыеФункции.ФорматированнаяСтрока(СведенияОЗагрузке.ТекстОшибки + " <a href=""load"">%1</a>", НСтр("ru = 'Загрузить'"));
Возврат ТекстОшибки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат СведенияОЗагрузке.ТекстОшибки;
КонецФункции
&НаСервере
Процедура УстановитьСписокВыбораЭлемента(ЭлементВид, ЭлементЗначение, Данные)
ЭлементЗначение.КнопкаВыпадающегоСписка = Данные.МожноПодбиратьЗначения;
СписокТипов = Данные.ВариантыТипа;
ЭлементВид.КнопкаВыпадающегоСписка = СписокТипов.Количество() > 0;
Если ЭлементВид.КнопкаВыпадающегоСписка Тогда
Для Каждого НаименованиеТипа Из СписокТипов Цикл
Если ЭлементВид.СписокВыбора.НайтиПоЗначению(НаименованиеТипа) = Неопределено Тогда
ЭлементВид.СписокВыбора.Добавить(НаименованиеТипа);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначениеРеквизитовПоКонтактнойИнформации(ДанныеАдреса)
// Общие реквизиты
ПредставлениеАдреса = ДанныеАдреса.Value;
Если ДанныеАдреса.Свойство("Comment") Тогда
Комментарий = ДанныеАдреса.Comment;
КонецЕсли;
СсылкаНаОсновнуюСтрану = РаботаСАдресамиКлиентСервер.ОсновнаяСтрана();
ДанныеСтраны = Неопределено;
Если ДанныеАдреса.Свойство("Country") И ЗначениеЗаполнено(ДанныеАдреса.Country) Тогда
ДанныеСтраны = Справочники.СтраныМира.ДанныеСтраныМира(, СокрЛП(ДанныеАдреса.Country));
КонецЕсли;
Если ДанныеСтраны = Неопределено Тогда
// Не нашли ни в справочнике, ни в классификаторе.
Страна = СсылкаНаОсновнуюСтрану;
КодСтраны = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОсновнуюСтрану, "Код");
Иначе
Страна = ДанныеСтраны.Ссылка;
КодСтраны = ДанныеСтраны.Код;
КонецЕсли;
СведенияОСтране = СведенияОСтране(Страна);
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(ДанныеАдреса.AddressType) Тогда
РазрешитьВводАдресаВСвободнойФорме = Истина;
КонецЕсли;
УстановитьЗначенияНациональныхРеквизитовКонтактнойИнформации(ДанныеАдреса);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначенияНациональныхРеквизитовКонтактнойИнформации(ДанныеАдреса)
// Индекс просто ставим
Если ДанныеАдреса.Свойство("ZIPCode") Тогда
Индекс = Формат(ДанныеАдреса.ZIPCode, "ЧГ=");
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеАдреса.HouseType) Тогда
ТипДома = ДанныеАдреса.HouseType;
Если ДанныеАдреса.Свойство("HouseNumber") Тогда
Дом = ДанныеАдреса.HouseNumber;
ИначеЕсли ДанныеАдреса.Свойство("House") Тогда
Дом = ДанныеАдреса.House;
КонецЕсли;
ИначеЕсли ЗначениеЗаполнено(ДанныеАдреса.stead) Тогда
ТипДома = РаботаСАдресамиКлиентСервер.НаименованиеЗемельногоУчастка();
Дом = ДанныеАдреса.stead;
КонецЕсли;
ЗаполняемПервоеЗдание = Истина;
Если ДанныеАдреса.Свойство("buildings") И ТипЗнч(ДанныеАдреса.buildings) = Тип("Массив") Тогда
Для каждого ОписаниеЗдания Из ДанныеАдреса.buildings Цикл
Если ЗаполняемПервоеЗдание Тогда
ТипСтроения = ОписаниеЗдания.Type;
Строение = ОписаниеЗдания.Number;
ЗаполняемПервоеЗдание = Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЗаполняемПервоеПомещение = Истина;
Если ДанныеАдреса.Свойство("Apartments") И ТипЗнч(ДанныеАдреса.Apartments) = Тип("Массив") Тогда
Для каждого ОписаниеСтроения Из ДанныеАдреса.Apartments Цикл
Если ЗаполняемПервоеПомещение Тогда
ТипПомещения = ОписаниеСтроения.Type;
Помещение = ОписаниеСтроения.Number;
ЗаполняемПервоеПомещение = Ложь;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоИностранныйАдресИлиЕАЭС(ДанныеАдреса.addressType) Тогда
Если МеждународныйФорматАдреса Тогда
НаселенныйПункт =
УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеАдресногоОбъекта(ДанныеАдреса, "area", "Type");
Иначе
РегионИностранногоАдреса =
УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеАдресногоОбъекта(ДанныеАдреса, "area", "Type");
РайонИностранногоАдреса =
УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеАдресногоОбъекта(ДанныеАдреса, "district", "Type", Истина);
ВнутригородскойРайонИностранногоАдреса =
УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеАдресногоОбъекта(ДанныеАдреса, "locality", "Type", Истина);
НаселенныйПункт =
УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеАдресногоОбъекта(ДанныеАдреса, "city", "Type", Истина);
КонецЕсли;
Иначе
Если ДанныеАдреса.Свойство("OKTMO") Тогда
ОКТМО = Формат(ДанныеАдреса.OKTMO, "ЧГ=");
КонецЕсли;
// Синтетический "Населенный пункт" получаем как представление.
НаселенныйПункт = Обработки.РасширенныйВводКонтактнойИнформации.ПредставлениеНаселенногоПункта(ДанныеАдреса);
КонецЕсли;
Улица = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеАдресногоОбъекта(ДанныеАдреса, "street", "Type", Истина);
ОтобразитьДополнительныеЗдания(НаселенныйПунктДетально);
КонецПроцедуры
&НаСервере
Функция ДобавитьПолеСтроенияИлиПомещения(Идентификатор, Тип, Значение)
Если Тип = "Помещение" Тогда
НоваяГруппа = Элементы.Добавить("ГруппаПомещение" + Идентификатор, Тип("ГруппаФормы"), Элементы.ГруппаПомещенияДополнительно);
ЗаполнитьЗначенияСвойств(НоваяГруппа, Элементы.ГруппаПомещенияОсновная,, "ПутьКДаннымЗаголовка");
НовыйТип = Элементы.Добавить("ТипПомещения" + Идентификатор, Тип("ПолеФормы"), НоваяГруппа);
ЗаполнитьЗначенияСвойств(НовыйТип, Элементы.ТипПомещения,, "ПутьКДанным, СписокВыбора, ВыделенныйТекст, СвязьПоТипу");
НовыйТип.СписокВыбора.ЗагрузитьЗначения(Элементы.ТипПомещения.СписокВыбора.ВыгрузитьЗначения());
НовыйТип.УстановитьДействие("ПриИзменении", "Подключаемый_ТипПомещенияПриИзменении");
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
НовыйТип.КнопкаВыбора = Истина;
НовыйТип.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.Авто;
КонецЕсли;
НовыйЭлемент = Элементы.Добавить("Помещение" + Идентификатор, Тип("ПолеФормы"), НоваяГруппа);
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элементы.Помещение,, "ПутьКДанным, СписокВыбора, ВыделенныйТекст, СвязьПоТипу");
НовыйЭлемент.СписокВыбора.ЗагрузитьЗначения(Элементы.Помещение.СписокВыбора.ВыгрузитьЗначения());
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПомещениеПриИзменении");
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "Подключаемый_ПомещениеНачалоВыбора");
НовыйЭлемент.УстановитьДействие("ОбработкаВыбора", "Подключаемый_ПомещениеОбработкаВыбора");
НовыйЭлемент.УстановитьДействие("АвтоПодбор", "Подключаемый_ПомещениеАвтоПодбор");
ЭтоНациональныйАдрес = РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType)
Или РаботаСАдресамиКлиентСервер.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.addressType);
НовыйЭлемент.КнопкаВыбора = ЭтоНациональныйАдрес;
Иначе
НоваяГруппа = Элементы.Добавить("ГруппаСтроение" + Идентификатор, Тип("ГруппаФормы"), Элементы.ГруппаСтроенияДополнительно);
ЗаполнитьЗначенияСвойств(НоваяГруппа, Элементы.ГруппаСтроенияОсновная,, "ПутьКДаннымЗаголовка");
НовыйТип = Элементы.Добавить("ТипСтроения" + Идентификатор, Тип("ПолеФормы"), НоваяГруппа);
ЗаполнитьЗначенияСвойств(НовыйТип, Элементы.ТипСтроения,, "ПутьКДанным, СписокВыбора, ВыделенныйТекст, СвязьПоТипу");
НовыйТип.СписокВыбора.ЗагрузитьЗначения(Элементы.ТипСтроения.СписокВыбора.ВыгрузитьЗначения());
НовыйТип.УстановитьДействие("ПриИзменении", "Подключаемый_ТипСтроенияПриИзменении");
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
НовыйТип.КнопкаВыбора = Истина;
НовыйТип.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.Авто;
КонецЕсли;
НовыйЭлемент = Элементы.Добавить("Строение" + Идентификатор, Тип("ПолеФормы"), НоваяГруппа);
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элементы.Строение,, "ПутьКДанным, СписокВыбора, ВыделенныйТекст, СвязьПоТипу");
НовыйЭлемент.СписокВыбора.ЗагрузитьЗначения(Элементы.Строение.СписокВыбора.ВыгрузитьЗначения());
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_СтроениеПриИзменении");
НовыйЭлемент.КнопкаВыбора = Ложь;
КонецЕсли;
Добавлять = Новый Массив;
Добавлять.Добавить(Новый РеквизитФормы(НовыйТип.Имя, Новый ОписаниеТипов("Строка")));
Добавлять.Добавить(Новый РеквизитФормы(НовыйЭлемент.Имя, Новый ОписаниеТипов("Строка")));
ИзменитьРеквизиты(Добавлять);
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("Значение", Значение));
Если НайденныеСтроки.Количество() > 0 Тогда
НайденныеСтроки[0].ИмяЭлемента = Идентификатор;
КонецЕсли;
Если СтрСравнить(Значение, НаименованиеПриДобавлениеПроизвольногоПомещения()) <> 0 Тогда
ЭтотОбъект[НовыйТип.Имя] = Значение;
Результат = НовыйЭлемент.Имя;
Иначе
НайденныеСтроки[0].ПредыдущиеЗначение = "";
Результат = НовыйТип.Имя;
КонецЕсли;
ЭтотОбъект[НовыйЭлемент.Имя] = "";
НовыйТип.ПутьКДанным = НовыйТип.Имя;
НовыйЭлемент.ПутьКДанным = НовыйЭлемент.Имя;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ОбновитьДополнительныеЗдания()
ОтобразитьДополнительныеЗдания();
ОбновитьМенюДобавленияСтроенийИПомещений();
КонецПроцедуры
&НаСервере
Функция ОтобразитьДополнительныеЗдания(НаселенныйПунктДетальноПереопределение = Неопределено)
Если НаселенныйПунктДетальноПереопределение <> Неопределено Тогда
НаселенныйПунктДетально = НаселенныйПунктДетальноПереопределение;
КонецЕсли;
Если НаселенныйПунктДетально = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Удалять = Новый Массив;
КоличествоЭлементов = Элементы.ГруппаСтроенияДополнительно.ПодчиненныеЭлементы.Количество();
Пока КоличествоЭлементов > 0 Цикл
КоличествоЭлементов = КоличествоЭлементов - 1;
ЭлементыФормы = Элементы.ГруппаСтроенияДополнительно.ПодчиненныеЭлементы.Получить(КоличествоЭлементов);
Идентификатор = Сред(ЭлементыФормы.Имя, СтрДлина("ГруппаСтроение") + 1);
Удалять.Добавить("ТипСтроения" + Идентификатор);
Удалять.Добавить("Строение" + Идентификатор);
Элементы.Удалить(Элементы["ГруппаСтроение" + Идентификатор]);
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("ИмяЭлемента", Идентификатор));
Если НайденныеСтроки.Количество() > 0 Тогда
НайденныеСтроки[0].ИмяЭлемента = "";
КонецЕсли;
КонецЦикла;
КоличествоЭлементов = Элементы.ГруппаПомещенияДополнительно.ПодчиненныеЭлементы.Количество();
Пока КоличествоЭлементов > 0 Цикл
КоличествоЭлементов = КоличествоЭлементов - 1;
ЭлементыФормы = Элементы.ГруппаПомещенияДополнительно.ПодчиненныеЭлементы.Получить(КоличествоЭлементов);
Идентификатор = Сред(ЭлементыФормы.Имя, СтрДлина("ГруппаПомещение") + 1);
Удалять.Добавить("ТипПомещения" + Идентификатор);
Удалять.Добавить("Помещение" + Идентификатор);
Элементы.Удалить(Элементы["ГруппаПомещение" + Идентификатор]);
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("ИмяЭлемента", Идентификатор));
Если НайденныеСтроки.Количество() > 0 Тогда
НайденныеСтроки[0].ИмяЭлемента = "";
КонецЕсли;
КонецЦикла;
ИзменитьРеквизиты(, Удалять);
Если ТипЗнч(НаселенныйПунктДетально.buildings) = Тип("Массив") Тогда
КоличествоЗданий = НаселенныйПунктДетально.buildings.Количество() - 1;
Результат = Неопределено;
Для НомерСтроки = 1 По КоличествоЗданий Цикл
Строка = НаселенныйПунктДетально.buildings[НомерСтроки];
Идентификатор = СтрЗаменить(Новый УникальныйИдентификатор(),"-", "");
НоваяГруппа = Элементы.Добавить("ГруппаСтроение" + Идентификатор, Тип("ГруппаФормы"), Элементы.ГруппаСтроенияДополнительно);
ЗаполнитьЗначенияСвойств(НоваяГруппа, Элементы.ГруппаСтроенияОсновная,, "ПутьКДаннымЗаголовка");
НовыйТип = Элементы.Добавить("ТипСтроения" + Идентификатор, Тип("ПолеФормы"), НоваяГруппа);
ЗаполнитьЗначенияСвойств(НовыйТип, Элементы.ТипСтроения, , "ПутьКДанным, СписокВыбора, ВыделенныйТекст, СвязьПоТипу");
НовыйТип.СписокВыбора.ЗагрузитьЗначения(Элементы.ТипСтроения.СписокВыбора.ВыгрузитьЗначения());
НовыйТип.УстановитьДействие("ПриИзменении", "Подключаемый_ТипСтроенияПриИзменении");
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
НовыйТип.КнопкаВыбора = Истина;
НовыйТип.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.Авто;
КонецЕсли;
НовыйЭлемент = Элементы.Добавить("Строение" + Идентификатор, Тип("ПолеФормы"), НоваяГруппа);
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элементы.Строение,, "ПутьКДанным, СписокВыбора, ВыделенныйТекст, СвязьПоТипу");
НовыйЭлемент.СписокВыбора.ЗагрузитьЗначения(Элементы.Строение.СписокВыбора.ВыгрузитьЗначения());
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_СтроениеПриИзменении");
НовыйЭлемент.КнопкаВыбора = Ложь;
Если НомерСтроки = КоличествоЗданий Тогда
Результат = НовыйЭлемент.Имя;
КонецЕсли;
Добавлять = Новый Массив;
Добавлять.Добавить(Новый РеквизитФормы(НовыйТип.Имя, Новый ОписаниеТипов("Строка")));
Добавлять.Добавить(Новый РеквизитФормы(НовыйЭлемент.Имя, Новый ОписаниеТипов("Строка")));
ИзменитьРеквизиты(Добавлять);
ЭтотОбъект[НовыйТип.Имя] = Строка.Type;
ЭтотОбъект[НовыйЭлемент.Имя] = Строка.Number;
НовыйТип.ПутьКДанным = НовыйТип.Имя;
НовыйЭлемент.ПутьКДанным = НовыйЭлемент.Имя;
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("Значение", Строка.Type));
Если НайденныеСтроки.Количество() > 0 Тогда
НайденныеСтроки[0].ИмяЭлемента = Идентификатор;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ТипЗнч(НаселенныйПунктДетально.Apartments) = Тип("Массив") Тогда
КоличествоПомещений = НаселенныйПунктДетально.Apartments.Количество() - 1;
Результат = Неопределено;
Для НомерСтроки = 1 По КоличествоПомещений Цикл
Строка = НаселенныйПунктДетально.Apartments[НомерСтроки];
Идентификатор = СтрЗаменить(Новый УникальныйИдентификатор(),"-", "");
НоваяГруппа = Элементы.Добавить("ГруппаПомещение" + Идентификатор, Тип("ГруппаФормы"), Элементы.ГруппаПомещенияДополнительно);
ЗаполнитьЗначенияСвойств(НоваяГруппа, Элементы.ГруппаПомещенияОсновная,, "ПутьКДаннымЗаголовка");
НовыйТип = Элементы.Добавить("ТипПомещения" + Идентификатор, Тип("ПолеФормы"), НоваяГруппа);
ЗаполнитьЗначенияСвойств(НовыйТип, Элементы.ТипПомещения, , "ПутьКДанным, СписокВыбора, ВыделенныйТекст, СвязьПоТипу");
НовыйТип.СписокВыбора.ЗагрузитьЗначения(Элементы.ТипПомещения.СписокВыбора.ВыгрузитьЗначения());
НовыйТип.УстановитьДействие("ПриИзменении", "Подключаемый_ТипПомещенияПриИзменении");
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
НовыйТип.КнопкаВыбора = Истина;
НовыйТип.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.Авто;
КонецЕсли;
НовыйЭлемент = Элементы.Добавить("Помещение" + Идентификатор, Тип("ПолеФормы"), НоваяГруппа);
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элементы.Помещение,, "ПутьКДанным, СписокВыбора, ВыделенныйТекст, СвязьПоТипу");
НовыйЭлемент.СписокВыбора.ЗагрузитьЗначения(Элементы.Помещение.СписокВыбора.ВыгрузитьЗначения());
НовыйЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПомещениеПриИзменении");
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "Подключаемый_ПомещениеНачалоВыбора");
НовыйЭлемент.УстановитьДействие("ОбработкаВыбора", "Подключаемый_ПомещениеОбработкаВыбора");
НовыйЭлемент.УстановитьДействие("АвтоПодбор", "Подключаемый_ПомещениеАвтоПодбор");
ЭтоНациональныйАдрес = РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType)
Или РаботаСАдресамиКлиентСервер.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.addressType);
НовыйЭлемент.КнопкаВыбора = ЭтоНациональныйАдрес;
Если НомерСтроки = КоличествоПомещений Тогда
Результат = НовыйЭлемент.Имя;
КонецЕсли;
Добавлять = Новый Массив;
Добавлять.Добавить(Новый РеквизитФормы(НовыйТип.Имя, Новый ОписаниеТипов("Строка")));
Добавлять.Добавить(Новый РеквизитФормы(НовыйЭлемент.Имя, Новый ОписаниеТипов("Строка")));
ИзменитьРеквизиты(Добавлять);
ЭтотОбъект[НовыйТип.Имя] = Строка.Type;
ЭтотОбъект[НовыйЭлемент.Имя] = Строка.Number;
НовыйТип.ПутьКДанным = НовыйТип.Имя;
НовыйЭлемент.ПутьКДанным = НовыйЭлемент.Имя;
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("Значение", Строка.Type));
Если НайденныеСтроки.Количество() > 0 Тогда
НайденныеСтроки[0].ИмяЭлемента = Идентификатор;
Иначе
НовоеПомещение = ДополнительныеСтроенияИПомещения.Добавить();
НовоеПомещение.Тип = "Помещение";
НовоеПомещение.Значение = НаименованиеПриДобавлениеПроизвольногоПомещения();
НовоеПомещение.Видимость = Ложь;
НовоеПомещение.Ключ = "";
НовоеПомещение.ПредыдущиеЗначение = Строка.Type;
НовоеПомещение.ИмяЭлемента = Идентификатор;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ОтобразитьИнформациюОДатахДействияАдреса(ДействуетС)
Если ВводНовогоАдреса Тогда
ТекстИсторическийАдрес = "";
АдресНаДату = ДействуетС;
Элементы.ГруппаИсторическийАдрес.Видимость = ЗначениеЗаполнено(ДействуетС);
Иначе
Отбор = Новый Структура("Вид", ОписаниеВидаКонтактнойИнформации(ЭтотОбъект).Ссылка);
НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0
ИЛИ (НайденныеСтроки.Количество() = 1 И ПустаяСтрока(НайденныеСтроки[0].Представление)) Тогда
АдресНаДату = Дата(1, 1, 1);
Элементы.ГруппаИсторическийАдрес.Видимость = Ложь;
Элементы.ИсторияИзменений.Видимость = Ложь;
Иначе
Результат = ОпределитьДатуДействия(ДействуетС, НайденныеСтроки);
АдресНаДату = Результат.ДействуетС;
АдресДействуетС = Результат.ДействуетС;
Если НЕ ЗначениеЗаполнено(Результат.ДействуетС)
И ПустаяСтрока(Результат.ТекущаяСтрока.Представление) Тогда
Элементы.ГруппаИсторическийАдрес.Видимость = Ложь;
ИначеЕсли ЗначениеЗаполнено(Результат.ДействуетПо) Тогда
ТекстИсторическийАдрес = " " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'действует по %1'"), Формат(Результат.ДействуетПо - 10, "ДЛФ=DD"));
Иначе
ТекстИсторическийАдрес = НСтр("ru = 'действует по настоящее время.'");
КонецЕсли;
ОтобразитьКоличествоЗаписейВИсторииИзменений();
КонецЕсли;
КонецЕсли;
Элементы.АдресНаДату.РасширеннаяПодсказка.Заголовок = ТекстИсторическийАдрес;
Элементы.АдресНаДату.ФорматРедактирования = ?(ЗначениеЗаполнено(АдресНаДату), "", "ДФ='""" + НачалоУчета() + """'");
КонецПроцедуры
&НаСервере
Процедура ОтобразитьКоличествоЗаписейВИсторииИзменений()
ВидКИ = ВидКонтактнойИнформации; // см. УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации
Отбор = Новый Структура("Вид", ВидКИ.Ссылка);
НайденныеСтроки = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Если Параметры.ИзФормыИстории Тогда
Элементы.ИсторияИзмененийГиперссылка.Видимость = Ложь;
ИначеЕсли НайденныеСтроки.Количество() > 1 Тогда
Элементы.ИсторияИзмененийГиперссылка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'История изменений (%1)'"), НайденныеСтроки.Количество());
Элементы.ИсторияИзмененийГиперссылка.Видимость = Истина;
ИначеЕсли НайденныеСтроки.Количество() = 1 И ПустаяСтрока(НайденныеСтроки[0].ЗначенияПолей) Тогда
Элементы.ИсторияИзмененийГиперссылка.Видимость = Ложь;
Иначе
Элементы.ИсторияИзмененийГиперссылка.Заголовок = НСтр("ru = 'История изменений'");
Элементы.ИсторияИзмененийГиперссылка.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ОпределитьДатуДействия(ДействуетС, История)
Результат = Новый Структура("ДействуетПо, ДействуетС, ТекущаяСтрока");
Если История.Количество() = 0 Тогда
Возврат Результат;
КонецЕсли;
ТекущаяСтрока = Неопределено;
ДействуетПо = Неопределено;
Минимум = -1;
МинимумСравнительный = Неопределено;
Для каждого СтрокаИстория Из История Цикл
Дельта = СтрокаИстория.ДействуетС - ДействуетС;
Если Дельта <= 0 И (МинимумСравнительный = Неопределено ИЛИ Дельта > МинимумСравнительный) Тогда
ТекущаяСтрока = СтрокаИстория;
МинимумСравнительный = Дельта;
КонецЕсли;
Если Минимум = -1 Тогда
Минимум = Дельта + 1;
ТекущаяСтрока = СтрокаИстория;
КонецЕсли;
Если Дельта > 0 И МодульЧисла(Дельта) < МодульЧисла(Минимум) Тогда
ДействуетПо = СтрокаИстория.ДействуетС;
Минимум = МодульЧисла(Дельта);
КонецЕсли;
КонецЦикла;
Результат.ДействуетПо = ДействуетПо;
Результат.ДействуетС = ТекущаяСтрока.ДействуетС;
Результат.ТекущаяСтрока = ТекущаяСтрока;
Возврат Результат;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция МодульЧисла(Число)
Возврат Макс(Число, -Число);
КонецФункции
// Параметры:
// Элемент - ПолеФормы
//
&НаКлиенте
Процедура Подключаемый_ТипСтроенияПриИзменении(Элемент)
Идентификатор = Сред(Элемент.Имя, СтрДлина("ТипСтроения") + 1);
НайденныеСтрокиСтарые = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("ИмяЭлемента", Идентификатор));
Если НайденныеСтрокиСтарые.Количество() > 0 Тогда
СтароеЗначение = НайденныеСтрокиСтарые[0].Значение;
КонецЕсли;
Значение = ЭтотОбъект[Элемент.Имя];
НайденныеСтрокиНовый = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("Значение", Значение));
Если НайденныеСтрокиНовый.Количество() > 0 Тогда
Если НайденныеСтрокиНовый[0].Видимость = Ложь Тогда
ЭтотОбъект[Элемент.Имя] = СтароеЗначение; // Такое уже значение есть на форме, откатываем на старое.
Возврат;
КонецЕсли;
НайденныеСтрокиСтарые[0].ИмяЭлемента = "";
НайденныеСтрокиНовый[0].ИмяЭлемента = Идентификатор;
КонецЕсли;
Для каждого Помещения Из НаселенныйПунктДетально.buildings Цикл
Если СтрСравнить(Помещения.Type, СтароеЗначение) = 0 Тогда
Помещения.Type = ЭтотОбъект[Элемент.Имя];
ОбновитьПредставлениеАдреса();
Прервать;
КонецЕсли;
КонецЦикла;
ОбновитьМенюДобавленияСтроенийИПомещений();
Модифицированность = Истина;
КонецПроцедуры
// Параметры:
// Элемент - ПолеФормы
//
&НаКлиенте
Процедура Подключаемый_СтроениеПриИзменении(Элемент)
Идентификатор = Сред(Элемент.Имя, СтрДлина("Строение") + 1);
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("ИмяЭлемента", Идентификатор));
Если НайденныеСтроки.Количество() > 0 Тогда
Значение = НайденныеСтроки[0].Значение;
Иначе
Возврат;
КонецЕсли;
ЭтоНовый = Истина;
Для ИндексПозиции = 0 По НаселенныйПунктДетально.buildings.Количество() - 1 Цикл
Помещения = НаселенныйПунктДетально.buildings[ИндексПозиции];
Если СтрСравнить(Помещения.Type, Значение) = 0 Тогда
Если ЗначениеЗаполнено(ЭтотОбъект[Элемент.Имя]) Тогда
Помещения.Number = ЭтотОбъект[Элемент.Имя];
Иначе
НаселенныйПунктДетально.buildings.Удалить(ИндексПозиции);
КонецЕсли;
ЭтоНовый = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоНовый Тогда
НаселенныйПунктДетально.buildings.Добавить(ЗначениеСтроенияИлиПомещения(Значение, ЭтотОбъект[Элемент.Имя]));
КонецЕсли;
ОбновитьПредставлениеАдреса();
Модифицированность = Истина;
КонецПроцедуры
// Параметры:
// Элемент - ПолеФормы
//
&НаКлиенте
Процедура Подключаемый_ТипПомещенияПриИзменении(Элемент)
Идентификатор = Сред(Элемент.Имя, СтрДлина("ТипПомещения") + 1);
НайденныеСтрокиСтарые = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("ИмяЭлемента", Идентификатор));
Если НайденныеСтрокиСтарые.Количество() > 0 Тогда
СтароеЗначение = НайденныеСтрокиСтарые[0].ПредыдущиеЗначение;
КонецЕсли;
Значение = ПерваяБукваЗаглавная(ЭтотОбъект[Элемент.Имя]);
Если ПустаяСтрока(Значение) Тогда
ЭтотОбъект[Элемент.Имя] = СтароеЗначение; // Такое значение есть на форме, откатываем на старое.
Возврат;
КонецЕсли;
НайденныеСтрокиНовый = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("Значение", Значение));
Если НайденныеСтрокиНовый.Количество() > 0 Тогда
Если НайденныеСтрокиНовый[0].Видимость = Ложь Тогда
ЭтотОбъект[Элемент.Имя] = СтароеЗначение; // Такое значение есть на форме, откатываем на старое.
Возврат;
КонецЕсли;
НайденныеСтрокиНовый[0].ИмяЭлемента = Идентификатор;
НайденныеСтрокиСтарые[0].ИмяЭлемента = "";
Если СтрСравнить(НайденныеСтрокиСтарые[0].Значение, НаименованиеПриДобавлениеПроизвольногоПомещения()) <> 0 Тогда
НайденныеСтрокиСтарые[0].ПредыдущиеЗначение = ЭтотОбъект[Элемент.Имя];
Иначе
НайденныеСтрокиСтарые[0].ПредыдущиеЗначение = НаименованиеПриДобавлениеПроизвольногоПомещения();
КонецЕсли;
Иначе
НовоеПомещение = ДополнительныеСтроенияИПомещения.Добавить();
НовоеПомещение.Тип = "Помещение";
НовоеПомещение.Значение = Значение;
НовоеПомещение.Видимость = Ложь;
НовоеПомещение.Ключ = "";
НовоеПомещение.ПредыдущиеЗначение = ЭтотОбъект[Элемент.Имя];
НовоеПомещение.ИмяЭлемента = Идентификатор;
НайденныеСтрокиСтарые[0].ИмяЭлемента = "";
КонецЕсли;
Для каждого СвойстваПомещения Из НаселенныйПунктДетально.Apartments Цикл
Если СтрСравнить(СвойстваПомещения.Type, СтароеЗначение) = 0 Тогда
СвойстваПомещения.Type = ЭтотОбъект[Элемент.Имя];
ОбновитьПредставлениеАдреса();
Прервать;
КонецЕсли;
КонецЦикла;
ОбновитьМенюДобавленияСтроенийИПомещений();
Модифицированность = Истина;
КонецПроцедуры
// Параметры:
// Элемент - ПолеФормы
//
&НаКлиенте
Процедура Подключаемый_ПомещениеПриИзменении(Элемент)
Идентификатор = Сред(Элемент.Имя, СтрДлина("Помещение") + 1);
НайденныеСтроки = ДополнительныеСтроенияИПомещения.НайтиСтроки(Новый Структура("ИмяЭлемента", Идентификатор));
Если НайденныеСтроки.Количество() > 0 Тогда
Если СтрСравнить(НайденныеСтроки[0].Значение, НаименованиеПриДобавлениеПроизвольногоПомещения()) <> 0 Тогда
Значение = НайденныеСтроки[0].Значение;
Иначе
Значение = НайденныеСтроки[0].ПредыдущиеЗначение;
КонецЕсли;
Иначе
Возврат;
КонецЕсли;
ЭтоНовый = Истина;
Для ИндексПозиции = 0 По НаселенныйПунктДетально.Apartments.Количество() - 1 Цикл
Помещения = НаселенныйПунктДетально.Apartments[ИндексПозиции];
Если СтрСравнить(Помещения.Type, Значение) = 0 Тогда
Если ЗначениеЗаполнено(ЭтотОбъект[Элемент.Имя]) Тогда
Помещения.Number = ЭтотОбъект[Элемент.Имя];
Иначе
НаселенныйПунктДетально.Apartments.Удалить(ИндексПозиции);
КонецЕсли;
ЭтоНовый = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоНовый Тогда
НаселенныйПунктДетально.Apartments.Добавить(ЗначениеСтроенияИлиПомещения(Значение, ЭтотОбъект[Элемент.Имя]));
КонецЕсли;
ОбновитьПредставлениеАдреса();
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПомещениеНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
ПоказатьСписокПомещений();
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПомещениеОбработкаВыбора(Элемент, ВыбранноеЗначение, ДополнительныеДанные, ВыборДобавлением, СтандартнаяОбработка)
Если ВыбранноеЗначение = Неопределено Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
ЗаполнитьПоляПомещения(ВыбранноеЗначение);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПомещениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
Если Не АвтоподборДоступен Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(Текст) Тогда
ИдентификаторДома = НаселенныйПунктДетально.houseId;
Если ЗначениеЗаполнено(ИдентификаторДома) Тогда
ДанныеВыбора = СписокАвтоподбораПомещений(ИдентификаторДома, Текст + "%");
Если ДанныеВыбора.Количество() > 0 Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьПомещениеИзАдреса(УдаляемыйТипПомещения)
Для ИндексПозиции = 0 По НаселенныйПунктДетально.Apartments.Количество() - 1 Цикл
СведенияОПомещении = НаселенныйПунктДетально.Apartments[ИндексПозиции];
Если СтрСравнить(СведенияОПомещении.Type, УдаляемыйТипПомещения) =0 Тогда
НаселенныйПунктДетально.Apartments.Удалить(ИндексПозиции);
Возврат;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьМенюДобавленияСтроенийИПомещений()
Для каждого СтроениеПомещение Из ДополнительныеСтроенияИПомещения Цикл
Если ЗначениеЗаполнено(СтроениеПомещение.Ключ) Тогда
Если ЗначениеЗаполнено(СтроениеПомещение.ИмяЭлемента)
Или СтрСравнить(СтроениеПомещение.Значение, ТипПомещения) = 0
Или СтрСравнить(СтроениеПомещение.Значение, ТипСтроения) = 0 Тогда
СтроениеПомещение.Видимость = Ложь;
Элементы["Добавить_"+ СтроениеПомещение.Ключ].Видимость = Ложь;
Иначе
СтроениеПомещение.Видимость = Истина;
Элементы["Добавить_"+ СтроениеПомещение.Ключ].Видимость = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СообщитьОбОшибкахЗаполнения(СписокОшибок, ПредупреждатьОбОтсутствии, ТребуетсяОбновление = Ложь)
ОчиститьСообщения();
КоличествоОшибок = СписокОшибок.Количество();
Если КоличествоОшибок = 0 И ПредупреждатьОбОтсутствии Тогда
Элементы.ГруппаОписаниеНедоступностиСервера.Видимость = Ложь;
// Нет ошибок
Если НЕ ВебСервисИспользуется И ТребуетсяОбновление Тогда
Если ЕстьПравоЗагружатьКлассификатор Тогда
СообщениеОПроверкеАдреса = НСтр("ru = 'Адрес введен корректно, но адресные сведения, загруженные в приложение, давно не обновлялись.
|Рекомендуется выполнить обновление и повторить проверку адреса заново.'");
ВопросОбОбновлениеАдресногоКлассификатора(СообщениеОПроверкеАдреса);
Иначе
СообщениеОПроверкеАдреса = НСтр("ru = 'Адрес введен корректно, но адресные сведения, загруженные в приложение,
|давно не обновлялись. Рекомендуется выполнить обновление и повторить проверку адреса заново.
|Для обновления адресного классификатора обратитесь к администратору.'");
ПоказатьПредупреждение(, СообщениеОПроверкеАдреса);
КонецЕсли;
Иначе
ПоказатьПредупреждение(, НСтр("ru = 'Адрес введен корректно'"));
КонецЕсли;
Элементы.ГруппаОписаниеНедоступностиСервера.ТекущаяСтраница = Элементы.СервисДоступен;
Элементы.СообщениеОбОшибке.Видимость = Ложь;
Возврат;
КонецЕсли;
Если КоличествоОшибок = 1 Тогда
МестоОшибки = СписокОшибок[0].ИмяПоля;
Если СписокОшибок[0].АдресПроверен = Ложь И НЕ ВебСервисИспользуется Тогда
ТекстВопроса = НСтр("ru = 'Адрес не может быть проверен.'") + Символы.ПС
+ СписокОшибок[0].ТекстОшибки + Символы.ПС + НСтр("ru = 'Загрузить классификатор для проверки адреса?'");
ПредложениеЗагрузкиКлассификатора(ТекстВопроса);
Возврат;
ИначеЕсли ПустаяСтрока(МестоОшибки) Или МестоОшибки = "/" Тогда
Элементы.ГруппаОписаниеНедоступностиСервера.ТекущаяСтраница = Элементы.СообщениеОбОшибке;
КонецЕсли;
КонецЕсли;
Элементы.ГруппаОписаниеНедоступностиСервера.ТекущаяСтраница = Элементы.СообщениеОбОшибке;
Элементы.ГруппаОписаниеНедоступностиСервера.Видимость = Истина;
Элементы.СообщениеОбОшибке.Видимость = Истина;
Для Каждого Элемент Из СписокОшибок Цикл
Если Элемент.ВариантАдреса.Количество() > 0 Тогда
ДополнительныеПараметры = Новый Структура("НовыйАдрес", Элемент.ВариантАдреса[0]);
Оповещение = Новый ОписаниеОповещения("ПослеВопросаПроЗаменуИсторическогоАдреса", ЭтотОбъект, ДополнительныеПараметры);
ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1
|Обновить адрес?'"), Элемент.ТекстОшибки);
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Возврат;
КонецЕсли;
КонецЦикла;
// Сообщаем список с привязкой к полям.
Для Каждого Элемент Из СписокОшибок Цикл
ОбщегоНазначенияКлиент.СообщитьПользователю(
Элемент.ТекстОшибки,,, Элемент.ИмяПоля);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросаПроЗаменуИсторическогоАдреса(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ЗаполнитьЗначенияСвойств(НаселенныйПунктДетально, ДополнительныеПараметры.НовыйАдрес);
УстановитьЗначениеРеквизитовПоКонтактнойИнформации(НаселенныйПунктДетально);
ОбновитьПредставлениеАдреса();
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросОбОбновление(Результат, ДополнительныеПараметры) Экспорт
Если Результат = "ОбновитьКлассификатор" Тогда
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
ОповещениеОЗакрытие = Новый ОписаниеОповещения("ПослеЗагрузкиАдресногоКлассификатора", ЭтотОбъект);
МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент");
МодульАдресныйКлассификаторКлиент.ПоказатьФормуЗагрузкиАдресногоКлассификатора(ОповещениеОЗакрытие);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьАдресКлиент()
РаботаСАдресамиКлиент.ОчиститьАдрес(НаселенныйПунктДетально);
ОтобразитьДополнительныеЗдания();
КонецПроцедуры
&НаСервереБезКонтекста
Функция НаселенныйПунктУстановитьПоляАдреса(НаселенныйПунктДетально, Знач СведенияОбАдресе, Знач ВключатьУлица)
Если СведенияОбАдресе.Свойство("Адрес") И ТипЗнч(СведенияОбАдресе.Адрес) = Тип("Строка") Тогда
ПолученныйАдрес = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(СведенияОбАдресе.Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес);
Иначе
ПолученныйАдрес = ОпределитьАдресПоИдентификатору(СведенияОбАдресе);
КонецЕсли;
Если Не ВключатьУлица Тогда
ВключатьУлица = ЗначениеЗаполнено(ПолученныйАдрес.street);
КонецЕсли;
ИменаУровнейНаселенногоПункта = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса("Все", ВключатьУлица);
Для каждого ИмяУровня Из ИменаУровнейНаселенногоПункта Цикл
Если ПолученныйАдрес.Свойство(ИмяУровня) Тогда
НаселенныйПунктДетально[ИмяУровня] = ПолученныйАдрес[ИмяУровня];
НаселенныйПунктДетально[ИмяУровня + "Type"] = ПолученныйАдрес[ИмяУровня + "Type"];
НаселенныйПунктДетально[ИмяУровня + "Id"] = ПолученныйАдрес[ИмяУровня + "Id"];
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ПолученныйАдрес.houseNumber) Тогда
ЗаполнитьЗначенияСвойств(НаселенныйПунктДетально, ПолученныйАдрес,
"houseNumber,houseType,houseId");
Иначе
НаселенныйПунктДетально.houseId = "";
КонецЕсли;
Если ТипЗнч(ПолученныйАдрес.buildings) = Тип("Массив") И ПолученныйАдрес.buildings.Количество() > 0 Тогда
НаселенныйПунктДетально.buildings = ПолученныйАдрес.buildings;
КонецЕсли;
Если ТипЗнч(ПолученныйАдрес.apartments) = Тип("Массив") И ПолученныйАдрес.apartments.Количество() > 0 Тогда
НаселенныйПунктДетально.apartments = ПолученныйАдрес.apartments;
КонецЕсли;
ЗаполнитьЗначенияСвойств(НаселенныйПунктДетально, ПолученныйАдрес,
"areaValue,addressType,admLevels,munLevels,version,stead,steadId");
Если ПустаяСтрока(ПолученныйАдрес.street) Тогда
НаселенныйПунктДетально.streetId = "";
ИначеЕсли ЗначениеЗаполнено(ПолученныйАдрес.streetId) Тогда
НаселенныйПунктДетально.id = ПолученныйАдрес.streetId;
КонецЕсли;
РаботаСАдресами.ДобавитьУровеньУлицыДляАдреса(НаселенныйПунктДетально);
Если ЗначениеЗаполнено(ПолученныйАдрес.ZipCode) Тогда
НаселенныйПунктДетально.ZipCode = ПолученныйАдрес.ZipCode;
КонецЕсли;
Если ЗначениеЗаполнено(ПолученныйАдрес.OKTMO) Тогда
НаселенныйПунктДетально.OKTMO = ПолученныйАдрес.OKTMO;
КонецЕсли;
Если (ЗначениеЗаполнено(НаселенныйПунктДетально.Street)
И Не ЗначениеЗаполнено(НаселенныйПунктДетально.streetId))
Или ЗначениеЗаполнено(НаселенныйПунктДетально.HouseNumber)
Или НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
УстановитьИдентификаторыАдреса(НаселенныйПунктДетально);
КонецЕсли;
ИдентификаторНаселенногоПункта = ИдентификаторАдреса(НаселенныйПунктДетально, Ложь, Ложь);
СодержитУлицы = РаботаСАдресами.АдресСодержитУлицы(ИдентификаторНаселенногоПункта,
НаселенныйПунктДетально.AddressType);
Возврат СодержитУлицы;
КонецФункции
&НаСервереБезКонтекста
Функция КодСтраны(Страна)
СведенияОбАдресе = УправлениеКонтактнойИнформацией.ДанныеСтраныМира(Неопределено, Строка(Страна));
Если СведенияОбАдресе <> Неопределено Тогда
Возврат СведенияОбАдресе.Код;
КонецЕсли;
Возврат 0;
КонецФункции
&НаСервере
Процедура УстановитьКлючИспользованияФормы()
КлючСохраненияПоложенияОкна = Строка(Страна);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Процедура ПроверитьДоступностьКлассификатора()
Если Не ЕстьЗагруженныйКлассификатор Тогда
Возврат;
КонецЕсли;
Задание = ПроверитьДоступностьКлассификатораВФоне(УникальныйИдентификатор);
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
НастройкиОжидания.ВыводитьОкноОжидания = Ложь;
Обработчик = Новый ОписаниеОповещения("ПослеПроверкиДоступностиКлассификатораВФоне", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
КонецПроцедуры
// Параметры:
// Результат - см. ДлительныеОперацииКлиент.НовыйРезультатДлительнойОперации
// ДополнительныеПараметры - Неопределено
//
&НаКлиенте
Процедура ПослеПроверкиДоступностиКлассификатораВФоне(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Выполнено" Тогда
ДоступностьКлассификатора = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
Если ДоступностьКлассификатора <> Неопределено Тогда
Элементы.ГруппаОписаниеНедоступностиСервера.ТекущаяСтраница = ?(ДоступностьКлассификатора.Отказ,
Элементы.СервисНедоступен, Элементы.СервисДоступен);
Если ДоступностьКлассификатора.Отказ Тогда
ТекстСообщенияСервиса = НСтр("ru = 'Автоподбор и проверка адреса недоступны:'") + Символы.ПС
+ ДоступностьКлассификатора.КраткоеПредставлениеОшибки;
КонецЕсли;
КонецЕсли;
ИначеЕсли Результат.Статус = "Ошибка" Тогда
СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке);
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура АвторизацияНаСайтеПоддержкиПользователейЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
ОбновитьПовторноИспользуемыеЗначения();
ПроверитьДоступностьКлассификатора();
КонецЕсли;
КонецПроцедуры
// Параметры:
// ВыбранноеЗначение - см. АдресныйКлассификаторСлужебный.ОписаниеДомаИЗемельногоУчастка
//
&НаКлиенте
Процедура ЗаполнитьПоляДомовСтроенийЗемельныхУчастков(Знач ВыбранноеЗначение)
Модифицированность = Истина;
НаселенныйПунктДетально.ZIPcode = ВыбранноеЗначение.Индекс;
НаселенныйПунктДетально.OKTMO = ВыбранноеЗначение.ОКТМО;
НаселенныйПунктДетально.okato = ВыбранноеЗначение.ОКАТО;
НаселенныйПунктДетально.ifnsFLCode = ВыбранноеЗначение.КодИФНСФЛ;
НаселенныйПунктДетально.ifnsULCode = ВыбранноеЗначение.КодИФНСЮЛ;
НаселенныйПунктДетально.ifnsFLAreaCode = ВыбранноеЗначение.КодУчасткаИФНСФЛ;
НаселенныйПунктДетально.ifnsULAreaCode = ВыбранноеЗначение.КодУчасткаИФНСЮЛ;
НаселенныйПунктДетально.codeKLADR = ВыбранноеЗначение.КодКЛАДР;
Если СтрСравнить(ТипДома, РаботаСАдресамиКлиентСервер.НаименованиеЗемельногоУчастка()) <> 0 Тогда
ЗаполнитьПоляДомовИСтроений(ВыбранноеЗначение);
Иначе
ЗаполнитьПоляЗемельногоУчастка(ВыбранноеЗначение);
КонецЕсли;
УстановитьМуниципальныеЧастиАдресаИИдентификаторы(НаселенныйПунктДетально, ВыбранноеЗначение);
ОбработкаИзмененияАдреса();
КонецПроцедуры
// Параметры:
// ВыбранноеЗначение - см. АдресныйКлассификаторСлужебный.ОписаниеПомещения
//
&НаКлиенте
Процедура ЗаполнитьПоляПомещения(Знач ВыбранноеЗначение)
Модифицированность = Истина;
НаселенныйПунктДетально.Apartments.Очистить();
ТипПомещения = ВыбранноеЗначение.ТипПомещения;
Помещение = ВыбранноеЗначение.НомерПомещения;
НаселенныйПунктДетально.ApartmentId = ВыбранноеЗначение.ИдентификаторПомещения;
ИнформацияОПомещении = ЗначениеСтроенияИлиПомещения(ТипПомещения, Помещение);
НаселенныйПунктДетально.Apartments.Добавить(ИнформацияОПомещении);
ОбновитьМенюДобавленияСтроенийИПомещений();
ОбработкаИзмененияАдреса(Истина);
КонецПроцедуры
// Параметры:
// ВыбранноеЗначение - см. АдресныйКлассификаторСлужебный.ОписаниеДомаИЗемельногоУчастка
//
&НаКлиенте
Процедура ЗаполнитьПоляДомовИСтроений(Знач ВыбранноеЗначение)
НеобходимоПерерисоватьПоляДомов = НаселенныйПунктДетально.buildings.Количество() > 1;
Если ЗначениеЗаполнено(ВыбранноеЗначение.НомерДома) Тогда
НаселенныйПунктДетально.HouseNumber = ВыбранноеЗначение.НомерДома;
Если ЗначениеЗаполнено(ВыбранноеЗначение.НаименованиеДома) Тогда
НаселенныйПунктДетально.HouseType = ПерваяБукваЗаглавная(ВыбранноеЗначение.НаименованиеДома);
КонецЕсли;
КонецЕсли;
НаселенныйПунктДетально.buildings.Очистить();
Если ЗначениеЗаполнено(ВыбранноеЗначение.ДополнительныйНомерДома1) Тогда
СведенияОКорпусе = УправлениеКонтактнойИнформациейКлиентСервер.ЗначениеСтроенияИлиПомещения(
ПерваяБукваЗаглавная(ВыбранноеЗначение.НаименованиеДополнительногоДома1), ВыбранноеЗначение.ДополнительныйНомерДома1);
НаселенныйПунктДетально.buildings.Добавить(СведенияОКорпусе);
КонецЕсли;
Если ЗначениеЗаполнено(ВыбранноеЗначение.ДополнительныйНомерДома2) Тогда
СведенияОКорпусе = УправлениеКонтактнойИнформациейКлиентСервер.ЗначениеСтроенияИлиПомещения(
ПерваяБукваЗаглавная(ВыбранноеЗначение.НаименованиеДополнительногоДома2), ВыбранноеЗначение.ДополнительныйНомерДома2);
НаселенныйПунктДетально.buildings.Добавить(СведенияОКорпусе);
КонецЕсли;
НаселенныйПунктДетально.houseId = ВыбранноеЗначение.ИдентификаторДома;
ЗаполнитьУровниДомовИЗемельныхУчастков();
// отрисовка
Индекс = НаселенныйПунктДетально.ZipCode;
ОКТМО = НаселенныйПунктДетально.OKTMO;
Дом = НаселенныйПунктДетально.HouseNumber;
Если ЗначениеЗаполнено(НаселенныйПунктДетально.HouseType) Тогда
ТипДома = НаселенныйПунктДетально.HouseType;
КонецЕсли;
Если НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
Строение = НаселенныйПунктДетально.buildings[0].Number;
ТипСтроения = НаселенныйПунктДетально.buildings[0].Type;
Если НаселенныйПунктДетально.buildings.Количество() > 1 Тогда
НеобходимоПерерисоватьПоляДомов = Истина;
КонецЕсли;
Иначе
Строение = "";
КонецЕсли;
Если НеобходимоПерерисоватьПоляДомов Тогда
ПодключитьОбработчикОжидания("ОтобразитьДополнительныеЗданияКлиент", 0.1, Истина);
Иначе
ОбновитьПредставлениеАдреса();
КонецЕсли;
КонецПроцедуры
// Параметры:
// ВыбранноеЗначение - см. АдресныйКлассификаторСлужебный.ОписаниеДомаИЗемельногоУчастка
//
&НаКлиенте
Процедура ЗаполнитьПоляЗемельногоУчастка(Знач ВыбранноеЗначение)
НаселенныйПунктДетально.stead = ВыбранноеЗначение.НомерДома;
НаселенныйПунктДетально.steadId = ВыбранноеЗначение.ИдентификаторДома;
Индекс = НаселенныйПунктДетально.ZipCode;
ОКТМО = НаселенныйПунктДетально.OKTMO;
Дом = НаселенныйПунктДетально.stead;
НаселенныйПунктДетально.buildings.Очистить();
Строение = "";
ПодключитьОбработчикОжидания("ОтобразитьДополнительныеЗданияКлиент", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Функция ПерваяБукваЗаглавная(Строка)
Возврат ВРег(Лев(Строка, 1)) + Сред(НРег(Строка), 2); // Использовать ТРег нельзя.
КонецФункции
&НаКлиенте
Процедура ОтобразитьДополнительныеЗданияКлиент()
ИмяТекущего = ОтобразитьДополнительныеЗдания();
ОбновитьМенюДобавленияСтроенийИПомещений();
Если ИмяТекущего <> Неопределено Тогда
ТекущийЭлемент = Элементы[ИмяТекущего];
КонецЕсли;
ОбновитьПредставлениеАдреса();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПредопределенныеВариантыАдреса()
Если ЗначениеЗаполнено(Параметры.Индекс) Тогда
Индекс = Параметры.Индекс;
НаселенныйПунктДетально.ZipCode = Индекс;
КонецЕсли;
Если ЗначениеЗаполнено(Параметры.Страна) И ПустаяСтрока(НаселенныйПунктДетально.Country) Тогда
Если ТипЗнч(Параметры.Страна) = Тип("СправочникСсылка.СтраныМира") Тогда
Если ЗначениеЗаполнено(Параметры.Страна) Тогда
Страна = Параметры.Страна; // СправочникСсылка.СтраныМира
НаселенныйПунктДетально.Country = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Страна, "Наименование");
Иначе
Страна = РаботаСАдресамиКлиентСервер.ОсновнаяСтрана();
НаселенныйПунктДетально.Country = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Страна, "Наименование");
КонецЕсли;
Иначе
Страна = УправлениеКонтактнойИнформацией.СтранаМираПоКодуИлиНаименованию(Параметры.Страна);
Если Страна <> Справочники.СтраныМира.ПустаяСсылка() Тогда
НаселенныйПунктДетально.Country = Параметры.Страна;
Иначе
Страна = РаботаСАдресамиКлиентСервер.ОсновнаяСтрана();
НаселенныйПунктДетально.Country = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Страна, "Наименование");
КонецЕсли;
КонецЕсли;
ПереопределитьТипаАдресаПоСтране(Страна, НаселенныйПунктДетально, СведенияОСтране(Страна), МеждународныйФорматАдреса);
КонецЕсли;
// Возможные варианты дома, строения, квартиры.
ВариантыДанныхДом = РаботаСАдресамиПовтИсп.ВариантыДанныхДом();
УстановитьСписокВыбораЭлемента(Элементы.ТипДома, Элементы.Дом, ВариантыДанныхДом);
ВариантыДанныхСтроение = РаботаСАдресамиПовтИсп.ВариантыДанныхСтроение();
УстановитьСписокВыбораЭлемента(Элементы.ТипСтроения, Элементы.Строение, ВариантыДанныхСтроение);
ВариантыДанныхПомещение = РаботаСАдресамиПовтИсп.ВариантыДанныхПомещение();
УстановитьСписокВыбораЭлемента(Элементы.ТипПомещения, Элементы.Помещение, ВариантыДанныхПомещение);
Элементы.ТипПомещения.СписокВыбора.НайтиПоЗначению("").Значение = НаименованиеПриДобавлениеПроизвольногоПомещения();
// Возможно пустые значения, чтобы не смущали.
Если ПустаяСтрока(Дом) И ПустаяСтрока(ТипДома) Тогда
ТипДома = ПервыйИлиПустой(Элементы.ТипДома);
КонецЕсли;
Если ПустаяСтрока(Строение) И ПустаяСтрока(ТипСтроения) Тогда
ТипСтроения = ПервыйИлиПустой(Элементы.ТипСтроения);
КонецЕсли;
Если ЗначениеЗаполнено(Параметры.ТипПомещения)
И ВариантыДанныхПомещение.ВариантыТипа.Найти(Параметры.ТипПомещения) <> Неопределено Тогда
ТипПомещения = Параметры.ТипПомещения;
КонецЕсли;
Если ПустаяСтрока(Помещение) И ПустаяСтрока(ТипПомещения) Тогда
ТипПомещения = ПервыйИлиПустой(Элементы.ТипПомещения);
КонецЕсли;
Для каждого ВариантДанных Из ВариантыДанныхСтроение.ВариантыТипа Цикл
ДобавитьОписаниеСтроенияИлиПомещения(ВариантДанных, "Строение");
КонецЦикла;
Для каждого ВариантДанных Из ВариантыДанныхПомещение.ВариантыТипа Цикл
Если ПустаяСтрока(ВариантДанных) Тогда
ВариантДанных = НаименованиеПриДобавлениеПроизвольногоПомещения();
КонецЕсли;
ДобавитьОписаниеСтроенияИлиПомещения(ВариантДанных, "Помещение", СтрЗаменить(ВариантДанных, "/", ""));
КонецЦикла;
КонецПроцедуры
// Возвращает первый элемент из списка.
//
// Параметры:
// СписокДанных - СписокЗначений
// - Массив
// - ПолеФормы.
//
// Возвращаемое значение:
// Произвольный - первый элемент.
// Неопределено - нет первого элемента.
//
&НаКлиентеНаСервереБезКонтекста
Функция ПервыйИлиПустой(Знач СписокДанных)
ТипСписка = ТипЗнч(СписокДанных);
Если ТипСписка = Тип("СписокЗначений") И СписокДанных.Количество() > 0 Тогда
Возврат СписокДанных[0].Значение;
ИначеЕсли ТипСписка = Тип("Массив") И СписокДанных.Количество() > 0 Тогда
Возврат СписокДанных[0];
ИначеЕсли ТипСписка = Тип("ПолеФормы") Тогда
Возврат ПервыйИлиПустой(СписокДанных.СписокВыбора);
КонецЕсли;
Возврат Неопределено;
КонецФункции
&НаСервереБезКонтекста
Функция СведенияОРегионе(НаименованиеСубъектаРФ, ТипОбъекта)
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
СведенияОРегионе = МодульАдресныйКлассификаторСлужебный.СведенияОРегионе(НаименованиеСубъектаРФ, ТипОбъекта);
Возврат СведенияОРегионе;
КонецФункции
&НаСервереБезКонтекста
Функция ПроверитьДоступностьКлассификатораВФоне(Знач УникальныйИдентификатор)
НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Проверка доступности сервиса адресного классификатора'");
НастройкиЗапуска.УточнениеОшибки = НСтр("ru = 'Автоподбор и проверка адреса недоступны:'");
Возврат ДлительныеОперации.ВыполнитьВФоне(
"Обработки.РасширенныйВводКонтактнойИнформации.ПроверитьДоступностьКлассификатора",
Новый Структура,
НастройкиЗапуска);
КонецФункции
&НаСервереБезКонтекста
Функция ОпределитьАдресПоИдентификатору(СведенияОбАдреса)
Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокРеквизитовНаселенныйПункт(СведенияОбАдреса);
КонецФункции
&НаСервереБезКонтекста
Функция КонтактнаяИнформацияПоПредставлению(ПредставлениеАдреса, Комментарий = "", РазбиватьНаПоля = Ложь)
Адрес = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияПоПредставлению(ПредставлениеАдреса, Перечисления.ТипыКонтактнойИнформации.Адрес, РазбиватьНаПоля);
Адрес.comment = Комментарий;
Возврат Адрес;
КонецФункции
&НаКлиенте
Процедура ПоказатьАдресВСвободнойФорме()
Если Не СведенияОСтране.УчастникЕАЭС Или МеждународныйФорматАдреса Тогда
ОчиститьАдресКлиент();
КонецЕсли;
УдалитьСтрануИзПредставления();
НаселенныйПунктДетально.value = ПредставлениеАдреса;
НаселенныйПунктДетально.addressType = УправлениеКонтактнойИнформациейКлиентСервер.АдресВСвободнойФорме();
НаселенныйПунктДетально.comment = Комментарий;
НаселенныйПунктДетально.country = НаименованиеСтраны(Страна,
ОписаниеВидаКонтактнойИнформации(ЭтотОбъект).МеждународныйФорматАдреса);
Если Элементы.Страна.Доступность Тогда
Элементы.Страна.Видимость = Не ВидКонтактнойИнформации.ТолькоНациональныйАдрес;
КонецЕсли;
ПереключитьОтображениеАдресВСвободнойФорме();
Элементы.АдресВСвободнойФорме.Пометка = Истина;
Элементы.АдминистративноТерриториальноеДеление.Пометка = Ложь;
Элементы.МуниципальноеДеление.Пометка = Ложь;
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.АдресВСвободнойФорме();
ВидимостьПолейИностраногоАдреса(Ложь);
ПоказатьПодсказкуПоТипАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьОтображениеАдресВСвободнойФорме()
ЭтоАдресВСвободнойФорме = УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType);
Элементы.ПредставлениеАдреса.ПодсказкаВвода = ?(ЭтоАдресВСвободнойФорме, НСтр("ru = 'Введите или вставьте адрес'"), "");
Элементы.ПредставлениеАдреса.ТолькоПросмотр = Не ЭтоАдресВСвободнойФорме;
Элементы.Улица.КнопкаВыбора = Не ЭтоАдресВСвободнойФорме;
Элементы.Дом.КнопкаВыбора = Не ЭтоАдресВСвободнойФорме;
Элементы.Строение.КнопкаВыбора = Не ЭтоАдресВСвободнойФорме;
Элементы.Помещение.КнопкаВыбора = Не ЭтоАдресВСвободнойФорме;
Элементы.ТипДома.РедактированиеТекста = ЭтоАдресВСвободнойФорме;
Элементы.ТипСтроения.РедактированиеТекста = ЭтоАдресВСвободнойФорме;
Элементы.ТипДома.РежимВыбораИзСписка = Не ЭтоАдресВСвободнойФорме;
Элементы.ТипСтроения.РежимВыбораИзСписка = Не ЭтоАдресВСвободнойФорме;
Элементы.ГруппаОписаниеНедоступностиСервера.ТекущаяСтраница = Элементы.СервисДоступен;
Если Не ЭтоАдресВСвободнойФорме Тогда
Если Элементы.ТипДома.СписокВыбора.НайтиПоЗначению(ТипДома) = Неопределено Тогда
ТипДома = ПервыйИлиПустой(Элементы.ТипДома.СписокВыбора);
КонецЕсли;
Если Элементы.ТипСтроения.СписокВыбора.НайтиПоЗначению(ТипСтроения) = Неопределено Тогда
ТипСтроения = ПервыйИлиПустой(Элементы.ТипСтроения.СписокВыбора);
КонецЕсли;
КонецЕсли;
Если ЭтоАдресВСвободнойФорме Тогда
ВебКлассификаторДоступен = Ложь;
ИспользуетсяАдресныйКлассификатор = Ложь;
Иначе
СведенияОАдресномКлассификаторе = СведенияОАдресномКлассификаторе();
ЕстьЗагруженныйКлассификатор = СведенияОАдресномКлассификаторе.Получить("ИспользоватьЗагруженные");
ВебКлассификаторДоступен = СведенияОАдресномКлассификаторе.Получить("КлассификаторДоступен");
ИспользуетсяАдресныйКлассификатор = СведенияОАдресномКлассификаторе.Получить("ИспользуетсяАдресныйКлассификатор");
ВебСервисИспользуется = ВебКлассификаторДоступен;
КонецЕсли;
АвтоподборДоступен = ИспользуетсяАдресныйКлассификатор И (ВебКлассификаторДоступен Или ЕстьЗагруженныйКлассификатор);
ЭтоНациональныйАдрес = РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType)
Или РаботаСАдресамиКлиентСервер.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.addressType);
Элементы.ПроверитьЗаполнениеАдреса.Доступность = ЭтоНациональныйАдрес И АвтоподборДоступен;
Если Не ЭтоНациональныйАдрес() Тогда
ЭтоАдресВСвободнойФорме = УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType);
Элементы.Улица.Видимость = Не ЭтоАдресВСвободнойФорме;
Элементы.НаселенныйПункт.Видимость = Не ЭтоАдресВСвободнойФорме;
Элементы.Индекс.Видимость = Не ЭтоАдресВСвободнойФорме;
Элементы.ГруппаСтроенияИИнформация.Видимость = Не ЭтоАдресВСвободнойФорме;
Элементы.Улица.КнопкаВыбора = ЭтоНациональныйАдрес;
Иначе
Элементы.Улица.Видимость = Истина;
Элементы.НаселенныйПункт.Видимость = Истина;
Элементы.Индекс.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СведенияОАдресномКлассификаторе()
Возврат УправлениеКонтактнойИнформациейСлужебныйПовтИсп.СведенияОДоступностиАдресногоКлассификатора();
КонецФункции
&НаСервереБезКонтекста
Функция СписокАвтоподбораНаселенногоПункта(Текст, ТипАдреса)
ДополнительныеПараметры = УправлениеКонтактнойИнформациейСлужебный.ПараметрыАвтоподбораАдреса();
ДополнительныеПараметры.Уровни = "1,2,3,4,5,6,7";
ДополнительныеПараметры.ТипАдреса = ТипАдреса;
ДополнительныеПараметры.ПрямойПорядок = Ложь;
Результат = Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораНаселенногоПункта(Текст, ДополнительныеПараметры);
УправлениеКонтактнойИнформациейСлужебный.ФорматированиеРезультатовАвтоподбора(Результат.Данные, Текст, ПустаяСтрока(ТипАдреса));
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Функция СписокАвтоподбораУлицы(Текст, ПараметрыАвтоподбора)
Результат = Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораУлицы(Текст, ПараметрыАвтоподбора);
УправлениеКонтактнойИнформациейСлужебный.ФорматированиеРезультатовАвтоподбора(Результат.Данные, Текст, Ложь);
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Функция СписокАвтоподбораВариантовДомов(Идентификатор, Текст)
Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораНомераДомов(Идентификатор, Текст);
КонецФункции
&НаСервереБезКонтекста
Функция СписокАвтоподбораПомещений(Знач Идентификатор, Знач Текст)
Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораПомещений(Идентификатор, Текст);
КонецФункции
&НаСервереБезКонтекста
Функция СписокАвтоподбораЗемельныхУчастков(Идентификатор, Текст)
Возврат Обработки.РасширенныйВводКонтактнойИнформации.СписокАвтоподбораЗемельныхУчастков(Идентификатор, Текст);
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервереХранитьИсториюИзменений()
Если ВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда
Если ЗначениеЗаполнено(Параметры.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов) Тогда
Для каждого СтрокаКИ Из Параметры.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл
НоваяСтрока = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКИ);
КонецЦикла;
Иначе
Элементы.ИсторияИзменений.Видимость = Ложь;
КонецЕсли;
ВводНовогоАдреса = Параметры.ВводНовогоАдреса;
Элементы.ИсторияИзмененийГиперссылка.Видимость = НЕ Параметры.ИзФормыИстории;
Если ВводНовогоАдреса Тогда
ДействуетС = Параметры.ДействуетС;
Иначе
ДействуетС = ?(ЗначениеЗаполнено(Параметры.ДействуетС), Параметры.ДействуетС, ТекущаяДатаСеанса());
КонецЕсли;
ОтобразитьИнформациюОДатахДействияАдреса(ДействуетС);
Иначе
Элементы.ИсторияИзменений.Видимость = Ложь;
Элементы.ГруппаИсторическийАдрес.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьТипАдресаИзПараметра(ТипАдресаИзПараметра)
Если СтрСравнить(ТипАдресаИзПараметра, "АдминистративноТерриториальный") = 0 Или СтрСравнить(ТипАдресаИзПараметра, РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес()) = 0 Тогда
НаселенныйПунктДетально.AddressType = РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес();
ТипАдреса = РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес();
ИначеЕсли СтрСравнить(ТипАдресаИзПараметра, "ВСвободнойФорме") = 0 Тогда
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.АдресВСвободнойФорме();
ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.АдресВСвободнойФорме();
ИначеЕсли СтрСравнить(ТипАдресаИзПараметра, "ЕАЭС") = 0 Тогда
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.АдресЕАЭС();
ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.АдресЕАЭС();
Иначе
НаселенныйПунктДетально.AddressType = РаботаСАдресамиКлиентСервер.МуниципальныйАдрес();
ТипАдреса = РаботаСАдресамиКлиентСервер.МуниципальныйАдрес();
КонецЕсли;
Элементы.ФормаВсеДействияИзмененияАдреса.Видимость = Ложь;
Элементы.ДекорацияМуниципальный.ОтображениеПодсказки = ОтображениеПодсказки.Нет;
Элементы.ДекорацияАдминистративноТерриториальный.ОтображениеПодсказки = ОтображениеПодсказки.Нет;
КонецПроцедуры
&НаКлиенте
Функция ЭтоИностранныйАдрес(ТипАдреса)
Возврат СтрСравнить(УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес(), ТипАдреса) = 0;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ЭтоЗемельныйУчасток(ТипДома)
Возврат СтрСравнить(РаботаСАдресамиКлиентСервер.НаименованиеЗемельногоУчастка(), ТипДома) = 0;
КонецФункции
// Предлагает загрузить адресный классификатор.
//
// Параметры:
// Текст - Строка - дополнительный текст предложения.
// Регион - Число
// - Строка - код или название региона для загрузки.
//
&НаКлиенте
Процедура ПредложениеЗагрузкиКлассификатора(Знач Текст = "", Знач ДанныеОбАдресе = Неопределено)
Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
Возврат;
КонецЕсли;
НеЗагружатьАдресныйКлассификатор = ПараметрыПриложения.Получить("АдресныйКлассификатор.НеЗагружатьКлассификатор");
Если ДанныеОбАдресе <> Неопределено
И (НеЗагружатьАдресныйКлассификатор = Неопределено
ИЛИ НеЗагружатьАдресныйКлассификатор = Ложь) Тогда
Регион = ДанныеОбАдресе.Представление;
ТипПараметраРегиона = ТипЗнч(Регион);
ПараметрыФормы = Новый Структура;
ПараметрыЗагрузки = Новый Структура;
ПараметрыЗагрузки.Вставить("ДанныеОбАдресе", ДанныеОбАдресе);
ПараметрыФормы.Вставить("ТекстПредупреждения", Текст);
Если ТипПараметраРегиона = Тип("Число") Тогда
ПараметрыЗагрузки.Вставить("КодРегионаДляЗагрузки", Регион);
ИначеЕсли ТипПараметраРегиона = Тип("Строка") Тогда
ПараметрыЗагрузки.Вставить("НазваниеРегиона", Регион);
ПараметрыФормы.Вставить("НазваниеРегиона", Регион);
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ПараметрыЗагрузки", ПараметрыЗагрузки);
ДополнительныеПараметры.Вставить("ПараметрыФормы", ПараметрыФормы);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
Оповещение = Новый ОписаниеОповещения("ПослеВводаЛогинИПароля", ЭтотОбъект, ДополнительныеПараметры);
МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент");
МодульАдресныйКлассификаторКлиент.АвторизоватьНаСайтеПоддержкиПользователей(Оповещение, ЭтотОбъект);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаЛогинИПароля(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса = Неопределено Тогда
Оповещение = Новый ОписаниеОповещения("ПредложениеЗагрузкиКлассификатораЗавершение", ЭтотОбъект, ДополнительныеПараметры.ПараметрыЗагрузки);
ОткрытьФорму("Обработка.РасширенныйВводКонтактнойИнформации.Форма.ЗагрузкаАдресногоКлассификатора",
ДополнительныеПараметры.ПараметрыФормы, ЭтотОбъект,,,, Оповещение,
РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца);
Возврат;
КонецЕсли;
УстановитьНаселенныйПунктПослеВыбора(ДополнительныеПараметры.ПараметрыЗагрузки.ДанныеОбАдресе);
ОбновитьПовторноИспользуемыеЗначения();
ВебКлассификаторДоступен = Истина;
СообщениеОНеобходимостиЗагрузкиКлассификатора();
КонецПроцедуры
&НаКлиенте
Процедура ПредложениеЗагрузкиКлассификатораЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
УстановитьНаселенныйПунктПослеВыбора(ДополнительныеПараметры.ДанныеОбАдресе);
Возврат;
КонецЕсли;
ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура СообщениеОНеобходимостиЗагрузкиКлассификатора()
АдресныеСведенияЗагружены = АдресныеСведенияКлассификатораЗагружены(НаименованиеРегиона(НаселенныйПунктДетально));
Если ВебКлассификаторДоступен Или АдресныеСведенияЗагружены.РегионЗагружен Тогда
Элементы.ГруппаИнформация.Видимость = Ложь;
Элементы.Дом.КнопкаВыбора = Истина;
Элементы.Улица.КнопкаВыбора = Истина;
АвтоподборДоступен = Истина;
Элементы.ПроверитьЗаполнениеАдреса.Доступность = Истина;
ИначеЕсли АдресныеСведенияЗагружены.АдресныйКлассификаторДоступен Тогда
Элементы.ГруппаИнформация.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьНаселенныйПунктПослеВыбора(Знач ДанныеОбАдресе)
СодержитУлицы = НаселенныйПунктУстановитьПоляАдреса(НаселенныйПунктДетально, ДанныеОбАдресе, Ложь);
Элементы.Улица.ПодсказкаВвода = УстановитьПодсказкуВводаДляУлиц(СодержитУлицы);
ОбработкаИзмененияАдреса();
УстановитьФлагиВМенюПоТипуАдреса();
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция УстановитьПодсказкуВводаДляУлиц(СодержитУлицы)
Возврат ?(СодержитУлицы, НСтр("ru = 'Выберите или введите улицу'"), "");
КонецФункции
// Загружает адресный классификатор.
//
&НаКлиенте
Процедура ЗагрузитьАдресныйКлассификатор(Знач ДополнительныеПараметры = Неопределено)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент");
МодульАдресныйКлассификаторКлиент.ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СведенияОСтране(Страна)
Возврат УправлениеКонтактнойИнформацией.ДанныеСтраныМира(, Страна);
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция НаименованиеПриДобавлениеПроизвольногоПомещения()
Возврат НСтр("ru = 'Другое'");
КонецФункции
&НаСервере
Функция ОпределитьЗначениеАдреса()
ЗначенияПолей = ?(ЗначениеЗаполнено(Параметры.Значение), Параметры.Значение, Параметры.ЗначенияПолей);
Если ПустаяСтрока(ЗначенияПолей) И ЗначениеЗаполнено(Параметры.Представление) Тогда
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(Параметры.Представление,
Перечисления.ТипыКонтактнойИнформации.Адрес);
Модифицированность = Истина;
КонецЕсли;
Возврат ЗначенияПолей;
КонецФункции
&НаСервере
Функция ИзвлечьСтарыйФорматАдреса(Знач ЗначенияПолей, Знач ТипКонтактнойИнформации)
Перем XDTOКонтактная, РезультатыЧтения;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначенияПолей)
И ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
РезультатыЧтения = Новый Структура;
XDTOКонтактная = УправлениеКонтактнойИнформациейЛокализация.КонтактнаяИнформацияИзXML(ЗначенияПолей, ТипКонтактнойИнформации, РезультатыЧтения);
Если РезультатыЧтения.Свойство("ТекстОшибки") Тогда
// Распознали с ошибками, сообщим при открытии.
ТекстПредупрежденияПриОткрытии = РезультатыЧтения.ТекстОшибки;
XDTOКонтактная.Представление = Параметры.Представление;
XDTOКонтактная.Состав.Страна = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОсновнаяСтрана, "Наименование");
КонецЕсли;
Иначе
XDTOКонтактная = УправлениеКонтактнойИнформациейЛокализация.АдресXMLВXDTO(ЗначенияПолей, Параметры.Представление, );
Если ЗначениеЗаполнено(Параметры.Страна) Тогда
Если ТипЗнч(Параметры.Страна) = ТипЗнч(Справочники.СтраныМира.ПустаяСсылка()) Тогда
СтранаСсылка = Параметры.Страна; // СправочникСсылка.СтраныМира
XDTOКонтактная.Состав.Страна = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтранаСсылка , "Наименование");
Иначе
XDTOКонтактная.Состав.Страна = Строка(Параметры.Страна);
КонецЕсли;
Иначе
XDTOКонтактная.Состав.Страна = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОсновнаяСтрана, "Наименование");
КонецЕсли;
КонецЕсли;
Если Параметры.Комментарий <> Неопределено Тогда
// Ставим новый комментарий, иначе он придет из информации.
XDTOКонтактная.Комментарий = Параметры.Комментарий;
КонецЕсли;
Возврат XDTOКонтактная;
КонецФункции
&НаСервере
Процедура СформироватьМенюДобавленияСтроенийИПомещений()
Для каждого СтроениеИлиПомещение Из ДополнительныеСтроенияИПомещения Цикл
Если ЗначениеЗаполнено(СтроениеИлиПомещение.Ключ) Тогда
ИмяКоманды = "Добавить_" + СтроениеИлиПомещение.Ключ;
Команда = Команды.Добавить(ИмяКоманды);
Команда.Подсказка = НСтр("ru = 'Добавить'") + " " + НРег(СтроениеИлиПомещение.Значение);
Команда.Действие = "Подключаемый_ДобавитьСтроениеИлиПомещение";
Команда.ИзменяетСохраняемыеДанные = Истина;
Группа = ?(СтроениеИлиПомещение.Тип = "Строение", Элементы.ГруппаДобавлениеСтроения, Элементы.ГруппаДобавлениеПомещения);
Кнопка = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Группа);
Кнопка.ИмяКоманды = ИмяКоманды;
Кнопка.Заголовок = СтроениеИлиПомещение.Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ДобавитьОписаниеСтроенияИлиПомещения(ИмяПомещенияИлиСтроения, Тип, Ключ = "")
ОписаниеПомещения = ДополнительныеСтроенияИПомещения.Добавить();
ОписаниеПомещения.Значение = ИмяПомещенияИлиСтроения;
ОписаниеПомещения.Тип = Тип;
ОписаниеПомещения.Видимость = Истина;
ОписаниеПомещения.Ключ = "key" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ОписаниеПомещения.ПредыдущиеЗначение = ИмяПомещенияИлиСтроения;
КонецПроцедуры
&НаКлиенте
Функция ЗначениеСтроенияИлиПомещения(Тип, Значение)
Возврат Новый Структура("type, number", Тип, Значение);
КонецФункции
&НаКлиенте
Процедура ОбновитьПредставлениеАдреса()
ПредставлениеИзПолей = ?(Не СведенияОСтране.УчастникЕАЭС Или МеждународныйФорматАдреса, Ложь, Истина);
ПредставлениеАдреса = РаботаСАдресамиКлиентСервер.ПредставлениеАдреса(НаселенныйПунктДетально, ВидКонтактнойИнформации.ВключатьСтрануВПредставление, ,ПредставлениеИзПолей);
НаселенныйПунктДетально.Value = ПредставлениеАдреса;
Если ВидКонтактнойИнформации.ВключатьСтрануВПредставление И УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
УдалитьСтрануИзПредставления();
КонецЕсли;
ПоказатьПодсказкуПоТипАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьСведенияОНаселенномПункте()
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоИностранныйАдресИлиЕАЭС(НаселенныйПунктДетально.AddressType) Тогда
Если МеждународныйФорматАдреса Тогда
ЗаполнитьПолеИностранногоАдреса("area", "");
Иначе
ЗаполнитьПолеИностранногоАдреса("city", "");
КонецЕсли;
Иначе
ОчиститьНаселенныйПункт();
КонецЕсли;
Если ПустаяСтрока(НаселенныйПункт) Тогда
Возврат;
КонецЕсли;
АдресВосстановлен = Ложь;
ОчиститьИдентификаторыАдреса();
Если РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) И Не МеждународныйФорматАдреса Тогда
ИменаУровнейАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(НаселенныйПунктДетально.AddressType, Ложь);
АдресВосстановлен = ВосстановитьНаселенныйПунктАдреса(НаселенныйПункт, НаселенныйПунктДетально, ИменаУровнейАдреса);
КонецЕсли;
Если Не АдресВосстановлен Тогда
Если МеждународныйФорматАдреса Тогда
ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес();
ИначеЕсли Не ЭтоРФАдрес() И Не РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) Тогда
ЗаполнитьПолеИностранногоАдреса("city", НаселенныйПункт);
ОбновитьПредставлениеАдреса();
Возврат;
КонецЕсли;
ИменаУровнейАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(НаселенныйПунктДетально.addressType, Ложь);
ПорядокУровнейВАдресе = Новый Массив;
Если ИменаУровнейАдреса.Количество() = 1 Тогда
НаселенныйПунктДетально[ИменаУровнейАдреса[0]] = НаселенныйПункт;
ОбновитьСписокУровней(НаселенныйПунктДетально, ИменаУровнейАдреса[0], ЗначениеЗаполнено(НаселенныйПункт));
Иначе
ЭлементыАдреса = СтрРазделить(НаселенныйПункт, ",", Истина);
Для ИндексАдреса = 0 По ИменаУровнейАдреса.Количество() - 1 Цикл
ИмяУровня = ИменаУровнейАдреса[ИндексАдреса];
Если ЭлементыАдреса.Количество() > 0 Тогда
ЗначениеПоля = СокрЛП(ЭлементыАдреса[0]);
Если ЭтоРФАдрес() Тогда
Позиция = СтрНайти(ЗначениеПоля, " ", НаправлениеПоиска.СНачала);
Иначе
Позиция = 0;
КонецЕсли;
Если Позиция > 0 Тогда
НаселенныйПунктДетально[ИмяУровня] = СокрЛП(Сред(ЗначениеПоля, Позиция + 1));
НаселенныйПунктДетально[ИмяУровня + "Type"] = СокрЛП(Лев(ЗначениеПоля, Позиция));
Иначе
НаселенныйПунктДетально[ИмяУровня] = ЗначениеПоля;
КонецЕсли;
ЭлементыАдреса.Удалить(0);
ПорядокУровнейВАдресе.Добавить(ИмяУровня);
Иначе
НаселенныйПунктДетально[ИмяУровня] = "";
КонецЕсли;
КонецЦикла;
Если РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType) Тогда
НаселенныйПунктДетально.munLevels = ПорядокУровнейВАдресе;
ИмяПоляДругогоТипаАдреса = "admLevels";
ИменаУровнейДругогоТипаАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(
РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес(), Ложь);
Иначе
НаселенныйПунктДетально.admLevels = ПорядокУровнейВАдресе;
ИмяПоляДругогоТипаАдреса = "munLevels";
ИменаУровнейДругогоТипаАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(
РаботаСАдресамиКлиентСервер.МуниципальныйАдрес(), Ложь);
КонецЕсли;
НаселенныйПунктДетально[ИмяПоляДругогоТипаАдреса] = Новый Массив;
Для каждого ИмяУровня Из ИменаУровнейДругогоТипаАдреса Цикл
ОбновитьСписокУровней(НаселенныйПунктДетально, ИмяУровня, ЗначениеЗаполнено(НаселенныйПунктДетально[ИмяУровня]));
КонецЦикла;
Если ЭлементыАдреса.Количество() > 0 Тогда
НаселенныйПунктДетально[ИменаУровнейАдреса[ИменаУровнейАдреса.Количество() - 1]] = СокрЛП(СтрСоединить(ЭлементыАдреса, ","));
КонецЕсли;
КонецЕсли;
КонецЕсли;
ОбновитьПредставлениеАдреса();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВосстановитьНаселенныйПунктАдреса(НаселенныйПункт, НаселенныйПунктДетально, ИменаУровнейАдреса)
Результат = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(НаселенныйПункт, Перечисления.ТипыКонтактнойИнформации.Адрес);
Адрес = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Результат, Перечисления.ТипыКонтактнойИнформации.Адрес);
Если УправлениеКонтактнойИнформацией.АдресВведенВСвободнойФорме(Адрес) Тогда
Возврат Ложь;
КонецЕсли;
Для каждого ИмяУровняАдреса Из ИменаУровнейАдреса Цикл
НаселенныйПунктДетально[ИмяУровняАдреса] = Адрес[ИмяУровняАдреса];
НаселенныйПунктДетально[ИмяУровняАдреса + "Type"] = Адрес[ИмяУровняАдреса + "Type"];
ОбновитьСписокУровней(НаселенныйПунктДетально, ИмяУровняАдреса, ЗначениеЗаполнено(Адрес[ИмяУровняАдреса]));
КонецЦикла;
УстановитьИдентификаторыАдреса(НаселенныйПунктДетально);
Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ПоказатьПодсказкуПоТипАдреса()
Если МеждународныйФорматАдреса Тогда
Элементы.СтраницаТипАдреса.ТекущаяСтраница = Элементы.СтраницаДругойАдрес;
Элементы.ГруппаТребуетсяПомощь.Видимость = Ложь;
ЦветРамки = Новый Цвет();
ЦветТекстаПредставления = Новый Цвет();
ИначеЕсли РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда
Элементы.СтраницаТипАдреса.ТекущаяСтраница = Элементы.СтраницаМуниципальныйАдрес;
Элементы.ГруппаТребуетсяПомощь.Видимость = Истина;
ЦветРамки = ЦветФонаФормы;
ЦветТекстаПредставления = ЦветПоясняющегоТекста;
ИначеЕсли РаботаСАдресамиКлиент.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда
Элементы.СтраницаТипАдреса.ТекущаяСтраница = Элементы.СтраницаАдминистративноТерриториальныйАдрес;
Элементы.ГруппаТребуетсяПомощь.Видимость = Истина;
ЦветРамки = ЦветФонаФормы;
ЦветТекстаПредставления = ЦветПоясняющегоТекста;
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
Элементы.СтраницаТипАдреса.ТекущаяСтраница = Элементы.СтраницаАдресВСвободнойФорме;
Элементы.ГруппаТребуетсяПомощь.Видимость = Истина;
ЦветРамки = Новый Цвет();
ЦветТекстаПредставления = Новый Цвет();
Иначе
Элементы.СтраницаТипАдреса.ТекущаяСтраница = Элементы.СтраницаДругойАдрес;
Элементы.ГруппаТребуетсяПомощь.Видимость = Ложь;
ЦветРамки = ЦветФонаФормы;
ЦветТекстаПредставления = ЦветПоясняющегоТекста;
КонецЕсли;
Элементы.ПредставлениеАдреса.ЦветРамки = ЦветРамки;
Элементы.ПредставлениеАдреса.ЦветТекста = ЦветТекстаПредставления;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаИзмененияАдреса(ОбновитьДополнительныеЗдания = Истина)
Если ЭтоНациональныйАдрес() Тогда
НаселенныйПункт = ПредставлениеНаселенногоПунктаАдреса(НаселенныйПунктДетально);
Иначе
РегионИностранногоАдреса = НаселенныйПунктДетально.area;
РайонИностранногоАдреса = НаселенныйПунктДетально.district;
НаселенныйПункт = НаселенныйПунктДетально.city;
ВнутригородскойРайонИностранногоАдреса = НаселенныйПунктДетально.locality;
КонецЕсли;
Улица = ?(ПустаяСтрока(НаселенныйПунктДетально.Street), "",
УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(
НаселенныйПунктДетально.Street, НаселенныйПунктДетально.StreetType));
Если ПустаяСтрока(НаселенныйПунктДетально.country) И (ЗначениеЗаполнено(НаселенныйПункт) Или ЗначениеЗаполнено(Улица)) Тогда
НаселенныйПунктДетально.country = ?(ЗначениеЗаполнено(Страна), Строка(Страна), РаботаСАдресамиКлиентСервер.ОсновнаяСтрана());
КонецЕсли;
ОбновитьПредставлениеАдреса();
ФорматАдреса = НаселенныйПунктДетально.AddressType;
Индекс = НаселенныйПунктДетально.ZIPCode;
ОКТМО = НаселенныйПунктДетально.OKTMO;
Если ЗначениеЗаполнено(НаселенныйПунктДетально.HouseType) Тогда
ТипДома = НаселенныйПунктДетально.HouseType;
КонецЕсли;
Если ПустаяСтрока(НаселенныйПунктДетально.stead) Тогда
Дом = НаселенныйПунктДетально.HouseNumber;
Иначе
Дом = НаселенныйПунктДетально.stead;
ТипДома = РаботаСАдресамиКлиентСервер.НаименованиеЗемельногоУчастка();
КонецЕсли;
Если НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
Если ЗначениеЗаполнено(НаселенныйПунктДетально.buildings[0].Type) Тогда
ТипСтроения = НаселенныйПунктДетально.buildings[0].Type;
КонецЕсли;
Строение = НаселенныйПунктДетально.buildings[0].Number;
Иначе
Строение = "";
КонецЕсли;
Если НаселенныйПунктДетально.Apartments.Количество() > 0 Тогда
Если ЗначениеЗаполнено(НаселенныйПунктДетально.Apartments[0].Type) Тогда
ТипПомещения = НаселенныйПунктДетально.Apartments[0].Type;
КонецЕсли;
Помещение = НаселенныйПунктДетально.Apartments[0].Number;
Иначе
Помещение = "";
КонецЕсли;
УстановитьФлагиВМенюПоТипуАдреса();
Если ОбновитьДополнительныеЗдания Тогда
ПодключитьОбработчикОжидания("ОбновитьДополнительныеЗдания", 0.1, Истина);
КонецЕсли;
Если ЗначениеЗаполнено(Комментарий) Тогда
Элементы.ОсновныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху;
Элементы.СтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Комментарий);
Иначе
Элементы.ОсновныеСтраницы.ТекущаяСтраница = Элементы.СтраницаАдрес;
Элементы.ОсновныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
КонецЕсли;
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Функция ПредставлениеНаселенногоПунктаАдреса(Адрес)
СписокЗаполненныхУровней = Новый Массив;
ПорядокУровнейВАдресе = РаботаСАдресамиКлиентСервер.ИменаУровнейАдресаПоАдресу(Адрес, Ложь);
Для каждого ИмяУровня Из ПорядокУровнейВАдресе Цикл
Если ЗначениеЗаполнено(Адрес[ИмяУровня]) Тогда
Если СтрСравнить(ИмяУровня, "street") = 0 Тогда
Продолжить;
КонецЕсли;
СписокЗаполненныхУровней.Добавить(РаботаСАдресамиКлиентСервер.ПредставлениеУровняАдреса(Адрес, ИмяУровня));
КонецЕсли;
КонецЦикла;
Возврат СтрСоединить(СписокЗаполненныхУровней, ", ");
КонецФункции
&НаКлиенте
Процедура УстановитьФлагиВМенюПоТипуАдреса()
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
Элементы.АдресВСвободнойФорме.Пометка = Истина;
Элементы.МуниципальноеДеление.Пометка = Ложь;
Элементы.АдминистративноТерриториальноеДеление.Пометка = Ложь;
ИначеЕсли РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда
Элементы.АдресВСвободнойФорме.Пометка = Ложь;
Элементы.МуниципальноеДеление.Пометка = Истина;
Элементы.АдминистративноТерриториальноеДеление.Пометка = Ложь;
Элементы.ПроверитьЗаполнениеАдреса.Доступность = Истина;
ИначеЕсли РаботаСАдресамиКлиент.ЭтоАдминистративноТерриториальныйАдрес(НаселенныйПунктДетально.AddressType) Тогда
Элементы.АдресВСвободнойФорме.Пометка = Ложь;
Элементы.МуниципальноеДеление.Пометка = Ложь;
Элементы.АдминистративноТерриториальноеДеление.Пометка = Истина;
Элементы.ПроверитьЗаполнениеАдреса.Доступность = Истина;
Иначе
Элементы.МуниципальноеДеление.Пометка = Ложь;
Элементы.АдминистративноТерриториальноеДеление.Пометка = Ложь;
Элементы.АдресВСвободнойФорме.Пометка = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьНаСтруктурированныйВвод(ТипАдреса = Неопределено)
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType) Тогда
РазрешитьВводАдресаВСвободнойФорме = Ложь;
ТекстВопроса = НСтр("ru = 'Изменения, введенные вручную, будут потеряны.
|Исходный адрес будет перемещен в комментарий.
|Продолжить?'");
Если МеждународныйФорматАдреса Тогда
ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес();
КонецЕсли;
ДополнительныеПараметры = Новый Структура("ТипАдреса", ТипАдреса);
Оповещение = Новый ОписаниеОповещения("ПереключитьНаСтруктурированныйВводЗавершение", ЭтотОбъект, ДополнительныеПараметры );
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,,, НСтр("ru = 'Подтверждение'"));
Иначе
ОтобразитьВыбранныйТипАдреса(ТипАдреса);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьНаСтруктурированныйВводЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(СокрЛП(ПредставлениеАдреса))
И СтрНайти(ВРег(Комментарий), ВРег(ПредставлениеАдреса)) = 0 Тогда
Комментарий = ?(НЕ ПустаяСтрока(Комментарий), Комментарий + Символы.ПС, "")
+ НСтр("ru = 'Исходный адрес:'") + " " + ПредставлениеАдреса;
НаселенныйПунктДетально.comment = Комментарий;
КонецЕсли;
ПодключитьОбработчикОжидания("УстановитьПиктограммуКомментария", 0.1, Истина);
ОтобразитьВыбранныйТипАдреса(ДополнительныеПараметры.ТипАдреса);
ПереключитьОтображениеАдресВСвободнойФорме();
ОбновитьПредставлениеАдреса();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьИдентификаторыАдреса()
Для каждого ЭлементАдреса Из НаселенныйПунктДетально Цикл
Если СтрЗаканчиваетсяНа(ЭлементАдреса.Ключ, "Id") Тогда
НаселенныйПунктДетально[ЭлементАдреса.Ключ] = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьИдентификаторыАдреса(Адрес)
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
МодульАдресныйКлассификаторСлужебный.УстановитьИдентификаторыАдреса(Адрес);
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ИдентификаторАдреса(Адрес, ВключатьУлицу, ВключатьУровеньДома = Ложь)
Возврат РаботаСАдресамиКлиентСервер.ИдентификаторАдреса(Адрес, ВключатьУлицу, ВключатьУровеньДома);
КонецФункции
&НаСервереБезКонтекста
Функция НайтиИндексУДома(АдресныйОбъект, Дом)
ПолныйСписокДомов = Обработки.РасширенныйВводКонтактнойИнформации.СписокДомов(АдресныйОбъект, Дом, 1);
Если ПолныйСписокДомов.Количество() > 0 Тогда
Возврат ПолныйСписокДомов[0].Значение.Индекс;
КонецЕсли;
Возврат "";
КонецФункции
&НаКлиенте
Процедура ОткрытьФормуЗагрузкиКлассификатора()
ДополнительныеПараметры = Новый Структура();
Если ТипЗнч(НаселенныйПунктДетально) = Тип("Структура") И НаселенныйПунктДетально.Свойство("Area") Тогда
СведенияОРегионе = СведенияОРегионе(НаселенныйПунктДетально.area, НаселенныйПунктДетально.areaType);
ДополнительныеПараметры.Вставить("КодРегионаДляЗагрузки", СведенияОРегионе.КодСубъектаРФ);
КонецЕсли;
ЗагрузитьАдресныйКлассификатор(ДополнительныеПараметры);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьМуниципальныеЧастиАдресаИИдентификаторы(НаселенныйПунктДетально, ВыбранноеЗначение)
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
ТипЧисло = Новый ОписаниеТипов("Число");
ОКТМО = ТипЧисло.ПривестиЗначение(ВыбранноеЗначение.ОКТМО);
ЗагруженныеДанные = ВыбранноеЗначение.ЗагруженныеДанные;
ЕстьИдентификаторПомещения = Ложь;
Если НаселенныйПунктДетально.apartments.Количество() = 1 Тогда
ЕстьИдентификаторПомещения = Истина;
МодульАдресныйКлассификаторСлужебный.УстановитьИдентификаторыАдреса(НаселенныйПунктДетально);
КонецЕсли;
Если ЗагруженныеДанные Тогда
ИдентификаторАдреса = ИдентификаторАдреса(НаселенныйПунктДетально, Истина);
Иначе
Если ЗначениеЗаполнено(ВыбранноеЗначение.ИдентификаторДома) И Не ЕстьИдентификаторПомещения Тогда
ИдентификаторАдреса = ВыбранноеЗначение.ИдентификаторДома;
Иначе
ИдентификаторАдреса = ИдентификаторАдреса(НаселенныйПунктДетально, Истина, Не ЗагруженныеДанные);
КонецЕсли;
КонецЕсли;
МодульАдресныйКлассификаторСлужебный.УстановитьМуниципальныеСведения(НаселенныйПунктДетально, ОКТМО,
ИдентификаторАдреса, ЗагруженныеДанные);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СформироватьТекстНужнаПомощь()
Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
Возврат;
КонецЕсли;
Если ВидКонтактнойИнформации.ПроверятьКорректность И Не ВидКонтактнойИнформации.МожноИзменятьСпособРедактирования Тогда
Возврат;
КонецЕсли;
ДополнительныйТекст = Символы.ПС + Символы.ПС + НСтр("ru = 'Также адрес можно ввести в свободной форме (см. Еще - Адрес в свободной форме).'");
Если ВидКонтактнойИнформации.МожноИзменятьСпособРедактирования И ВидКонтактнойИнформации.ПроверятьКорректность Тогда
ДополнительныйТекст = ДополнительныйТекст + " " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Для этого предварительно снять флажок ""Запрещать ввод некорректных адресов"" в виде контактной информации ""%1"".'"),
ОписаниеВидаКонтактнойИнформации(ЭтотОбъект).Ссылка);
КонецЕсли;
Элементы.ДекорацияНужнаПомощь.Заголовок = Новый ФорматированнаяСтрока(Элементы.ДекорацияНужнаПомощь.Заголовок, ДополнительныйТекст);
КонецПроцедуры
// Возвращаемое значение:
// см. УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации
//
&НаКлиентеНаСервереБезКонтекста
Функция ОписаниеВидаКонтактнойИнформации(Форма)
Возврат Форма.ВидКонтактнойИнформации;
КонецФункции
// Параметры:
// Страна - Структура
// Возвращаемое значение:
// см. УправлениеКонтактнойИнформацией.ДанныеСтраныМира
//
&НаКлиентеНаСервереБезКонтекста
Функция ДанныеСтраныМира(Страна)
Возврат Страна;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция НаименованиеСтраны(Страна, МеждународныйФорматАдреса)
СведенияОСтране = СведенияОСтране(Страна);
НаименованиеСтраны = СведенияОСтране.Наименование;
Если МеждународныйФорматАдреса Тогда
Если ЗначениеЗаполнено(СведенияОСтране.МеждународноеНаименование) Тогда
НаименованиеСтраны = СведенияОСтране.МеждународноеНаименование;
КонецЕсли;
КонецЕсли;
Возврат НаименованиеСтраны;
КонецФункции
// Конструкторы
&НаКлиенте
Функция ПараметрыОткрытияФормыНаселенногоПункта()
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("НаселенныйПунктДетально", НаселенныйПунктДетально);
ПараметрыФормы.Вставить("ОтображатьКнопкиВыбора", ИспользуетсяАдресныйКлассификатор);
ПараметрыФормы.Вставить("ТипАдреса", ТипАдреса);
Возврат ПараметрыФормы;
КонецФункции
&НаКлиенте
Функция ПараметрыОткрытияФормаВыбораПоИндексу()
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Индекс", "");
ПараметрыФормы.Вставить("ВыборАдресаПоПочтовомуИндексу", Истина);
ПараметрыФормы.Вставить("ТипАдреса", ТипАдреса);
Возврат ПараметрыФормы;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция НачалоУчета()
Возврат НСтр("ru = 'начало учета'");
КонецФункции
&НаКлиенте
Процедура ПослеАвторизоватьНаСайтеПоддержкиПользователей(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
ОткрытьФормуЗагрузкиКлассификатора();
Возврат;
КонецЕсли;
ОбновитьПовторноИспользуемыеЗначения();
ВебКлассификаторДоступен = Истина;
СообщениеОНеобходимостиЗагрузкиКлассификатора();
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораУлицы(Результат, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
Если Не Результат.Отказ Тогда
НаселенныйПунктДетально = ОпределитьАдресПоИдентификатору(Результат);
ОбработкаИзмененияАдреса();
КонецЕсли;
Иначе
ПоказатьПредупреждение(, НСтр("ru = 'Выбор из списка недоступен, т.к в адресном классификаторе отсутствует информация об улицах для введенного населенного пункта.'"));
КонецЕсли;
КонецПроцедуры
// Параметры:
// Результат - см. РаботаСАдресамиКлиентСервер.ВозвращаемыеДанныеОбАдресе
// ДополнительныеПараметры - Неопределено
//
&НаКлиенте
Процедура ПослеВводаСведенийНаселенногоПункта(Результат, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда
НаселенныйПунктДетально = Результат.НаселенныйПунктДетально;
Элементы.Улица.ПодсказкаВвода = УстановитьПодсказкуВводаДляУлиц(Результат.УАдресаЕстьУлицы);
ОбработкаИзмененияАдреса();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнениеПолейАдресаДляРанееВведенныхАдресов()
Если ЗначениеЗаполнено(НаселенныйПунктДетально.value) Тогда
Если ПустаяСтрока(НаселенныйПунктДетально.areaValue) Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор");
Если ПустаяСтрока(НаселенныйПунктДетально.areaCode) Тогда
НаселенныйПунктДетально.areaCode = МодульАдресныйКлассификатор.КодРегионаПоНаименованию(
УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(НаселенныйПунктДетально.area,
НаселенныйПунктДетально.areaType, Истина))
КонецЕсли;
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
НаселенныйПунктДетально.areaValue = МодульАдресныйКлассификаторСлужебный.ПолноеНаименованиеРегионаПоКоду(НаселенныйПунктДетально.areaCode);
КонецЕсли;
КонецЕсли;
Если НаселенныйПунктДетально.munLevels.Количество() = 0 Тогда
УровниАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(РаботаСАдресамиКлиентСервер.МуниципальныйАдрес(), Истина);
Для Каждого УровеньАдреса Из УровниАдреса Цикл
Если ЗначениеЗаполнено(НаселенныйПунктДетально[УровеньАдреса]) Тогда
НаселенныйПунктДетально.munLevels.Добавить(УровеньАдреса);
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(НаселенныйПунктДетально.houseNumber) Или НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
НаселенныйПунктДетально.munLevels.Добавить("house");
КонецЕсли;
КонецЕсли;
Если НаселенныйПунктДетально.admLevels.Количество() = 0 Тогда
УровниАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес(), Истина);
Для Каждого УровеньАдреса Из УровниАдреса Цикл
Если ЗначениеЗаполнено(НаселенныйПунктДетально[УровеньАдреса]) Тогда
НаселенныйПунктДетально.admLevels.Добавить(УровеньАдреса);
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(НаселенныйПунктДетально.houseNumber) Или НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
НаселенныйПунктДетально.admLevels.Добавить("house");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьЗначенияПолейПослеИзмененияПредставления()
Если Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType)
И Не Элементы.АдресВСвободнойФорме.Пометка Тогда
Возврат;
КонецЕсли;
Если ПредставлениеАдресаКеш = Неопределено Или (ПредставлениеАдресаКеш = ПредставлениеАдреса
И ЗначениеЗаполнено(ПредставлениеАдресаКеш)) Тогда
Возврат;
КонецЕсли;
УстановитьЗначенияПолейПослеИзмененияПредставленияНаСервере(ПредставлениеАдреса, НаселенныйПунктДетально);
ПредставлениеАдресаКеш = ПредставлениеАдреса;
КонецПроцедуры
&НаСервере
Процедура УстановитьЗначенияПолейПослеИзмененияПредставленияНаСервере(ПредставлениеАдреса, Знач Адрес = Неопределено)
Если Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType)
И Не Элементы.АдресВСвободнойФорме.Пометка Тогда
Возврат;
КонецЕсли;
Если Не СведенияОСтране.УчастникЕАЭС Или МеждународныйФорматАдреса Тогда
Возврат;
КонецЕсли;
ПредставлениеАдресаДоУстановкиРеквизитов = ПредставлениеАдреса;
СтранаДоИзменения = НаселенныйПунктДетально.country;
Комментарий = НаселенныйПунктДетально.comment;
ДанныеАдреса = РаботаСАдресами.РазложитьПредставлениеАдресаПоПолям(ПредставлениеАдреса, Адрес);
НаселенныйПунктДетально = РаботаСАдресами.ПодготовитьАдресДляВвода(ДанныеАдреса);
НаселенныйПунктДетально.AddressType = УправлениеКонтактнойИнформациейКлиентСервер.АдресВСвободнойФорме();
НаселенныйПунктДетально.country = ?(ЗначениеЗаполнено(НаселенныйПунктДетально.country),
НаселенныйПунктДетально.country, СтранаДоИзменения);
НаселенныйПунктДетально.comment = Комментарий;
НаселенныйПункт = "";
Улица = "";
Дом = "";
Строение = "";
Помещение = "";
РазрешитьВводАдресаВСвободнойФормеКеш = РазрешитьВводАдресаВСвободнойФорме;
УстановитьЗначениеРеквизитовПоКонтактнойИнформации(НаселенныйПунктДетально);
ПредставлениеАдреса = ПредставлениеАдресаДоУстановкиРеквизитов;
РазрешитьВводАдресаВСвободнойФорме = РазрешитьВводАдресаВСвободнойФормеКеш;
НаселенныйПунктДетально.value = ПредставлениеАдреса;
КонецПроцедуры
&НаКлиенте
Процедура ПроверкаОбновленияПолейПослеИзмененияПредставления()
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(НаселенныйПунктДетально.AddressType)
И Элементы.АдресВСвободнойФорме.Пометка Тогда
УстановитьЗначенияПолейПослеИзмененияПредставления();
КонецЕсли;
КонецПроцедуры
#КонецОбласти