#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Параметры.Свойство("ВозвращатьСписокЗначений", ВозвращатьСписокЗначений);
Если ТипЗнч(Параметры.ВидКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
ВидКонтактнойИнформации = Параметры.ВидКонтактнойИнформации;
КонецЕсли;
СтруктураВидКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.СтруктураВидаКонтактнойИнформации(Параметры.ВидКонтактнойИнформации);
ТипКонтактнойИнформации = СтруктураВидКонтактнойИнформации.Тип;
ВводитьНомерПоМаске = СтруктураВидКонтактнойИнформации.ВводитьНомерПоМаске И (НЕ ЗначениеЗаполнено(Параметры.Представление)
ИЛИ УправлениеКонтактнойИнформациейСлужебный.НомерТелефонаСоответствуетМаске(Параметры.Представление, СтруктураВидКонтактнойИнформации.МаскаНомераТелефона));
ПроверятьКорректность = СтруктураВидКонтактнойИнформации.ПроверятьКорректность;
Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), Строка(ВидКонтактнойИнформации), Параметры.Заголовок);
ЭтоНовый = Ложь;
ЗначенияПолей = ОпределитьЗначениеКонтактнойИнформации(Параметры);
Если НЕ ВводитьНомерПоМаске И Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда
МодульРасширенныйВводКонтактнойИнформации = ОбщегоНазначения.ОбщийМодуль("Обработки.РасширенныйВводКонтактнойИнформации");
ПодсказкиПриВводеТелефона = МодульРасширенныйВводКонтактнойИнформации.ПодсказкиПриВводеТелефона();
Элементы.КодСтраны.ПодсказкаВвода = ПодсказкиПриВводеТелефона.КодСтраны;
Элементы.КодГорода.ПодсказкаВвода = ПодсказкиПриВводеТелефона.КодГорода;
Элементы.НомерТелефона.ПодсказкаВвода = ПодсказкиПриВводеТелефона.НомерТелефона;
ИспользоватьДополнительныеПроверки = Истина;
КонецЕсли;
Если ПустаяСтрока(ЗначенияПолей) Тогда
Данные = УправлениеКонтактнойИнформацией.ОписаниеНовойКонтактнойИнформации(ТипКонтактнойИнформации);
ЭтоНовый = Истина;
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(ЗначенияПолей) Тогда
Данные = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(ЗначенияПолей, Перечисления.ТипыКонтактнойИнформации.Телефон);
Иначе
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначенияПолей) Тогда
РезультатыЧтения = Новый Структура;
КонтактнаяИнформация = Неопределено;
УправлениеКонтактнойИнформациейЛокализация.ПриКонвертированииКонтактнойИнформацииИзXML(ЗначенияПолей, КонтактнаяИнформация, ТипКонтактнойИнформации, РезультатыЧтения);
Если РезультатыЧтения.Свойство("ТекстОшибки") Тогда
ТекстПредупрежденияПриОткрытии = РезультатыЧтения.ТекстОшибки;
КонтактнаяИнформация.Представление = Параметры.Представление;
КонецЕсли;
Иначе
КонтактнаяИнформация = Неопределено;
Если ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
УправлениеКонтактнойИнформациейЛокализация.ПриКонвертацииТелефонаВОбъектXDTO(ЗначенияПолей,
КонтактнаяИнформация, Параметры.Представление, ТипКонтактнойИнформации);
Иначе
УправлениеКонтактнойИнформациейЛокализация.ПриКонвертацииФаксаВОбъектXDTO(ЗначенияПолей,
КонтактнаяИнформация, Параметры.Представление, ТипКонтактнойИнформации);
КонецЕсли;
КонецЕсли;
Если КонтактнаяИнформация <> Неопределено Тогда
Данные = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(КонтактнаяИнформация, ТипКонтактнойИнформации);
Иначе
Данные = УправлениеКонтактнойИнформацией.ОписаниеНовойКонтактнойИнформации(ТипКонтактнойИнформации);
КонецЕсли;
КонецЕсли;
ЗначениеРеквизитовПоКонтактнойИнформации(Данные);
Элементы.НомерТелефонаПоМаске.Видимость = ВводитьНомерПоМаске;
Элементы.НомерТелефонаПоМаске.Маска = СтруктураВидКонтактнойИнформации.МаскаНомераТелефона;
Элементы.ГруппаПоляТелефона.Видимость = Не ВводитьНомерПоМаске;
Элементы.Добавочный.Видимость = СтруктураВидКонтактнойИнформации.ТелефонСДобавочнымНомером;
Элементы.ОчиститьТелефон.Доступность = Не Параметры.ТолькоПросмотр;
Если НЕ ВводитьНомерПоМаске Тогда
Коды = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона", "КодыСтраныИГорода");
Если ТипЗнч(Коды) = Тип("Структура") Тогда
Если ЭтоНовый Тогда
Коды.Свойство("КодСтраны", КодСтраны);
Коды.Свойство("КодГорода", КодГорода);
КонецЕсли;
Если Коды.Свойство("СписокКодовГорода") Тогда
Элементы.КодГорода.СписокВыбора.ЗагрузитьЗначения(Коды.СписокКодовГорода);
КонецЕсли;
КонецЕсли;
Если СтруктураВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда
Если Параметры.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов <> Неопределено Тогда
Для каждого СтрокаКИ Из Параметры.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл
НоваяСтрока = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКИ);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Авто;
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "Представление", "ПодсказкаВвода", НСтр("ru = 'Представление'"));
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КомандаОК", "Картинка", БиблиотекаКартинок.ЗаписатьИЗакрыть);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КомандаОК", "Отображение", ОтображениеКнопки.Картинка);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "Отмена", "Видимость", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КодСтраны", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КодГорода", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "НомерТелефона", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "Добавочный", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "НомерТелефонаПоМаске", "ПоложениеЗаголовка", ПоложениеЗаголовкаЭлементаФормы.Лево);
Если Элементы.КодГорода.СписокВыбора.Количество() < 2 Тогда
Элементы.КодГорода.КнопкаВыпадающегоСписка = Неопределено;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Не ПустаяСтрока(ТекстПредупрежденияПриОткрытии) Тогда
ПодключитьОбработчикОжидания("Подключаемый_ПредупредитьПослеОткрытияФормы", 0.1, Истина);
КонецЕсли;
Если ЗначениеЗаполнено(КодГорода) Тогда
ТекущийЭлемент = Элементы.КодГорода;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Оповещение = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект);
ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ЗавершениеРаботы);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура КодСтраныПриИзменении(Элемент)
ЗаполнитьПредставлениеТелефона();
КонецПроцедуры
&НаКлиенте
Процедура КодГородаПриИзменении(Элемент)
Если ИспользоватьДополнительныеПроверки Тогда
МодульРаботаСАдресамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСАдресамиКлиент");
МодульРаботаСАдресамиКлиент.ПоказатьПодсказкуКорректностиКодовСтраныИГорода(КодСтраны, КодГорода);
КонецЕсли;
ЗаполнитьПредставлениеТелефона();
КонецПроцедуры
&НаКлиенте
Процедура НомерТелефонаПриИзменении(Элемент)
ЗаполнитьПредставлениеТелефона();
КонецПроцедуры
&НаКлиенте
Процедура ДобавочныйПриИзменении(Элемент)
ЗаполнитьПредставлениеТелефона();
КонецПроцедуры
&НаКлиенте
Процедура НомерТелефонаПоМаскеПриИзменении(Элемент)
Модифицированность = Истина;
Представление = НомерТелефонаПоМаске;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура КомандаОК(Команда)
ПодтвердитьИЗакрыть();
КонецПроцедуры
&НаКлиенте
Процедура КомандаОтмена(Команда)
Модифицированность = Ложь;
Закрыть();
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьТелефон(Команда)
ОчиститьТелефонСервер();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура Подключаемый_ПредупредитьПослеОткрытияФормы()
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстПредупрежденияПриОткрытии);
КонецПроцедуры
&НаКлиенте
Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
Если Модифицированность Тогда
ЕстьОшибкиЗаполнения = Ложь;
Если ПроверятьКорректность Тогда
МодульРаботаСАдресамиКлиент = Неопределено;
Если ИспользоватьДополнительныеПроверки Тогда
МодульРаботаСАдресамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСАдресамиКлиент");
КонецЕсли;
ПоляТелефона = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураПолейТелефона();
ПоляТелефона.КодГорода = КодГорода;
ПоляТелефона.КодСтраны = КодСтраны;
ПоляТелефона.НомерТелефона = НомерТелефона;
ПоляТелефона.Представление = Представление;
ПоляТелефона.Добавочный = Добавочный;
ПоляТелефона.Комментарий = Комментарий;
Если ВводитьНомерПоМаске Тогда
ПоляТелефона.НомерТелефона = НомерТелефонаПоМаске;
КонецЕсли;
СписокОшибок = УправлениеКонтактнойИнформациейКлиентСервер.ОшибкиЗаполненияТелефона(ПоляТелефона, МодульРаботаСАдресамиКлиент);
ЕстьОшибкиЗаполнения = СписокОшибок.Количество() > 0;
КонецЕсли;
Если ЕстьОшибкиЗаполнения Тогда
СообщитьОбОшибкахЗаполнения(СписокОшибок);
Возврат;
КонецЕсли;
Результат = РезультатВыбора();
СброситьМодифицированностьПриВыборе();
ОповеститьОВыборе(Результат);
ИначеЕсли Комментарий <> КопияКомментария Тогда
Результат = РезультатВыбораТолькоКомментария();
СброситьМодифицированностьПриВыборе();
ОповеститьОВыборе(Результат);
Иначе
Результат = Неопределено;
КонецЕсли;
Если (МодальныйРежим Или ЗакрыватьПриВыборе) И Открыта() Тогда
СброситьМодифицированностьПриВыборе();
Закрыть(Результат);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СброситьМодифицированностьПриВыборе()
Модифицированность = Ложь;
КопияКомментария = Комментарий;
КонецПроцедуры
&НаСервере
Функция РезультатВыбора()
Результат = Новый Структура();
СписокВыбора = Элементы.КодГорода.СписокВыбора;
ЭлементСписка = СписокВыбора.НайтиПоЗначению(КодГорода);
Если ЭлементСписка = Неопределено Тогда
СписокВыбора.Вставить(0, КодГорода);
Если СписокВыбора.Количество() > 10 Тогда
СписокВыбора.Удалить(10);
КонецЕсли;
Иначе
Индекс = СписокВыбора.Индекс(ЭлементСписка);
Если Индекс <> 0 Тогда
СписокВыбора.Сдвинуть(Индекс, -Индекс);
КонецЕсли;
КонецЕсли;
Коды = Новый Структура("КодСтраны, КодГорода, СписокКодовГорода", КодСтраны, КодГорода, СписокВыбора.ВыгрузитьЗначения());
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона", "КодыСтраныИГорода", Коды, НСтр("ru = 'Коды страны и города'"));
КонтактнаяИнформация = КонтактнаяИнформацияПоЗначениюРеквизитов();
ДанныеВыбора = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(КонтактнаяИнформация);
Результат.Вставить("Вид", ВидКонтактнойИнформации);
Результат.Вставить("Тип", ТипКонтактнойИнформации);
Результат.Вставить("КонтактнаяИнформация", УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ДанныеВыбора, КонтактнаяИнформация.Value, ТипКонтактнойИнформации));
Результат.Вставить("Значение", ДанныеВыбора);
Результат.Вставить("Представление", КонтактнаяИнформация.Value);
Результат.Вставить("Комментарий", КонтактнаяИнформация.Comment);
Результат.Вставить("ВВидеГиперссылки", Ложь);
Результат.Вставить("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов",
КонтактнаяИнформацияОписаниеДополнительныхРеквизитов);
Возврат Результат
КонецФункции
&НаСервере
Функция РезультатВыбораТолькоКомментария()
ЗначениеКонтактнойИнформации = ОпределитьЗначениеКонтактнойИнформации(Параметры);
Если ПустаяСтрока(ЗначениеКонтактнойИнформации) Тогда
Если ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
УправлениеКонтактнойИнформациейЛокализация.ПриКонвертацииТелефонаВОбъектXDTO("", ЗначениеКонтактнойИнформации, "", ТипКонтактнойИнформации);
Иначе
УправлениеКонтактнойИнформациейЛокализация.ПриКонвертацииФаксаВОбъектXDTO("", ЗначениеКонтактнойИнформации, "", ТипКонтактнойИнформации);
КонецЕсли;
УправлениеКонтактнойИнформацией.УстановитьКомментарийКонтактнойИнформации(ЗначениеКонтактнойИнформации, Комментарий);
ЗначениеКонтактнойИнформации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(ЗначениеКонтактнойИнформации);
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначениеКонтактнойИнформации) Тогда
УправлениеКонтактнойИнформацией.УстановитьКомментарийКонтактнойИнформации(ЗначениеКонтактнойИнформации, Комментарий);
КонецЕсли;
Возврат Новый Структура("КонтактнаяИнформация, Представление, Комментарий",
ЗначениеКонтактнойИнформации, Параметры.Представление, Комментарий);
КонецФункции
&НаСервере
Процедура ЗначениеРеквизитовПоКонтактнойИнформации(РедактируемаяИнформация)
Представление = РедактируемаяИнформация.Value;
Комментарий = РедактируемаяИнформация.Comment;
КопияКомментария = Комментарий;
Если ВводитьНомерПоМаске Тогда
НомерТелефонаПоМаске = РедактируемаяИнформация.Value;
Иначе
КодСтраны = РедактируемаяИнформация.CountryCode;
КодГорода = РедактируемаяИнформация.AreaCode;
НомерТелефона = РедактируемаяИнформация.Number;
Добавочный = РедактируемаяИнформация.ExtNumber;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция КонтактнаяИнформацияПоЗначениюРеквизитов()
Результат = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(ТипКонтактнойИнформации);
Если ВводитьНомерПоМаске Тогда
ДанныеКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияПоПредставлению(НомерТелефонаПоМаске, ВидКонтактнойИнформации);
Результат.CountryCode = ДанныеКонтактнойИнформации.CountryCode;
Результат.AreaCode = ДанныеКонтактнойИнформации.AreaCode;
Результат.Number = ДанныеКонтактнойИнформации.Number;
Результат.ExtNumber = ДанныеКонтактнойИнформации.ExtNumber;
Результат.Value = НомерТелефонаПоМаске;
Иначе
Результат.CountryCode = КодСтраны;
Результат.AreaCode = КодГорода;
Результат.Number = НомерТелефона;
Результат.ExtNumber = Добавочный;
Результат.Value = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПредставлениеТелефона(КодСтраны, КодГорода, НомерТелефона, Добавочный, "");
КонецЕсли;
Результат.Comment = Комментарий;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ЗаполнитьПредставлениеТелефона()
ПодключитьОбработчикОжидания("ЗаполнитьПредставлениеТелефонаСейчас", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПредставлениеТелефонаСейчас()
Представление = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПредставлениеТелефона(КодСтраны,
КодГорода, НомерТелефона, Добавочный, "");
КонецПроцедуры
&НаКлиенте
Процедура СообщитьОбОшибкахЗаполнения(СписокОшибок)
Если СписокОшибок.Количество()=0 Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Телефон введен корректно.'"));
Возврат;
КонецЕсли;
ОчиститьСообщения();
Для Каждого Элемент Из СписокОшибок Цикл
ОбщегоНазначенияКлиент.СообщитьПользователю(Элемент.Представление,,,
ПутьКДаннымФормыПоПутиXPath(Элемент.Значение));
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция ПутьКДаннымФормыПоПутиXPath(ПутьXPath)
Возврат ПутьXPath;
КонецФункции
&НаСервере
Процедура ОчиститьТелефонСервер()
КодСтраны = "";
КодГорода = "";
НомерТелефона = "";
Добавочный = "";
Комментарий = "";
Представление = "";
НомерТелефонаПоМаске = "";
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Функция ОпределитьЗначениеКонтактнойИнформации(Параметры)
Если ЗначениеЗаполнено(Параметры.Значение) Тогда
ЗначенияПолей = Параметры.Значение;
Иначе
ЗначенияПолей = Параметры.ЗначенияПолей;
КонецЕсли;
Возврат ЗначенияПолей;
КонецФункции
#КонецОбласти