Files
SSL/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl
T
2019-05-30 00:58:00 +03:00

5500 lines
443 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) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
////////////////////////////////////////////////////////////////////////////////
// Добавление, изменение и получение контактной информации.
// Возвращает таблицу, содержащую контактную информацию нескольких объектов.
//
// Параметры:
// СсылкиИлиОбъекты - Массив - владельцы контактной информации.
// ТипыКонтактнойИнформации - Массив, ПеречислениеСсылка.ТипыКонтактнойИнформации - Если указаны, то будет получена
// контактная информация только этих типов.
// ВидыКонтактнойИнформации - Массив, СправочникСсылка.ВидыКонтактнойИнформации - Если указаны, то будет возвращена
// контактная информация только этих видов контактной информации.
// Дата - Дата - необязательный, дата с которой действует запись контактной информации,
// используется при хранении истории изменения контактной информации.
// Если владелец хранит историю изменений, то при несоответствии параметра
// дате будет вызвано исключение.
//
// Возвращаемое значение:
// ТаблицаЗначений - таблица с контактной информацией объектов содержащая колонки:
// * СсылкиИлиОбъекты - Ссылка - Владелец контактной информации.
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации.
// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации.
// * Значение - Строка - контактная информация во внутреннем формате JSON.
// * Представление - Строка - Представление контактной информации.
// * Дата - Дата - Дата, с которой действует запись контактной информации.
// * ИдентификаторСтрокиТабличнойЧасти - Число - Идентификатор строки этой табличной части
// * ЗначенияПолей - Строка - устаревший XML, соответствующий XDTO пакетам КонтактнаяИнформация или Адрес. Для
// обратной совместимости.
//
Функция КонтактнаяИнформацияОбъектов(СсылкиИлиОбъекты, Знач ТипыКонтактнойИнформации = Неопределено, Знач ВидыКонтактнойИнформации = Неопределено, Дата = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Если ТипЗнч(ТипыКонтактнойИнформации) = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда
ТипыКонтактнойИнформации = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ТипыКонтактнойИнформации);
КонецЕсли;
Если ТипЗнч(ВидыКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
ВидыКонтактнойИнформации = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ВидыКонтактнойИнформации);
КонецЕсли;
СоздатьВТКонтактнаяИнформация(Запрос.МенеджерВременныхТаблиц, СсылкиИлиОбъекты, ТипыКонтактнойИнформации, ВидыКонтактнойИнформации, Дата);
Если ТипЗнч(Дата) = Тип("Дата") Тогда
ДействуетС = "КонтактнаяИнформация.ДействуетС";
Иначе
ДействуетС = "ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)";
КонецЕсли;
Запрос.Текст =
"ВЫБРАТЬ
| КонтактнаяИнформация.Объект КАК Объект,
| КонтактнаяИнформация.Вид КАК Вид,
| КонтактнаяИнформация.Тип КАК Тип,
| КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей,
| КонтактнаяИнформация.Значение КАК Значение,
| КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти КАК ИдентификаторСтрокиТабличнойЧасти,
| " + ДействуетС +" КАК Дата,
| КонтактнаяИнформация.Представление КАК Представление
|ИЗ
| ВТКонтактнаяИнформация КАК КонтактнаяИнформация";
Результат = Запрос.Выполнить().Выгрузить();
Для каждого СтрокаКонтактнойИнформации Из Результат Цикл
Если ПустаяСтрока(СтрокаКонтактнойИнформации.Значение)
И ЗначениеЗаполнено(СтрокаКонтактнойИнформации.ЗначенияПолей) Тогда
СтрокаКонтактнойИнформации.Значение = КонтактнаяИнформацияВJSON(СтрокаКонтактнойИнформации.ЗначенияПолей, СтрокаКонтактнойИнформации.Тип);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Возвращает таблицу, содержащую контактную информацию объекта.
// Поведение, при котором возвращалось представление контактной информации, теперь считается устаревшим
// и сохранено для обратной совместимости. Для получения представления контактной информации рекомендуется
// использовать функцию ПредставлениеКонтактнойИнформацииОбъекта.
//
// Параметры:
// СсылкаИлиОбъект - ЛюбаяСсылка, Объект - Ссылка или объект-владелец контактной информации (организация,
// контрагент, партнер и т.д.).
// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Необязательный, отбор по виду контактной информации.
// Дата - Дата - дата с которой действует запись контактной информации.
// Если объект-владелец допускает хранение истории изменения контактной информации,
// признаком которого является наличие колонки ДействуетС в табличной части КонтактнаяИнформация,
// то необходимо обязательно передавать дату, в противном случае будет вызвано исключение.
// ТолькоПредставление - Булево - Если Истина, то возвращает только представление, иначе таблицу значений.
// Для получения представления рекомендуется использовать функцию ПредставлениеКонтактнойИнформацииОбъекта.
//
// Возвращаемое значение:
// ТаблицаЗначений - таблица с контактной информацией объекта содержащая колонки:
// * СсылкиИлиОбъекты - Ссылка - Владелец контактной информации.
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации.
// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации.
// * Значение - Строка - контактная информация во внутреннем формате JSON.
// * Представление - Строка - Представление контактной информации.
// * Дата - Дата - дата, с которой действует запись контактной информации.
// * ИдентификаторСтрокиТабличнойЧасти - Число - Идентификатор строки этой табличной части
// * ЗначенияПолей - Строка - устаревший XML, соответствующий XDTO пакетам КонтактнаяИнформация или Адрес. Для
// обратной совместимости.
//
Функция КонтактнаяИнформацияОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации = Неопределено, Дата = Неопределено, ТолькоПредставление = Истина) Экспорт
ТипОбъекта = ТипЗнч(СсылкаИлиОбъект);
Если НЕ ОбщегоНазначения.ЭтоСсылка(ТипОбъекта) Тогда
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипОбъекта);
Результат = НоваяКонтактнаяИнформация();
Если МетаданныеОбъекта <> Неопределено
И МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") <> Неопределено Тогда
Для каждого СтрокаКонтактнойИнформации Из СсылкаИлиОбъект.КонтактнаяИнформация Цикл
Если ВидКонтактнойИнформации = Неопределено
ИЛИ СтрокаКонтактнойИнформации.Вид = ВидКонтактнойИнформации Тогда
НоваяСтрока = Результат.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКонтактнойИнформации);
Если ПустаяСтрока(НоваяСтрока.Значение)
И ЗначениеЗаполнено(НоваяСтрока.ЗначенияПолей) Тогда
НоваяСтрока.Значение = КонтактнаяИнформацияВJSON(НоваяСтрока.ЗначенияПолей, СтрокаКонтактнойИнформации.Тип);
КонецЕсли;
НоваяСтрока.Объект = СсылкаИлиОбъект;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ТолькоПредставление Тогда
Если Результат.Количество() > 0 Тогда
Возврат Результат[0].Представление;
КонецЕсли;
Возврат "";
КонецЕсли;
Возврат Результат;
КонецЕсли;
Если ТолькоПредставление Тогда
// Оставлено для обратной совместимости.
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаИлиОбъект.Ссылка);
Если НЕ ЗначениеЗаполнено(ВидКонтактнойИнформации) Тогда
Возврат "";
КонецЕсли;
КонтактнаяИнформацияОбъекта = КонтактнаяИнформацияОбъектов(МассивОбъектов,, ВидКонтактнойИнформации, Дата);
Если КонтактнаяИнформацияОбъекта.Количество() > 0 Тогда
Возврат КонтактнаяИнформацияОбъекта[0].Представление;
КонецЕсли;
Возврат "";
Иначе
СсылкиИлиОбъекты = Новый Массив;
СсылкиИлиОбъекты.Добавить(СсылкаИлиОбъект);
Если ТипЗнч(ВидКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
ВидыКонтактнойИнформации = Новый Массив;
ВидыКонтактнойИнформации.Добавить(ВидКонтактнойИнформации);
ТипыКонтактнойИнформации = Новый Массив;
ТипыКонтактнойИнформации.Добавить(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидКонтактнойИнформации, "Тип"));
Иначе
ВидыКонтактнойИнформации = Неопределено;
КонецЕсли;
Возврат КонтактнаяИнформацияОбъектов(СсылкиИлиОбъекты, ТипыКонтактнойИнформации, ВидыКонтактнойИнформации, Дата);
КонецЕсли;
КонецФункции
// Возвращает представление контактной информации объекта.
//
// Параметры:
// СсылкаИлиОбъект - Произвольный - Владелец контактной информации.
// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации.
// Разделитель - Строка - Разделитель, который добавляется в представление между записями контактной информации.
// По умолчанию это запятая с последующим пробелом, для исключения
// пробела необходимо использовать признак БезПробелов у параметра ДополнительныеПараметры.
// Дата - Дата - дата, с которой действует запись контактной информации. Если контактная информация
// хранит историю изменения, то передача даты обязательна.
// ДополнительныеПараметры - Структура - Необязательные параметры для формирования представления контактной информации.
// * ТолькоПервая - Булево - Если Истина, то будет возвращено представление только основной(первой) записи
// контактной информации. По умолчанию - Ложь;
// * БезПробелов - Булево - Если Истина, то после разделителя не будет автоматически добавляться пробел.
// По умолчанию - Ложь;
//
// Возвращаемое значение:
// Строка - Сформированное представление контактной информации.
//
Функция ПредставлениеКонтактнойИнформацииОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации, Разделитель = ",", Дата = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
ТолькоПервая = Ложь;
БезПробелов = Ложь;
Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
Если ДополнительныеПараметры.Свойство("ТолькоПервая") Тогда
ТолькоПервая = ДополнительныеПараметры.ТолькоПервая;
КонецЕсли;
Если ДополнительныеПараметры.Свойство("БезПробелов") Тогда
БезПробелов = ДополнительныеПараметры.БезПробелов;
КонецЕсли;
КонецЕсли;
РазделительВПредставлении = ?(БезПробелов, Разделитель, Разделитель + " ");
ПервыйПроход = Истина;
КонтактнаяИнформация = КонтактнаяИнформацияОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации, Дата, Ложь);
Если ТипЗнч(КонтактнаяИнформация) = Тип("ТаблицаЗначений") Тогда
Для каждого ЗаписьКонтактнойИнформации Из КонтактнаяИнформация Цикл
Если ПервыйПроход Тогда
Представление = ЗаписьКонтактнойИнформации.Представление;
Если ТолькоПервая Тогда
Возврат Представление;
КонецЕсли;
ПервыйПроход = Ложь;
Иначе
Представление = Представление + РазделительВПредставлении + ЗаписьКонтактнойИнформации.Представление;
КонецЕсли;
КонецЦикла;
Иначе
Представление = КонтактнаяИнформация;
КонецЕсли;
Возврат Представление;
КонецФункции
// Формирует новую таблицу контактной информации.
//
// Параметры:
// КолонкаОбъект - Булево - Если Истина, то таблица будет содержать колонку "Объект".
// Это нужно, если в таблице необходимо хранить контактной информацию для нескольких объектов.
//
// Возвращаемое значение:
// ТаблицаЗначений - с колонками:
// * Объект - ЛюбаяСсылка - владелец контактной информации.
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации.
// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации.
// * Значение - Строка - JSON, соответствующий структуре контактной информации.
// * ЗначенияПолей - Строка - XML, соответствующий XDTO пакету КонтактнаяИнформация или Адрес.
// * Представление - Строка - представление контактной информации.
// * Дата - Дата - дата, с которой действует запись контактной информации.
// * ИдентификаторСтрокиТабличнойЧасти - Число - идентификатор строки этой табличной части
//
Функция НоваяКонтактнаяИнформация(КолонкаОбъект = Истина) Экспорт
КонтактнаяИнформация = Новый ТаблицаЗначений;
ОписаниеТиповСтрока1500 = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(1500));
Если КолонкаОбъект Тогда
КонтактнаяИнформация.Колонки.Добавить("Объект");
КонецЕсли;
КонтактнаяИнформация.Колонки.Добавить("Представление", ОписаниеТиповСтрока1500);
КонтактнаяИнформация.Колонки.Добавить("ЗначенияПолей", Новый ОписаниеТипов("Строка"));
КонтактнаяИнформация.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка"));
КонтактнаяИнформация.Колонки.Добавить("Вид", Новый ОписаниеТипов("СправочникСсылка.ВидыКонтактнойИнформации"));
КонтактнаяИнформация.Колонки.Добавить("Тип", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации"));
КонтактнаяИнформация.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
КонтактнаяИнформация.Колонки.Добавить("ИдентификаторСтрокиТабличнойЧасти", Новый ОписаниеТипов("Число"));
Возврат КонтактнаяИнформация;
КонецФункции
// Добавляет контактную информацию к объекту по представлению или JSON.
//
// Параметры:
// СсылкаИлиОбъект - Произвольный - ссылка или объект владельца содержащего контактную информацию.
// Для ссылки после добавления контактной информации владелец будет записан.
// Если передан объект, то контактная информация будет добавлена без записи.
// Для сохранения изменений объект необходимо будет записать отдельно.
// ЗначениеИлиПредставление - Строка - представление, JSON или XML соответствующее XDTO-пакету КонтактнаяИнформация
// или Адрес.
// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Вид добавляемой контактной информации.
// Дата - Дата - дата, с которой будет действовать запись контактной информации.
// Требуется для контактной информации, у которой хранится история изменений.
// Если значение не указано, то принимается текущая дата сеанса.
// Замещать - Булево - если Истина(по умолчанию), то будет заменена вся контактная информация по
// переданному виду контактной информации.
// Если Ложь, то запись будет добавлена. Если вид контактной информации не разрешает
// ввод нескольких значений, а контактная информация объекта уже содержит запись,
// то запись не будет добавлена.
//
Процедура ДобавитьКонтактнуюИнформацию(СсылкаИлиОбъект, ЗначениеИлиПредставление, ВидКонтактнойИнформации, Дата = Неопределено, Замещать = Истина) Экспорт
Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(СсылкаИлиОбъект)) Тогда
Объект = СсылкаИлиОбъект.ПолучитьОбъект();
Записывать = Истина;
Иначе
Объект = СсылкаИлиОбъект;
Записывать = Ложь;
КонецЕсли;
КонтактнаяИнформация = Объект.КонтактнаяИнформация;
ЭтоКонтактнаяИнформацияВXML = УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначениеИлиПредставление);
ЭтоКонтактнаяИнформацияВJSON = УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(ЗначениеИлиПредставление);
ЭтоКонтактнаяИнформацияВСтруктуреJSON = ТипЗнч(ЗначениеИлиПредставление) = Тип("Структура");
СвойстваВидаКонтактнойИнформации = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидКонтактнойИнформации, "Тип, ХранитьИсториюИзменений");
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
Если МетаданныеОбъекта = Неопределено
Или МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Добавление контактной информации невозможно, у объекта нет таблицы с контактной информацией.'");;
КонецЕсли;
Если ЭтоКонтактнаяИнформацияВСтруктуреJSON Тогда
ОбъектКонтактнойИнформации = ЗначениеИлиПредставление;
Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(ЗначениеИлиПредставление);
ЗначенияПолей = КонтактнаяИнформацияВXML(Значение);
Представление = ОбъектКонтактнойИнформации.Value;
Иначе
Если ЭтоКонтактнаяИнформацияВXML Тогда
ЗначенияПолей = ЗначениеИлиПредставление;
Значение = КонтактнаяИнформацияВJSON(ЗначениеИлиПредставление, СвойстваВидаКонтактнойИнформации.Тип);
ОбъектКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Значение, СвойстваВидаКонтактнойИнформации.Тип);
Представление = ОбъектКонтактнойИнформации.Value;
ИначеЕсли ЭтоКонтактнаяИнформацияВJSON Тогда
Значение = ЗначениеИлиПредставление;
ЗначенияПолей = КонтактнаяИнформацияВXML(Значение,, СвойстваВидаКонтактнойИнформации.Тип);
ОбъектКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Значение, СвойстваВидаКонтактнойИнформации.Тип);
Представление = ПредставлениеКонтактнойИнформации(ЗначениеИлиПредставление, ВидКонтактнойИнформации);
Иначе
ОбъектКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияПоПредставлению(ЗначениеИлиПредставление, СвойстваВидаКонтактнойИнформации.Тип);
Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(ОбъектКонтактнойИнформации);
ЗначенияПолей = КонтактнаяИнформацияВXML(Значение);
Представление = ЗначениеИлиПредставление;
КонецЕсли;
КонецЕсли;
Если Замещать Тогда
НайденныеСтроки = НайтиСтрокиКонтактнойИнформации(ВидКонтактнойИнформации, Дата, КонтактнаяИнформация);
Для Каждого СтрокаТабличнойЧасти Из НайденныеСтроки Цикл
КонтактнаяИнформация.Удалить(СтрокаТабличнойЧасти);
КонецЦикла;
СтрокаКонтактнойИнформации = КонтактнаяИнформация.Добавить();
Иначе
Если ЗапрещенВводНесколькихЗначений(ВидКонтактнойИнформации, КонтактнаяИнформация, Дата) Тогда
Если ЭтоКонтактнаяИнформацияВXML Тогда
СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Найти(ЗначениеИлиПредставление, "ЗначенияПолей");
ИначеЕсли ЭтоКонтактнаяИнформацияВJSON Тогда
СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Найти(ЗначениеИлиПредставление, "Значение");
Иначе
СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Найти(ЗначениеИлиПредставление, "Представление");
КонецЕсли;
Если СтрокаКонтактнойИнформации <> Неопределено Тогда
Возврат; // Допускается только одно значение этого вида контактной информации.
КонецЕсли;
КонецЕсли;
СтрокаКонтактнойИнформации = КонтактнаяИнформация.Добавить();
КонецЕсли;
СтрокаКонтактнойИнформации.Значение = Значение;
СтрокаКонтактнойИнформации.Представление = Представление;
СтрокаКонтактнойИнформации.ЗначенияПолей = ЗначенияПолей;
СтрокаКонтактнойИнформации.Вид = ВидКонтактнойИнформации;
СтрокаКонтактнойИнформации.Тип = СвойстваВидаКонтактнойИнформации.Тип ;
Если СвойстваВидаКонтактнойИнформации.ХранитьИсториюИзменений И ЗначениеЗаполнено(Дата) Тогда
СтрокаКонтактнойИнформации.ДействуетС = Дата;
КонецЕсли;
ЗаполнитьТехническиеПоляКонтактнойИнформации(СтрокаКонтактнойИнформации, ОбъектКонтактнойИнформации, СвойстваВидаКонтактнойИнформации.Тип);
Если Записывать Тогда
Объект.Записать();
КонецЕсли;
КонецПроцедуры
// Добавляет или изменяет контактную информацию для нескольких владельцев контактной информации.
//
// Параметры:
// КонтактнаяИнформация - ТаблицаЗначений - Таблица содержащая контактную информацию
// Описание колонок см. функцию НоваяКонтактнаяИнформация.
// Важно! Если в колонке Объект указана ссылка, то после добавления
// контактной информации владелец будет записан.
// В случае, если колонка Объект содержит объект владельца контактной информации,
// то для сохранения изменений объекты необходимо будет записать отдельно.
// Замещать - Булево - Если Истина(по умолчанию), то будет заменена вся
// вся контактная информация по переданном виду контактной информации.
// Если Ложь, то запись будет добавлена. Если вид контактной информации не разрешает
// ввод нескольких значений, а контактная информация объекта уже содержит запись,
// то запись не будет добавлена.
//
Процедура УстановитьКонтактнуюИнформациюОбъектов(КонтактнаяИнформация, Замещать = Истина) Экспорт
Если КонтактнаяИнформация.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ВладельцыКонтактнойИнформации = Новый Соответствие;
Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл
ПараметрыКонтактнойИнформации = ВладельцыКонтактнойИнформации[СтрокаКонтактнойИнформации.Объект];
Если ПараметрыКонтактнойИнформации = Неопределено Тогда
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(СтрокаКонтактнойИнформации.Объект));
Если МетаданныеОбъекта = Неопределено
Или МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Добавление контактной информации невозможно, у объекта нет таблицы с контактной информацией.'");;
КонецЕсли;
ПараметрыКонтактнойИнформации = Новый Структура;
ЭтоСсылка = ОбщегоНазначения.ЗначениеСсылочногоТипа(СтрокаКонтактнойИнформации.Объект);
ПараметрыКонтактнойИнформации.Вставить("ЭтоСсылка", ЭтоСсылка);
ПараметрыКонтактнойИнформации.Вставить("Периодическая", МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено);
ВладельцыКонтактнойИнформации.Вставить(СтрокаКонтактнойИнформации.Объект, ПараметрыКонтактнойИнформации);
КонецЕсли;
ВосстановитьПустыеЗначениеПредставление(СтрокаКонтактнойИнформации);
КонецЦикла;
Для каждого ВладелецКонтактнойИнформации Из ВладельцыКонтактнойИнформации Цикл
Отбор = Новый Структура("Объект", ВладелецКонтактнойИнформации.Ключ);
СтрокиКонтактнойИнформацииОбъекта = КонтактнаяИнформация.НайтиСтроки(Отбор);
Если ВладелецКонтактнойИнформации.Значение["ЭтоСсылка"] Тогда
Объект = ВладелецКонтактнойИнформации.Ключ.ПолучитьОбъект();
Иначе
Объект = ВладелецКонтактнойИнформации.Ключ;
КонецЕсли;
Если Замещать Тогда
Объект.КонтактнаяИнформация.Очистить();
КонецЕсли;
Для каждого СтрокаКонтактнойИнформацииОбъекта Из СтрокиКонтактнойИнформацииОбъекта Цикл
ХранитьИсториюИзменений = ВладелецКонтактнойИнформации.Значение["Периодическая"] И СтрокаКонтактнойИнформацииОбъекта.Вид.ХранитьИсториюИзменений;
Если Замещать Тогда
Если ЗапрещенВводНесколькихЗначений(СтрокаКонтактнойИнформацииОбъекта.Вид, Объект.КонтактнаяИнформация, СтрокаКонтактнойИнформацииОбъекта.Дата) Тогда
Продолжить;
КонецЕсли;
СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Добавить();
Иначе
Отбор = Новый Структура();
Отбор.Вставить("Вид", СтрокаКонтактнойИнформацииОбъекта.Вид);
Если ХранитьИсториюИзменений Тогда
Отбор.Вставить("ДействуетС", СтрокаКонтактнойИнформацииОбъекта.Дата);
НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор);
ИначеЕсли ЗначениеЗаполнено(СтрокаКонтактнойИнформацииОбъекта.Значение) Тогда
Отбор.Вставить("Значение", СтрокаКонтактнойИнформацииОбъекта.Значение);
НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор);
Иначе
Отбор.Вставить("ЗначенияПолей", СтрокаКонтактнойИнформацииОбъекта.ЗначенияПолей);
НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор);
КонецЕсли;
Если НЕ ХранитьИсториюИзменений
И ЗапрещенВводНесколькихЗначений(СтрокаКонтактнойИнформацииОбъекта.Вид, Объект.КонтактнаяИнформация, СтрокаКонтактнойИнформацииОбъекта.Дата)
ИЛИ НайденныеСтроки.Количество() > 0 Тогда
Продолжить;
КонецЕсли;
СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Добавить();
КонецЕсли;
ЗаполнитьКонтактнуюИнформациюОбъектаИзСтроки(СтрокаКонтактнойИнформацииОбъекта, ХранитьИсториюИзменений, СтрокаКонтактнойИнформации);
КонецЦикла;
Если ВладелецКонтактнойИнформации.Значение["ЭтоСсылка"] Тогда
Объект.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Добавляет или изменяет контактную информацию у владельца контактной информации.
//
// Параметры:
// СсылкаИлиОбъект - Произвольный - ссылка или объект владелец контактной информации.
// Для ссылки после добавления контактной информации владелец будет записан.
// Если передан объект, то контактная информация будет добавлена без записи.
// Для сохранения изменений объект необходимо будет записать отдельно.
// КонтактнаяИнформация - ТаблицаЗначений - таблица, содержащая контактную информацию
// Описание колонок см. функцию НоваяКонтактнаяИнформация.
// Важно! Если передана пустая таблица значений и указан режим замещения, то
// произойдет очистка всей контактной информации владельца контактной информации.
// Замещать - Булево - Если Истина(по умолчанию), то будет заменена
// вся контактная информация по переданном виду контактной информации.
// Если Ложь, то запись будет добавлена. Если вид контактной информации
// не разрешает ввод нескольких значений, а контактная информация объекта
// уже содержит запись, то запись не будет добавлена.
//
Процедура УстановитьКонтактнуюИнформациюОбъекта(СсылкаИлиОбъект, Знач КонтактнаяИнформация, Замещать = Истина) Экспорт
ЭтоСсылка = ОбщегоНазначения.ЗначениеСсылочногоТипа(СсылкаИлиОбъект);
Объект =?(ЭтоСсылка, СсылкаИлиОбъект.ПолучитьОбъект(), СсылкаИлиОбъект);
Если ТипЗнч(СсылкаИлиОбъект) <> Тип("ДанныеФормыСтруктура") Тогда
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(СсылкаИлиОбъект));
Иначе
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(СсылкаИлиОбъект.Ссылка));
КонецЕсли;
Если МетаданныеОбъекта = Неопределено
Или МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Добавление контактной информации невозможно, у объекта нет таблицы с контактной информацией.'");;
КонецЕсли;
// Очистка контактной информации пустой таблицей.
Если КонтактнаяИнформация.Количество() = 0 Тогда
Если Замещать Тогда
Объект.КонтактнаяИнформация.Очистить();
Если ЭтоСсылка Тогда
Объект.Записать();
КонецЕсли;
КонецЕсли;
Возврат;
КонецЕсли;
Периодическая = МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено;
БезИдентификатораТабличнойЧасти = МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ИдентификаторСтрокиТабличнойЧасти") = Неопределено;
Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл
ВосстановитьПустыеЗначениеПредставление(СтрокаКонтактнойИнформации);
КонецЦикла;
Если Замещать Тогда
Для каждого СтрокаКонтактнойИнформацииОбъекта Из КонтактнаяИнформация Цикл
ДатаОтбора = ?(Периодическая, СтрокаКонтактнойИнформацииОбъекта.Дата, Неопределено);
НайденныеСтроки = НайтиСтрокиКонтактнойИнформации(СтрокаКонтактнойИнформацииОбъекта.Вид, ДатаОтбора, Объект.КонтактнаяИнформация);
Для каждого Строка Из НайденныеСтроки Цикл
Объект.КонтактнаяИнформация.Удалить(Строка);
КонецЦикла;
КонецЦикла;
КонецЕсли;
Для каждого СтрокаКонтактнойИнформацииОбъекта Из КонтактнаяИнформация Цикл
ХранитьИсториюИзменений = Периодическая И СтрокаКонтактнойИнформацииОбъекта.Вид.ХранитьИсториюИзменений;
Если Замещать Тогда
ИдентификаторСтрокиТабличнойЧасти = ?(БезИдентификатораТабличнойЧасти, Неопределено, СтрокаКонтактнойИнформацииОбъекта.ИдентификаторСтрокиТабличнойЧасти);
Если ЗапрещенВводНесколькихЗначений(СтрокаКонтактнойИнформацииОбъекта.Вид, Объект.КонтактнаяИнформация, СтрокаКонтактнойИнформацииОбъекта.Дата, ИдентификаторСтрокиТабличнойЧасти) Тогда
Продолжить;
КонецЕсли;
СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Добавить();
Иначе
Отбор = Новый Структура();
Отбор.Вставить("Вид", СтрокаКонтактнойИнформацииОбъекта.Вид);
Если ХранитьИсториюИзменений Тогда
Отбор.Вставить("ДействуетС", СтрокаКонтактнойИнформацииОбъекта.Дата);
НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор);
ИначеЕсли ЗначениеЗаполнено(СтрокаКонтактнойИнформацииОбъекта.Значение) Тогда
Отбор.Вставить("Значение", СтрокаКонтактнойИнформацииОбъекта.Значение);
НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор);
Иначе
Отбор.Вставить("ЗначенияПолей", СтрокаКонтактнойИнформацииОбъекта.ЗначенияПолей);
НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор);
КонецЕсли;
Если НЕ ХранитьИсториюИзменений
И ЗапрещенВводНесколькихЗначений(СтрокаКонтактнойИнформацииОбъекта.Вид, Объект.КонтактнаяИнформация, СтрокаКонтактнойИнформацииОбъекта.Дата)
ИЛИ НайденныеСтроки.Количество() > 0 Тогда
Продолжить;
КонецЕсли;
СтрокаКонтактнойИнформации = Объект.КонтактнаяИнформация.Добавить();
КонецЕсли;
ЗаполнитьКонтактнуюИнформациюОбъектаИзСтроки(СтрокаКонтактнойИнформацииОбъекта, ХранитьИсториюИзменений, СтрокаКонтактнойИнформации);
КонецЦикла;
Если ЭтоСсылка Тогда
Объект.Записать();
КонецЕсли;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Работа с контактной информацией из других подсистем.
// Преобразует входящие форматы контактной информации во внутренний формат JSON.
//
// Параметры:
// КонтактнаяИнформация - Строка - строка в формате XML. Структура XML-документа соответствует XDTO-пакету КонтактнаяИнформация
// или Адрес (для адресов содержащих поля с национальной спецификой).
// Если передана строка во внутреннем формате JSON, то возвращаемое значение будет
// полностью совпадать с ней.
// - Структура - см. УправлениеКонтактнойИнформациейКлиентСервер.СтруктураКонтактнойИнформацииПоТипу.
// см. РаботаСАдресами.ПоляАдреса (для адресов содержащих поля с национальной спецификой),
// см. РаботаСАдресамиКлиентСервер.СтруктураКонтактнойИнформацииПоТипу
// (для других типов контактной информации содержащих поля с национальной спецификой).
// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации -
// используется для определения типа контактной информации, если его невозможно определить из
// переданной контактной информации в параметре КонтактнаяИнформация.
//
// Возвращаемое значение:
// Строка - контактная информация во внутреннем формате JSON.
// Поля и их описание см. УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации.
// Дополнительные поля для конфигурации с поддержкой национальной специфики см. РаботаСАдресамиКлиентСервер.ОписаниеНовойКонтактнойИнформации
//
Функция КонтактнаяИнформацияВJSON(Знач КонтактнаяИнформация, Знач ОжидаемыйВид = Неопределено) Экспорт
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда
Возврат КонтактнаяИнформация;
КонецЕсли;
КонтактнаяИнформацияПоПолям = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(КонтактнаяИнформация, ОжидаемыйВид,, Ложь);
Возврат УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(КонтактнаяИнформацияПоПолям);
КонецФункции
// Преобразует все входящие форматы контактной информации в XML.
//
// Параметры:
// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - описание полей контактной информации.
// XML должен соответствовать XDTO-пакету КонтактнаяИнформация или Адрес.
// Структура, Соответствие, СписокЗначений должен содержать поля в соответствии со структурой
// XDTO пакетов КонтактнаяИнформация или Адрес(для конфигурации с поддержкой специфики РФ).
// Представление - Строка - Представление контактной информации. Используется, если невозможно определить
// представление из параметра ЗначенияПолей (например, отсутствует поле Представление).
// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации -
// Используется для определения типа, если его невозможно вычислить по полю ЗначенияПолей.
//
// Возвращаемое значение:
// Строка - Контактная информация в виде XML, соответствующего структуре XDTO пакетов КонтактнаяИнформация и Адрес.
//
Функция КонтактнаяИнформацияВXML(Знач ЗначенияПолей, Знач Представление = "", Знач ОжидаемыйВид = Неопределено) Экспорт
Результат = УправлениеКонтактнойИнформациейСлужебный.ПривестиКонтактнуюИнформациюXML(Новый Структура(
"ЗначенияПолей, Представление, ВидКонтактнойИнформации",
ЗначенияПолей, Представление, ОжидаемыйВид));
Возврат Результат.ДанныеXML;
КонецФункции
// Возвращает тип контактной информации.
//
// Параметры:
// КонтактнаяИнформация - Строка - контактная информация в виде XML, соответствующего структуре XDTO-пакетов
// КонтактнаяИнформация и Адрес.
//
// Возвращаемое значение:
// ПеречислениеСсылка.ТипыКонтактнойИнформации - соответствующий тип.
//
Функция ТипКонтактнойИнформации(Знач КонтактнаяИнформация) Экспорт
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.СтрокуJSONВСтруктуру(КонтактнаяИнформация);
Если ТипЗнч(КонтактнаяИнформацияСтруктурой) = Тип("Структура") И КонтактнаяИнформацияСтруктурой.Свойство("type") Тогда
Возврат Перечисления.ТипыКонтактнойИнформации[КонтактнаяИнформацияСтруктурой.type];
КонецЕсли;
КонецЕсли;
Возврат УправлениеКонтактнойИнформациейСлужебный.ТипКонтактнойИнформации(КонтактнаяИнформация);
КонецФункции
// Преобразует представление контактной информации во внутренний формат JSON.
//
// Для адресов, введенных в свободной форме, корректное преобразование не гарантируется.
//
// Параметры:
// Представление - Строка - Строковое представление контактной информации, выводимое пользователю.
// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации,
// Структура - Вид или тип контактной информации.
//
// Возвращаемое значение:
// Строка - Контактная информация в виде JSON.
//
Функция КонтактнаяИнформацияПоПредставлению(Представление, ОжидаемыйВид) Экспорт
Возврат УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(
УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияПоПредставлению(Представление, ОжидаемыйВид));
КонецФункции
// Возвращает представление контактной информации (адреса, телефона, электронной почты и т.п.).
//
// Параметры:
// КонтактнаяИнформация - Строка - строка JSON или XML контактной информации соответствующая XDTO пакетам
// КонтактнаяИнформация или Адрес
// - ОбъектXDTO - XDTO-объект КонтактнаяИнформация или Адрес.
// - Структура - контактная информация с разбивкой по полям полученная функциями
// СведенияОбАдресе или СведенияОТелефоне.
// ВидКонтактнойИнформации - Структура - дополнительные параметры, влияющие на формирование представления адреса:
// * ВключатьСтрануВПредставление - Булево - в представление будет включена страна адреса;
// * ФорматАдреса - Строка - варианты: "ФИАС" или "КЛАДР".
// Если указано "КЛАДР", то в представление адреса
// не включаются значения уровней округ и внутригородской район.
//
// Возвращаемое значение:
// Строка - представление контактной информации.
//
Функция ПредставлениеКонтактнойИнформации(Знач КонтактнаяИнформация, Знач ВидКонтактнойИнформации = Неопределено) Экспорт
Возврат УправлениеКонтактнойИнформациейСлужебный.ПредставлениеКонтактнойИнформации(КонтактнаяИнформация, ВидКонтактнойИнформации);
КонецФункции
// Вычисляет, что адрес был введен в свободной форме.
//
// Параметры:
// КонтактнаяИнформация - Строка - Строка JSON или XML контактной информации, соответствующая XDTO-пакетам
// КонтактнаяИнформация или Адрес.
//
// Возвращаемое значение:
// Булево - новое значение.
//
Функция АдресВведенВСвободнойФорме(Знач КонтактнаяИнформация) Экспорт
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияJSON = КонтактнаяИнформацияВJSON(КонтактнаяИнформация);
КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(КонтактнаяИнформацияJSON, Перечисления.ТипыКонтактнойИнформации.Адрес);
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда
КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(КонтактнаяИнформация, Перечисления.ТипыКонтактнойИнформации.Адрес);
КонецЕсли;
Возврат УправлениеКонтактнойИнформациейКлиентСервер.ЭтоАдресВСвободнойФорме(КонтактнаяИнформация.AddressType);
КонецФункции
// Возвращает комментарий контактной информации.
//
// Параметры:
// КонтактнаяИнформация - Строка - Строка JSON или XML или объект XDTO, соответствующие XDTO-пакетам
// КонтактнаяИнформация или Адрес.
//
// Возвращаемое значение:
// Строка - комментарий контактной информации или пустая строка,
// если значение параметра не является контактной информацией.
//
Функция КомментарийКонтактнойИнформации(КонтактнаяИнформация) Экспорт
Если ПустаяСтрока(КонтактнаяИнформация) Тогда
Возврат "";
КонецЕсли;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(КонтактнаяИнформация);
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.СтрокуJSONВСтруктуру(КонтактнаяИнформация);
Иначе
КонтактнаяИнформацияВXML = КонтактнаяИнформацияВXML(КонтактнаяИнформация);
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(КонтактнаяИнформацияВXML);
КонецЕсли;
Если КонтактнаяИнформацияСтруктурой.Свойство("Comment") Тогда
Возврат КонтактнаяИнформацияСтруктурой.Comment;
КонецЕсли;
Возврат "";
КонецФункции
// Устанавливает новый комментарий для контактной информации.
//
// Параметры:
// КонтактнаяИнформация - Строка, ОбъектXDTO - строка JSON или XML контактной информации, соответствующая XDTO
// пакетам КонтактнаяИнформация или Адрес.
// Комментарий - Строка - новое значение комментария.
//
Процедура УстановитьКомментарийКонтактнойИнформации(КонтактнаяИнформация, Знач Комментарий) Экспорт
ЭтоСтрока = ТипЗнч(КонтактнаяИнформация) = Тип("Строка");
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.СтрокуJSONВСтруктуру(КонтактнаяИнформация);
Если ТипЗнч(КонтактнаяИнформацияСтруктурой) = Тип("Структура") И КонтактнаяИнформацияСтруктурой.Свойство("comment") Тогда
КонтактнаяИнформацияСтруктурой.comment = Комментарий;
КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(КонтактнаяИнформацияСтруктурой);
КонецЕсли;
Возврат;
ИначеЕсли ЭтоСтрока И Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(КонтактнаяИнформация) Тогда
// Предыдущий формат значений полей, комментарий отсутствует.
Возврат;
КонецЕсли;
ОбъектXDTO = ?(ЭтоСтрока, УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(КонтактнаяИнформация), КонтактнаяИнформация);
ОбъектXDTO.Комментарий = Комментарий;
Если ЭтоСтрока Тогда
КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTO);
КонецЕсли;
КонецПроцедуры
// Возвращает информацию о стране адреса.
// Если переданная строка не содержит информации об адресе, то будет вызвано исключение.
// Если передана пустая строка, то возвращается пустая структура.
// Если страна не найдена в справочнике, но найдена в классификаторе ОКСМ, то поле Ссылка результата не будет заполнено.
// Если страна не найдена ни в адресе, ни в классификаторе ОКСМ, то будет заполнено только поле Наименование.
//
// Параметры:
// Адрес - Структура, Строка - адрес в формате JSON или строка XML соответствующая XDTO-пакетам КонтактнаяИнформация
// или Адрес.
//
// Возвращаемое значение:
// Структура - описание страны адреса. Содержит поля:
// * Ссылка - СправочникСсылка.СтраныМира, Неопределено - Ссылка на элемент справочника страны мира.
// * Наименование - Строка - Наименование страны.
// * Код - Строка - Код страны.
// * НаименованиеПолное - Строка - Полное наименование страны.
// * КодАльфа2 - Строка - Двузначный буквенный код страны Альфа-2.
// * КодАльфа3 - Строка - Трехзначный буквенный код страны Альфа-3.
//
Функция СтранаАдресаКонтактнойИнформации(Знач Адрес) Экспорт
Результат = Новый Структура("Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3");
Если ТипЗнч(Адрес) = Тип("Строка") Тогда
Если ПустаяСтрока(Адрес) Тогда
Возврат Результат;
КонецЕсли;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Адрес) Тогда
Адрес = КонтактнаяИнформацияВJSON(Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес);
КонецЕсли;
Адрес = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Адрес, Перечисления.ТипыКонтактнойИнформации.Адрес);
ИначеЕсли ТипЗнч(Адрес) <> Тип("Структура") Тогда
ВызватьИсключение НСтр("ru = 'Невозможно определить страну, ожидается адрес.'");
КонецЕсли;
Результат.Наименование = СокрЛП(Адрес.Country);
ДанныеСтраны = ДанныеСтраныМира(, Результат.Наименование);
Возврат ?(ДанныеСтраны = Неопределено, Результат, ДанныеСтраны);
КонецФункции
// Возвращает домен сетевого адреса для веб-ссылки или адреса электронной почты.
//
// Параметры:
// КонтактнаяИнформация - Строка - Строка JSON или XML контактной информации соответствующая XDTO пакету КонтактнаяИнформация.
//
// Возвращаемое значение:
// Строка - Домен адреса.
//
Функция ДоменАдресаКонтактнойИнформации(Знач КонтактнаяИнформация) Экспорт
Если ПустаяСтрока(КонтактнаяИнформация) Тогда
Возврат "";
КонецЕсли;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(КонтактнаяИнформация);
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.СтрокуJSONВСтруктуру(КонтактнаяИнформация);
КонецЕсли;
Если КонтактнаяИнформацияСтруктурой.Свойство("Type") И КонтактнаяИнформацияСтруктурой.Свойство("Value") Тогда
ДоменАдреса = СокрЛП(КонтактнаяИнформацияСтруктурой.Value);
Если ТипКонтактнойИнформацииПоНаименованию(КонтактнаяИнформацияСтруктурой.Type) = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда
Позиция = СтрНайти(ДоменАдреса, "://");
Если Позиция > 0 Тогда
ДоменАдреса = Сред(ДоменАдреса, Позиция + 3);
КонецЕсли;
Позиция = СтрНайти(ДоменАдреса, "/");
Возврат ?(Позиция = 0, ДоменАдреса, Лев(ДоменАдреса, Позиция - 1));
ИначеЕсли ТипКонтактнойИнформацииПоНаименованию(КонтактнаяИнформацияСтруктурой.Type) = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
Позиция = СтрНайти(ДоменАдреса, "@");
Возврат ?(Позиция = 0, ДоменАдреса, Сред(ДоменАдреса, Позиция + 1));
КонецЕсли;
КонецЕсли;
ВызватьИсключение НСтр("ru = 'Невозможно определить домен, ожидается электронная почта или веб-ссылка.'");
КонецФункции
// Возвращает сведения о телефоне или факсе.
//
// Параметры:
// КонтактнаяИнформация - Строка - Телефон во внутреннем формате JSON или в XML, соответствующем XDTO-пакету контактная
// информация.
// - Неопределено - Конструктор, возвращает список незаполненных полей телефона.
//
// Возвращаемое значение:
// Структура - сведения о телефоне:
// * Представление - Строка - представление телефона.
// * КодСтраны - Строка - Код страны. Например, +7.
// * КодГорода - Строка - Код города. Например, 495.
// * НомерТелефона - Строка - Номер телефона.
// * Добавочный - Строка - Добавочный номер телефона.
// * Комментарий - Строка - Комментарий к номеру телефона.
//
Функция СведенияОТелефоне(КонтактнаяИнформация = Неопределено) Экспорт
Результат = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураПолейТелефона();
Если КонтактнаяИнформация = Неопределено Тогда
Возврат Результат;
КонецЕсли;
ТелефонПоПолям = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(КонтактнаяИнформация, Перечисления.ТипыКонтактнойИнформации.Телефон);
Результат.Представление = Строка(ТелефонПоПолям.Value);
Результат.КодСтраны = Строка(ТелефонПоПолям.CountryCode);
Результат.КодГорода = Строка(ТелефонПоПолям.AreaCode);
Результат.НомерТелефона = Строка(ТелефонПоПолям.Number);
Результат.Добавочный = Строка(ТелефонПоПолям.ExtNumber);
Результат.Комментарий = Строка(ТелефонПоПолям.Comment);
Возврат Результат;
КонецФункции
// Возвращает строку с номером телефона без кода и дополнительного номера.
//
// Параметры:
// КонтактнаяИнформация - Строка - Строка JSON или XML контактной информации соответствующая XDTO пакету КонтактнаяИнформация.
//
// Возвращаемое значение:
// Строка - Номер телефона.
//
Функция НомерТелефонаКонтактнойИнформации(Знач КонтактнаяИнформация) Экспорт
Если ПустаяСтрока(КонтактнаяИнформация) Тогда
Возврат "";
КонецЕсли;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(КонтактнаяИнформация);
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(КонтактнаяИнформация) Тогда
КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(КонтактнаяИнформация, Перечисления.ТипыКонтактнойИнформации.Телефон);
КонецЕсли;
Если КонтактнаяИнформацияСтруктурой.Свойство("Number") Тогда
Возврат СокрЛП(КонтактнаяИнформацияСтруктурой.Number);
КонецЕсли;
ВызватьИсключение НСтр("ru = 'Невозможно определить номер, ожидается телефона или факс.'");
КонецФункции
// Сравнивает два экземпляра контактной информации.
//
// Параметры:
// Данные1 - ОбъектXTDO - Объект с контактной информацией.
// - Строка - Контактная информация в формате XML.
// - Структура - Описание контактной информацию. Ожидаются поля:
// * ЗначенияПолей - Строка, Структура, СписокЗначений, Соответствие - поля контактной информации.
// * Представление - Строка - Представление. Используется в случае, если не удалось вычислить
// представление из ЗначенияПолей (отсутствие в них поля Представление).
// * Комментарий - Строка - комментарий. Используется в том случае, если не удалось вычислить комментарий
// из ЗначенияПолей.
// * ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации,
// ПеречислениеСсылка.ТипыКонтактнойИнформации, Структура -
// используется в том случае, если не удалось вычислить тип из ЗначенияПолей.
// Данные2 - ОбъектXTDO, Строка, Структура - аналогично Данные1.
//
// Возвращаемое значение:
// ТаблицаЗначений: - таблица отличающихся полей со следующими колонками:
// * Путь - Строка - XPath, идентифицирующий отличающееся значение. Значение "ТипКонтактнойИнформации"
// означает, что переданные экземпляры контактной информации различаются типом.
// * Описание - Строка - описание отличающегося реквизита в терминах предметной области.
// * Значение1 - Строка - значение, соответствующая объекту, переданному в параметре Данные1.
// * Значение2 - Строка - значение, соответствующая объекту, переданному в параметре Данные2.
//
Функция РазличияКонтактнойИнформации(Знач Данные1, Знач Данные2) Экспорт
Возврат УправлениеКонтактнойИнформациейСлужебный.РазличияКонтактнойИнформации(Данные1, Данные2);
КонецФункции
// Создает временную таблицу с контактной информацией нескольких объектов.
//
// Параметры:
// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - В менеджере создается временная таблица
// ВТКонтактнаяИнформация с полями:
// * Объект - Ссылка - владелец контактной информации.
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Ссылка на вид контактной информации.
// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации.
// * ЗначенияПолей - Строка - XML соответствующий XDTO пакету КонтактнаяИнформация или Адрес.
// * Представление - Строка - Представление контактной информации.
// МассивОбъектов - Массив - Владельцы контактной информации.
// ТипыКонтактнойИнформации - Массив - Если указаны, то временная таблица будет содержать только контактную
// информацию этих типов.
// ВидыКонтактнойИнформации - Массив - Если указаны, то временная таблица будет содержать только контактную
// информацию этих видов.
// Дата - Дата - Дата, с которой действует запись контактной информации, используется при
// хранении истории изменения контактной информации. Если владелец хранит историю
// изменений, то при несоответствии параметра дате будет вызвано исключение.
//
Процедура СоздатьВТКонтактнаяИнформация(МенеджерВременныхТаблиц, МассивОбъектов, ТипыКонтактнойИнформации = Неопределено, ВидыКонтактнойИнформации = Неопределено, Дата = Неопределено) Экспорт
Если ТипЗнч(МассивОбъектов) <> Тип("Массив") ИЛИ МассивОбъектов.Количество() = 0 Тогда
ВызватьИсключение НСтр("ru = 'Неверное значение для массива владельцев контактной информации.'");
КонецЕсли;
ОбъектыСГруппировкойПоТипам = Новый Соответствие;
Для каждого Ссылка Из МассивОбъектов Цикл
ТипОбъекта = ТипЗнч(Ссылка);
НайденныйОбъект = ОбъектыСГруппировкойПоТипам.Получить(ТипОбъекта);
Если НайденныйОбъект = Неопределено Тогда
НаборСсылок = Новый Массив;
НаборСсылок.Добавить(Ссылка);
ОбъектыСГруппировкойПоТипам.Вставить(ТипОбъекта, НаборСсылок);
Иначе
НайденныйОбъект.Добавить(Ссылка);
КонецЕсли;
КонецЦикла;
Запрос = Новый Запрос();
ТекстЗапросаПодготовкаДанных = "";
СтрокаРАЗРЕШЕННЫЕ = " РАЗРЕШЕННЫЕ ";
СтрокаВременнойТаблицы = "ПОМЕСТИТЬ ВТКонтактнаяИнформация";
Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектСКонтактнойИнформацией.Ключ);
Если МетаданныеОбъекта.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда
ВызватьИсключение МетаданныеОбъекта.Имя + " " + НСтр("ru = 'не содержит контактную информацию.'");
КонецЕсли;
ИмяТаблицы = МетаданныеОбъекта.Имя;
Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда
ТекстЗапросаПодготовкаДанных = ТекстЗапросаПодготовкаДанных + "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КонтактнаяИнформация.Ссылка КАК Объект,
| КонтактнаяИнформация.Вид КАК Вид,
| МАКСИМУМ(КонтактнаяИнформация.ДействуетС) КАК ДействуетС
|ПОМЕСТИТЬ СрезКонтактнойИнформации" + ИмяТаблицы + "
|ИЗ
| " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Ссылка В (&МассивОбъектов" + ИмяТаблицы + ")
| И КонтактнаяИнформация.ДействуетС <= &ДействуетС
| И КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка)
| И КонтактнаяИнформация.Тип <> ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка)
|
|СГРУППИРОВАТЬ ПО
| КонтактнаяИнформация.Вид, КонтактнаяИнформация.Ссылка
|;"
КонецЕсли;
КонецЦикла;
ТекстЗапроса = "";
Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл
ТекстЗапроса = ТекстЗапроса + ?(НЕ ПустаяСтрока(ТекстЗапроса), Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС, "");
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектСКонтактнойИнформацией.Ключ);
ИмяТаблицы = МетаданныеОбъекта.Имя;
ЕстьИдентификаторСтрокиТабличнойЧасти = МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ИдентификаторСтрокиТабличнойЧасти") <> Неопределено;
ТекстЗапросаИдентификаторСтрокиТабличнойЧасти = "";
Если ЕстьИдентификаторСтрокиТабличнойЧасти Тогда
ТекстЗапросаИдентификаторСтрокиТабличнойЧасти = "КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти КАК ИдентификаторСтрокиТабличнойЧасти";
Иначе
ТекстЗапросаИдентификаторСтрокиТабличнойЧасти = "0 КАК ИдентификаторСтрокиТабличнойЧасти";
КонецЕсли;
Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено Тогда
Если ТипЗнч(Дата) <> Тип("Дата") Тогда
ВызватьИсключение НСтр("ru = 'Для получения контактной информации, хранящей историю изменений,
|требуется указывать дату, с которой действует запись контактной информации.'");
КонецЕсли;
УсловияОтбора = ?(ВидыКонтактнойИнформации = Неопределено, "", " КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)");
Если ПустаяСтрока(УсловияОтбора) Тогда
УсловиеИ = "";
Иначе
УсловиеИ = " И ";
КонецЕсли;
УсловияОтбора = УсловияОтбора + ?(ТипыКонтактнойИнформации = Неопределено, "", УсловиеИ + " КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)");
Если НЕ ПустаяСтрока(УсловияОтбора) Тогда
УсловияОтбора = " ГДЕ " + УсловияОтбора;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + СтрокаРАЗРЕШЕННЫЕ + "
| КонтактнаяИнформация.Ссылка КАК Объект,
| КонтактнаяИнформация.Вид КАК Вид,
| КонтактнаяИнформация.Тип КАК Тип,
| КонтактнаяИнформация.ДействуетС КАК ДействуетС,
| КонтактнаяИнформация.Представление КАК Представление,
| КонтактнаяИнформация.Значение,
| КонтактнаяИнформация.ЗначенияПолей,
| " + ТекстЗапросаИдентификаторСтрокиТабличнойЧасти + "
| " + СтрокаВременнойТаблицы + "
|ИЗ
| СрезКонтактнойИнформации" + ИмяТаблицы + " КАК СрезКонтактнойИнформации
| ЛЕВОЕ СОЕДИНЕНИЕ " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО СрезКонтактнойИнформации.Вид = КонтактнаяИнформация.Вид
| И СрезКонтактнойИнформации.ДействуетС = КонтактнаяИнформация.ДействуетС
| И СрезКонтактнойИнформации.Объект = КонтактнаяИнформация.Ссылка " + УсловияОтбора;
Иначе
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + СтрокаРАЗРЕШЕННЫЕ + "
| КонтактнаяИнформация.Ссылка КАК Объект,
| КонтактнаяИнформация.Вид КАК Вид,
| КонтактнаяИнформация.Тип КАК Тип,
| ДАТАВРЕМЯ(1,1,1) КАК ДействуетС,
| КонтактнаяИнформация.Представление КАК Представление,
| КонтактнаяИнформация.Значение,
| КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей,
| " + ТекстЗапросаИдентификаторСтрокиТабличнойЧасти + "
| " + СтрокаВременнойТаблицы + "
|ИЗ
| " + МетаданныеОбъекта.ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка)
| И КонтактнаяИнформация.Тип <> ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка)
| И КонтактнаяИнформация.Ссылка В (&МассивОбъектов" + ИмяТаблицы + ")
| " + ?(ТипыКонтактнойИнформации = Неопределено, "", "И КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)") + "
| " + ?(ВидыКонтактнойИнформации = Неопределено, "", "И КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)") + "
|";
КонецЕсли;
СтрокаРАЗРЕШЕННЫЕ ="";
СтрокаВременнойТаблицы = "";
Запрос.УстановитьПараметр("МассивОбъектов" + ИмяТаблицы, ОбъектСКонтактнойИнформацией.Значение);
КонецЦикла;
Запрос.Текст = ТекстЗапросаПодготовкаДанных + ТекстЗапроса;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("ДействуетС", Дата);
Запрос.УстановитьПараметр("ТипыКонтактнойИнформации", ТипыКонтактнойИнформации);
Запрос.УстановитьПараметр("ВидыКонтактнойИнформации", ВидыКонтактнойИнформации);
Запрос.Выполнить();
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Страны мира
// Возвращает данные о стране по справочнику стран мира или классификатору ОКСМ.
//
// Параметры:
// КодСтраны - Строка, Число - Код страны по классификатору ОКСМ. Если не указано, то поиск по коду не производится.
// Наименование - Строка - Наименование страны. Если не указано, то поиск по наименованию не производится.
//
// Возвращаемое значение:
// Структура - описание страны. Содержит поля:
// * Ссылка - СправочникСсылка.СтраныМира, Неопределено - Соответствующий элемент справочника Страны мира.
// * Наименование - Строка - Наименование страны.
// * Код - Строка - Код страны.
// * НаименованиеПолное - Строка - Полное наименование страны.
// * КодАльфа2 - Строка - Двузначный буквенный код страны альфа-2.
// * КодАльфа3 - Строка - Трехзначный буквенный код страны альфа-3.
// * УчастникЕАЭС - Булево - Страна-участник ЕАЭС.
// Неопределено - страна не найдена ни в адресе, ни в классификаторе ОКСМ.
//
Функция ДанныеСтраныМира(Знач КодСтраны = Неопределено, Знач Наименование = Неопределено) Экспорт
Результат = Неопределено;
Если КодСтраны = Неопределено И Наименование = Неопределено Тогда
Возврат Результат;
КонецЕсли;
НормализованныйКод = КодСтраныМира(КодСтраны);
Если КодСтраны = Неопределено Тогда
УсловиеПоиска = "ИСТИНА";
ФильтрКлассификатора = Новый Структура;
Иначе
УсловиеПоиска = "Код=" + КонтрольКавычекВСтроке(НормализованныйКод);
ФильтрКлассификатора = Новый Структура("Код", НормализованныйКод);
КонецЕсли;
Если Наименование<>Неопределено Тогда
УсловиеПоиска = УсловиеПоиска + " И Наименование=" + КонтрольКавычекВСтроке(Наименование);
ФильтрКлассификатора.Вставить("Наименование", Наименование);
КонецЕсли;
Результат = Новый Структура("Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3, УчастникЕАЭС");
Запрос = Новый Запрос("
|ВЫБРАТЬ ПЕРВЫЕ 1
| Ссылка, Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3, УчастникЕАЭС
|ИЗ
| Справочник.СтраныМира
|ГДЕ
| " + УсловиеПоиска + "
|УПОРЯДОЧИТЬ ПО
| Наименование
|");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЗаполнитьЗначенияСвойств(Результат, Выборка);
Иначе
Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами");
ДанныеКлассификатора = МодульРаботаСАдресами.ТаблицаКлассификатора();
СтрокиДанных = ДанныеКлассификатора.НайтиСтроки(ФильтрКлассификатора);
Если СтрокиДанных.Количество() = 0 Тогда
Возврат Неопределено;
Иначе
ЗаполнитьЗначенияСвойств(Результат, СтрокиДанных[0]);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает данные страны по коду.
//
// Параметры:
// Код - Строка, Число - код ОКСМ страны.
// ТипКода - Строка - варианты: КодСтраны (по умолчанию), Альфа2, Альфа3.
//
// Возвращаемое значение:
// Структура - описание страны. Содержит поля:
// * Наименование - Строка - Наименование страны.
// * Код - Строка - Код страны.
// * НаименованиеПолное - Строка - Полное наименование страны.
// * КодАльфа2 - Строка - Двузначный буквенный код страны альфа-2.
// * КодАльфа3 - Строка - Трехзначный буквенный код страны альфа-3.
// * УчастникЕАЭС - Булево - Страна-участник ЕАЭС.
// Неопределено - страна не найдена ни в адресе, ни в классификаторе ОКСМ.
//
Функция ДанныеКлассификатораСтранМираПоКоду(Знач Код, Знач ТипКода = "КодСтраны") Экспорт
Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами");
ДанныеКлассификатора = МодульРаботаСАдресами.ТаблицаКлассификатора();
Если СтрСравнить(ТипКода, "Альфа2") = 0 Тогда
СтрокаДанных = ДанныеКлассификатора.Найти(ВРег(Код), "КодАльфа2");
ИначеЕсли СтрСравнить(ТипКода, "Альфа3") = 0 Тогда
СтрокаДанных = ДанныеКлассификатора.Найти(ВРег(Код), "КодАльфа3");
Иначе
СтрокаДанных = ДанныеКлассификатора.Найти(КодСтраныМира(Код), "Код");
КонецЕсли;
Если СтрокаДанных = Неопределено Тогда
Результат = Неопределено;
Иначе
Результат = Новый Структура("Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3, УчастникЕАЭС");
ЗаполнитьЗначенияСвойств(Результат, СтрокаДанных);
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает данные о стране по наименованию страны.
//
// Параметры:
// Наименование - Строка - Наименование страны.
//
// Возвращаемое значение:
// Структура - Описание страны. Содержит поля:
// * Наименование - Строка - Наименование страны.
// * Код - Строка - Код страны.
// * НаименованиеПолное - Строка - Полное наименование страны.
// * КодАльфа2 - Строка - Двузначный буквенный код страны альфа-2.
// * КодАльфа3 - Строка - Трехзначный буквенный код страны альфа-3.
// * УчастникЕАЭС - Булево - Страна-участник ЕАЭС.
// Неопределено - Страна не найдена в классификаторе.
//
Функция ДанныеКлассификатораСтранМираПоНаименованию(Знач Наименование) Экспорт
Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами");
ДанныеКлассификатора = МодульРаботаСАдресами.ТаблицаКлассификатора();
СтрокаДанных = ДанныеКлассификатора.Найти(Наименование, "Наименование");
Если СтрокаДанных=Неопределено Тогда
Результат = Неопределено;
Иначе
Результат = Новый Структура("Код, Наименование, НаименованиеПолное, КодАльфа2, КодАльфа3, УчастникЕАЭС");
ЗаполнитьЗначенияСвойств(Результат, СтрокаДанных);
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает ссылку на элемент справочника страны мира по коду или наименованию.
// Если элемент справочника СтраныМиры не найден, то он будет создан на основании данных заполнения.
//
// Параметры:
// КодИлиНаименование - Строка - код страны, код Альфа2, код Альфа3 или наименование страны.
// ДанныеЗаполнения - Структура - Необязательный. Данные для заполнения в случае создания нового элемента.
// Ключи структуры соответствуют реквизитам справочника СтраныМира.
//
// Возвращаемое значение:
// СправочникСсылка.СтраныМира - Ссылка на элемент справочника СтраныМиры.
// Если найдено несколько значений, то будет возвращено первое.
// Если ничего не найдено, данные заполнения не указаны, то возвращается пустая ссылка.
//
Функция СтранаМираПоКодуИлиНаименованию(КодИлиНаименование, ДанныеЗаполнения = Неопределено) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СтраныМира.Ссылка КАК Ссылка
|ИЗ
| Справочник.СтраныМира КАК СтраныМира
|ГДЕ
| (СтраныМира.Код = &КодИлиНаименование
| ИЛИ СтраныМира.КодАльфа2 = &КодИлиНаименование
| ИЛИ СтраныМира.КодАльфа3 = &КодИлиНаименование
| ИЛИ СтраныМира.Наименование = &КодИлиНаименование
| ИЛИ СтраныМира.НаименованиеПолное = &КодИлиНаименование)";
Запрос.УстановитьПараметр("КодИлиНаименование", КодИлиНаименование);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
Возврат РезультатЗапроса.Ссылка;
КонецЕсли;
Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") = Неопределено Тогда
Возврат Справочники.СтраныМира.ПустаяСсылка();
КонецЕсли;
МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами");
ДанныеКлассификатора = МодульРаботаСАдресами.ТаблицаКлассификатора();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТаблицаКлассификатор.Код,
| ТаблицаКлассификатор.КодАльфа2,
| ТаблицаКлассификатор.КодАльфа3,
| ТаблицаКлассификатор.Наименование,
| ТаблицаКлассификатор.НаименованиеПолное,
| ТаблицаКлассификатор.УчастникЕАЭС,
| ТаблицаКлассификатор.Неактуальный
|ПОМЕСТИТЬ ТаблицаКлассификатор
|ИЗ
| &ТаблицаКлассификатор КАК ТаблицаКлассификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СтранаМира.Код,
| СтранаМира.КодАльфа2,
| СтранаМира.КодАльфа3,
| СтранаМира.Наименование,
| СтранаМира.НаименованиеПолное,
| СтранаМира.УчастникЕАЭС,
| СтранаМира.Неактуальный
|ИЗ
| ТаблицаКлассификатор КАК СтранаМира
|ГДЕ
| (СтранаМира.Код = &КодИлиНаименование
| ИЛИ СтранаМира.КодАльфа2 = &КодИлиНаименование
| ИЛИ СтранаМира.КодАльфа3 = &КодИлиНаименование
| ИЛИ СтранаМира.Наименование = &КодИлиНаименование
| ИЛИ СтранаМира.НаименованиеПолное = &КодИлиНаименование)";
Запрос.УстановитьПараметр("ТаблицаКлассификатор", ДанныеКлассификатора);
Запрос.УстановитьПараметр("КодИлиНаименование", КодИлиНаименование);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
ДанныеЗаполнения = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(РезультатЗапроса);
КонецЕсли;
Если ДанныеЗаполнения = Неопределено
ИЛИ НЕ ДанныеЗаполнения.Свойство("Наименование")
ИЛИ ПустаяСтрока(ДанныеЗаполнения.Наименование) Тогда
Возврат Справочники.СтраныМира.ПустаяСсылка();
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ОбъектСтраны = Справочники.СтраныМира.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(ОбъектСтраны, ДанныеЗаполнения);
ОбъектСтраны.Записать();
Возврат ОбъектСтраны.Ссылка;
КонецФункции
// Возвращает список стран Евразийского экономического союза (ЕАЭС).
//
// Возвращаемое значение:
// - ТаблицаЗначений - Список стран Евразийского экономического союза (ЕАЭС).
// * Ссылка - СправочникСсылка.СтраныМира - Ссылка на элемент справочника страны.
// * Наименование - Строка - Наименование страны.
// * Код - Строка - Код страны.
// * НаименованиеПолное - Строка - Полное наименование страны.
// * КодАльфа2 - Строка - Двузначный буквенный код страны альфа-2.
// * КодАльфа3 - Строка - Трехзначный буквенный код страны альфа-3.
Функция СтраныУчастникиЕАЭС() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СтраныМира.Ссылка КАК Ссылка,
| СтраныМира.Наименование КАК Наименование,
| СтраныМира.Код КАК Код,
| СтраныМира.НаименованиеПолное КАК НаименованиеПолное,
| СтраныМира.КодАльфа2 КАК КодАльфа2,
| СтраныМира.КодАльфа3 КАК КодАльфа3
|ИЗ
| Справочник.СтраныМира КАК СтраныМира
|ГДЕ
| СтраныМира.УчастникЕАЭС = ИСТИНА";
СтраныЕАЭС = Запрос.Выполнить().Выгрузить();
Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") = Неопределено Тогда
Возврат СтраныЕАЭС;
КонецЕсли;
МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами");
ДанныеКлассификатора = МодульРаботаСАдресами.ТаблицаКлассификатора();
Для каждого Страна Из ДанныеКлассификатора Цикл
Если Страна.УчастникЕАЭС Тогда
Отбор = Новый Структура();
Отбор.Вставить("Наименование", Страна.Наименование);
Отбор.Вставить("Код", Страна.Код);
Отбор.Вставить("НаименованиеПолное", Страна.НаименованиеПолное);
Отбор.Вставить("КодАльфа2", Страна.КодАльфа2);
Отбор.Вставить("КодАльфа3", Страна.КодАльфа3);
НайденныеСтроки = СтраныЕАЭС.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 0 Тогда
НоваяСтрока = СтраныЕАЭС.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Отбор);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СтраныЕАЭС;
КонецФункции
// Определяет, является ли страна участником Евразийского экономического союза (ЕАЭС).
//
// Параметры:
// Страна - Строка, СправочникСсылка.СтраныМира - код страны, код Альфа2, код Альфа3,
// наименование страны или ссылка на элемент справочника Страны мира.
// Возвращаемое значение:
// Булево - если Истина, то страна является государством-участником ЕАЭС.
Функция ЭтоСтранаУчастникЕАЭС(Страна) Экспорт
Если ТипЗнч(Страна) = ТипЗнч(Справочники.СтраныМира.ПустаяСсылка()) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СтраныМира.УчастникЕАЭС КАК УчастникЕАЭС
|ИЗ
| Справочник.СтраныМира КАК СтраныМира
|ГДЕ
| СтраныМира.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Страна);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
СтрокаРезультата = РезультатЗапроса.Выбрать();
Если СтрокаРезультата.Следующий() Тогда
Возврат (СтрокаРезультата.УчастникЕАЭС = ИСТИНА);
КонецЕсли;
КонецЕсли;
Иначе
НайденнаяСтрана = СтранаМираПоКодуИлиНаименованию(Страна);
Если ЗначениеЗаполнено(НайденнаяСтрана) Тогда
Возврат НайденнаяСтрана.УчастникЕАЭС;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий формы и модуля объекта вызываемые при внедрении подсистемы.
// Обработчик для события формы ПриСозданииНаСервере.
// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма объекта-владельца, предназначенная для вывода контактной информации.
// Объект - Произвольный - Объект-владелец контактной информации. Если это ссылка, то контактная информация
// будет получена из объекта по ссылке, иначе из таблицы КонтактнаяИнформация объекта.
// ДополнительныеПараметры - Структура - Описание настроек контактной информации - см. ПараметрыКонтактнойИнформации.
// Предыдущее название параметра ИмяЭлементаДляРазмещения. Устарел, следует
// использовать ДополнительныеПараметры. Группа, куда будут размещены элементы
// контактной информации.
// УдалитьПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - Устарел, следует использовать ДополнительныеПараметры.
// Может принимать значения:
// ПоложениеЗаголовкаЭлементаФормы.Верх или
// ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию).
// УдалитьИсключаемыеВиды - Массив - Устарел,следует использовать ДополнительныеПараметры.
// УдалитьОтложеннаяИнициализация - Массив - Устарел,следует использовать ДополнительныеПараметры.
//
Процедура ПриСозданииНаСервере(Форма, Объект, ДополнительныеПараметры = Неопределено, УдалитьПоложениеЗаголовкаКИ = "",
Знач УдалитьИсключаемыеВиды = Неопределено, УдалитьОтложеннаяИнициализация = Ложь) Экспорт
ТипПомещения = Неопределено;
Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
ДополнительныеПараметры.Свойство("ТипПомещения", ТипПомещения);
ОтложеннаяИнициализация = ?(ДополнительныеПараметры.Свойство("ОтложеннаяИнициализация"), ДополнительныеПараметры.ОтложеннаяИнициализация, Ложь);
ПоложениеЗаголовкаКИ = ?(ДополнительныеПараметры.Свойство("ПоложениеЗаголовкаКИ"), ДополнительныеПараметры.ПоложениеЗаголовкаКИ, "");
ИсключаемыеВиды = ?(ДополнительныеПараметры.Свойство("ИсключаемыеВиды"), ДополнительныеПараметры.ИсключаемыеВиды, Неопределено);
СкрываемыеВиды = ?(ДополнительныеПараметры.Свойство("СкрываемыеВиды"), ДополнительныеПараметры.СкрываемыеВиды, Неопределено);
ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры.Свойство("ИмяЭлементаДляРазмещения"), ДополнительныеПараметры.ИмяЭлементаДляРазмещения, "ГруппаКонтактнаяИнформация");
ОбработкаНавигационнойСсылки = ?(ДополнительныеПараметры.Свойство("ОбработкаНавигационнойСсылки"), ДополнительныеПараметры.ОбработкаНавигационнойСсылки, Ложь);
Иначе
ИмяЭлементаДляРазмещения = ?(ДополнительныеПараметры = Неопределено, "ГруппаКонтактнаяИнформация", ДополнительныеПараметры);
ОтложеннаяИнициализация = УдалитьОтложеннаяИнициализация;
ИсключаемыеВиды = УдалитьИсключаемыеВиды;
СкрываемыеВиды = Неопределено;
ПоложениеЗаголовкаКИ = УдалитьПоложениеЗаголовкаКИ;
ОбработкаНавигационнойСсылки = Ложь;
КонецЕсли;
Если ИсключаемыеВиды = Неопределено Тогда
ИсключаемыеВиды = Новый Массив;
КонецЕсли;
Если СкрываемыеВиды = Неопределено Тогда
СкрываемыеВиды = Новый Массив;
КонецЕсли;
ДобавляемыеРеквизиты = Новый Массив;
ПроверитьНаличиеРеквизитовКонтактнойИнформации(Форма, ДобавляемыеРеквизиты);
// Кэширование часто используемых значений
СсылкаНаОбъект = Объект.Ссылка;
МетаданныеОбъекта = СсылкаНаОбъект.Метаданные();
ПолноеИмяОбъектаМетаданных = МетаданныеОбъекта.ПолноеИмя();
ИмяОбъекта = МетаданныеОбъекта.Имя;
ГруппаВидовКонтактнойИнформации = ГруппаВидовКонтактнойИнформацииОбъекта(ПолноеИмяОбъектаМетаданных);
ИспользуетсяКонтактнаяИнформация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ГруппаВидовКонтактнойИнформации, "Используется");
Если ИспользуетсяКонтактнаяИнформация = Ложь Тогда
ПараметрыВыводаКонтактнойИнформации = Новый Структура();
ПараметрыВыводаКонтактнойИнформации.Вставить("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения);
ПараметрыВыводаКонтактнойИнформации.Вставить("ПоложениеЗаголовкаКИ", ПоложениеЗаголовкаКИ);
ПараметрыВыводаКонтактнойИнформации.Вставить("ОтложеннаяИнициализация", ОтложеннаяИнициализация);
ПараметрыВыводаКонтактнойИнформации.Вставить("ИсключаемыеВиды", ИсключаемыеВиды);
ПараметрыВыводаКонтактнойИнформации.Вставить("СкрываемыеВиды", СкрываемыеВиды);
ПараметрыВыводаКонтактнойИнформации.Вставить("СсылкаНаОбъект", СсылкаНаОбъект);
СкрытьКонтактнуюИнформацию(Форма, ДобавляемыеРеквизиты, ПараметрыВыводаКонтактнойИнформации);
Возврат;
КонецЕсли;
РеквизитыОбъекта = МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты;
ЕстьКолонкаДействуетС = (РеквизитыОбъекта.Найти("ДействуетС") <> Неопределено);
ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти = (РеквизитыОбъекта.Найти("ИдентификаторСтрокиТабличнойЧасти") <> Неопределено);
Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Объект)) Тогда
ТекстЗапроса = "ВЫБРАТЬ
| КонтактнаяИнформация.Представление КАК Представление,
| КонтактнаяИнформация.НомерСтроки КАК НомерСтроки,
| КонтактнаяИнформация.Вид КАК Вид,
| ВидыКонтактнойИнформации.ХранитьИсториюИзменений КАК ХранитьИсториюИзменений,
| КонтактнаяИнформация.ЗначенияПолей,
| КонтактнаяИнформация.Значение,
| """" КАК ДействуетС,
| 0 КАК ИдентификаторСтрокиТабличнойЧасти,
| ЛОЖЬ КАК ЭтоИсторическаяКонтактнаяИнформация
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
| ЛЕВОЕ СОЕДИНЕНИЕ " + ПолноеИмяОбъектаМетаданных + ".КонтактнаяИнформация КАК КонтактнаяИнформация
| ПО (КонтактнаяИнформация.Вид = ВидыКонтактнойИнформации.Ссылка)
|ГДЕ
| КонтактнаяИнформация.Ссылка = &Ссылка УПОРЯДОЧИТЬ ПО Вид, ДействуетС";
Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти",
"ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти");
КонецЕсли;
Если ЕстьКолонкаДействуетС Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, """"" КАК ДействуетС", "КонтактнаяИнформация.ДействуетС КАК ДействуетС");
КонецЕсли;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
КонтактнаяИнформация = Запрос.Выполнить().Выгрузить();
Иначе
КонтактнаяИнформация = Объект.КонтактнаяИнформация.Выгрузить();
Если ЕстьКолонкаДействуетС Тогда
ТипБулево = Новый ОписаниеТипов("Булево");
КонтактнаяИнформация.Колонки.Добавить("ХранитьИсториюИзменений", ТипБулево);
КонтактнаяИнформация.Колонки.Добавить("ЭтоИсторическаяКонтактнаяИнформация", ТипБулево);
КонтактнаяИнформация.Сортировать("Вид, ДействуетС");
Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл
СтрокаКонтактнойИнформации.ХранитьИсториюИзменений = СтрокаКонтактнойИнформации.Вид.ХранитьИсториюИзменений;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если ЕстьКолонкаДействуетС Тогда
ПредыдущийВид = Неопределено;
Для каждого СтрокаКонтактнойИнформации Из КонтактнаяИнформация Цикл
Если СтрокаКонтактнойИнформации.ХранитьИсториюИзменений
И (ПредыдущийВид = Неопределено ИЛИ ПредыдущийВид <> СтрокаКонтактнойИнформации.Вид) Тогда
Отбор = Новый Структура("Вид", СтрокаКонтактнойИнформации.Вид);
НайденныеСтроки = КонтактнаяИнформация.НайтиСтроки(Отбор);
ПоследняяДата = НайденныеСтроки.Получить(НайденныеСтроки.Количество() - 1).ДействуетС;
Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
Если НайденнаяСтрока.ДействуетС < ПоследняяДата Тогда
НайденнаяСтрока.ЭтоИсторическаяКонтактнаяИнформация = Истина;
КонецЕсли;
КонецЦикла;
ПредыдущийВид = СтрокаКонтактнойИнформации.Вид;
КонецЕсли;
КонецЦикла;
ТекстЗапросаИсторическаяИнформация = " КонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация КАК ЭтоИсторическаяКонтактнаяИнформация,
| КонтактнаяИнформация.ДействуетС КАК ДействуетС,";
Иначе
ТекстЗапросаИсторическаяИнформация = "ЛОЖЬ КАК ЭтоИсторическаяКонтактнаяИнформация,0 КАК ДействуетС, ";
КонецЕсли;
ТекстЗапроса = " ВЫБРАТЬ
| КонтактнаяИнформация.Представление КАК Представление,
| КонтактнаяИнформация.Значение КАК Значение,
| КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей,
| КонтактнаяИнформация.НомерСтроки КАК НомерСтроки, " + ТекстЗапросаИсторическаяИнформация + "
| КонтактнаяИнформация.Вид КАК Вид,
| 0 КАК ИдентификаторСтрокиТабличнойЧасти
|ПОМЕСТИТЬ
| КонтактнаяИнформация
|ИЗ
| &ТаблицаКонтактнойИнформации КАК КонтактнаяИнформация
|ИНДЕКСИРОВАТЬ ПО
| Вид
|;////////////////////////////////////////////////////////////////////////////////
|
|ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка КАК Вид,
|ВЫБОР
| КОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида <> """"
| ТОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида
| ИНАЧЕ ВидыКонтактнойИнформации.ИмяПредопределенныхДанных
|КОНЕЦ КАК ИмяПредопределенногоВида,
| ВидыКонтактнойИнформации.Тип КАК Тип,
| ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение,
| ВидыКонтактнойИнформации.ВидПоляДругое КАК ВидПоляДругое,
| ВЫБОР
| КОГДА &ЭтоОсновнойЯзык
| ТОГДА ВидыКонтактнойИнформации.Наименование
| ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ВидыКонтактнойИнформацииПредставления.Наименование, ВидыКонтактнойИнформации.Наименование) КАК СТРОКА(150))
| КОНЕЦ КАК Наименование,
| ВидыКонтактнойИнформации.ХранитьИсториюИзменений КАК ХранитьИсториюИзменений,
| ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге КАК РедактированиеТолькоВДиалоге,
| ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоРеквизитТабличнойЧасти,
| ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания,
| ВидыКонтактнойИнформации.МеждународныйФорматАдреса КАК МеждународныйФорматАдреса,
| ЕСТЬNULL(КонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация, ЛОЖЬ) КАК ЭтоИсторическаяКонтактнаяИнформация,
| ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Представление,
| ЕСТЬNULL(КонтактнаяИнформация.ЗначенияПолей, """") КАК ЗначенияПолей,
| ЕСТЬNULL(КонтактнаяИнформация.Значение, """") КАК Значение,
| ЕСТЬNULL(КонтактнаяИнформация.ДействуетС, 0) КАК ДействуетС,
| ЕСТЬNULL(КонтактнаяИнформация.НомерСтроки, 0) КАК НомерСтроки,
| 0 КАК ИдентификаторСтрокиТабличнойЧасти,
| ВЫРАЗИТЬ("""" КАК СТРОКА(200)) КАК ИмяРеквизита,
| ВидыКонтактнойИнформации.ПометкаУдаления КАК ПометкаУдаления,
| ВЫРАЗИТЬ("""" КАК СТРОКА) КАК Комментарий
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ЛЕВОЕ СОЕДИНЕНИЕ
| КонтактнаяИнформация КАК КонтактнаяИнформация
|ПО
| ВидыКонтактнойИнформации.Ссылка = КонтактнаяИнформация.Вид
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации.Представления КАК ВидыКонтактнойИнформацииПредставления
|ПО ВидыКонтактнойИнформацииПредставления.Ссылка = ВидыКонтактнойИнформации.Ссылка
| И ВидыКонтактнойИнформацииПредставления.КодЯзыка = &КодЯзыка
|ГДЕ
| ВидыКонтактнойИнформации.Используется
| И ЕСТЬNULL(ВидыКонтактнойИнформации.Родитель.Используется, ИСТИНА)
| И (
| ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ
| ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ)
| И ВидыКонтактнойИнформации.Ссылка НЕ В (&СкрываемыеВиды)
|УПОРЯДОЧИТЬ ПО
| ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ
|";
Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти",
"ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0) КАК ИдентификаторСтрокиТабличнойЧасти");
КонецЕсли;
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ТаблицаКонтактнойИнформации", КонтактнаяИнформация);
Запрос.УстановитьПараметр("ГруппаВидовКИ", ГруппаВидовКонтактнойИнформации);
Запрос.УстановитьПараметр("Владелец", СсылкаНаОбъект);
Запрос.УстановитьПараметр("СкрываемыеВиды", СкрываемыеВиды);
Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ТекущийЯзык() = Метаданные.ОсновнойЯзык);
Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка);
УстановитьПривилегированныйРежим(Истина);
КонтактнаяИнформация = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией).Строки;
УстановитьПривилегированныйРежим(Ложь);
КонвертацияКонтактнойИнформацииВJSON(КонтактнаяИнформация);
КонтактнаяИнформация.Сортировать("РеквизитДопУпорядочивания, НомерСтроки");
СоздатьРеквизитыКонтактнойИнформации(Форма, ДобавляемыеРеквизиты, ИмяОбъекта, ИсключаемыеВиды, КонтактнаяИнформация, ОтложеннаяИнициализация, ОбработкаНавигационнойСсылки);
ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ,
ОтложеннаяИнициализация, ИсключаемыеВиды, СкрываемыеВиды);
ПараметрыКонтактнойИнформации.Владелец = СсылкаНаОбъект;
ПараметрыКонтактнойИнформации.ПараметрыАдреса.ТипПомещения = ТипПомещения;
ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки = ОбработкаНавигационнойСсылки;
// Кеш значений всех видов контактной информации у данного объекта.
ДанныеВидовКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.ДанныеВидовКонтактнойИнформации(
КонтактнаяИнформация.ВыгрузитьКолонку("Вид"));
Отбор = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
КоличествоАдресов = КонтактнаяИнформация.НайтиСтроки(Отбор).Количество();
// Создадим элементы на форме и заполним значения реквизитов.
СозданныеЭлементы = ОбщегоНазначения.СкопироватьРекурсивно(ИсключаемыеВиды);
ПредыдущийВид = Неопределено;
Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл
Если СтрокаКИ.ЭтоРеквизитТабличнойЧасти Тогда
СоздатьЭлементыТабличнойЧасти(Форма, ИмяОбъекта, ИмяЭлементаДляРазмещения, СтрокаКИ, ДанныеВидовКонтактнойИнформации);
Продолжить;
КонецЕсли;
Если СтрокаКИ.ПометкаУдаления И ПустаяСтрока(СтрокаКИ.ЗначенияПолей) И ПустаяСтрока(СтрокаКИ.Значение) Тогда
Продолжить;
КонецЕсли;
ИндексЭлемента = СозданныеЭлементы.Найти(СтрокаКИ.Вид);
СтатическийЭлемент = ИндексЭлемента <> Неопределено;
ЭтоНовыйВидКИ = (СтрокаКИ.Вид <> ПредыдущийВид);
Если ОтложеннаяИнициализация Тогда
ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ДанныеВидовКонтактнойИнформации, ЭтоНовыйВидКИ,,
СтатическийЭлемент, ИмяЭлементаДляРазмещения);
Если СтатическийЭлемент Тогда
СозданныеЭлементы.Удалить(ИндексЭлемента);
КонецЕсли;
Продолжить;
КонецЕсли;
ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ДанныеВидовКонтактнойИнформации, ЭтоНовыйВидКИ,,
НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация, ИмяЭлементаДляРазмещения);
Если СтатическийЭлемент Тогда
СозданныеЭлементы.Удалить(ИндексЭлемента);
Иначе
СледующаяСтрока = ?(СозданныеЭлементы.Количество() = 0, Неопределено,
ОпределитьСледующуюСтроку(Форма, КонтактнаяИнформация, СтрокаКИ));
Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация Тогда
ДобавитьСтрокуКонтактнойИнформации(Форма, СтрокаКИ, ИмяЭлементаДляРазмещения, ЭтоНовыйВидКИ, КоличествоАдресов, СледующаяСтрока);
КонецЕсли;
КонецЕсли;
Если НЕ СтрокаКИ.ЭтоИсторическаяКонтактнаяИнформация Тогда
ПредыдущийВид = СтрокаКИ.Вид;
КонецЕсли;
КонецЦикла;
ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения);
Если Не ОтложеннаяИнициализация
И Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].СписокДобавляемыхЭлементов.Количество() > 0 Тогда
ДобавитьКнопкуДополнительногоПоляКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения);
Иначе
ДобавитьПояснениеПоСбросуНастроекФормы(Форма, ИмяЭлементаДляРазмещения, ОтложеннаяИнициализация);
КонецЕсли;
КонецПроцедуры
// Обработчик для события формы ПриЧтенииНаСервере.
// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма объекта-владельца, предназначенная для вывода контактной информации.
// Объект - Произвольный - Объект-владелец контактной информации.
// ИмяЭлементаДляРазмещения - Строка - группа, куда будут размещены элементы контактной информации.
//
Процедура ПриЧтенииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") Экспорт
СписокРеквизитовФормы = Форма.ПолучитьРеквизиты();
ПервыйЗапуск = Истина;
Для Каждого Реквизит Из СписокРеквизитовФормы Цикл
Если Реквизит.Имя = "ПараметрыКонтактнойИнформации" И ТипЗнч(Форма.ПараметрыКонтактнойИнформации) = Тип("Структура") Тогда
ПервыйЗапуск = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПервыйЗапуск Тогда
Возврат;
КонецЕсли;
Параметры = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
СсылкаНаОбъект = Объект.Ссылка;
МетаданныеОбъекта = СсылкаНаОбъект.Метаданные();
ПолноеИмяОбъектаМетаданных = МетаданныеОбъекта.ПолноеИмя();
ИмяГруппыВидовКИ = СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", "");
ГруппаВидовКИ = ВидКонтактнойИнформацииПоИмени(ИмяГруппыВидовКИ);
ИмяЭлементаДляРазмещения = Параметры.ГруппаДляРазмещения;
ПоложениеЗаголовкаКИ = ?(ЗначениеЗаполнено(Параметры.ПоложениеЗаголовка), ПредопределенноеЗначение(Параметры.ПоложениеЗаголовка), ПоложениеЗаголовкаЭлементаФормы.Лево);
ВыполненаОтложеннаяИнициализация = Параметры.ВыполненаОтложеннаяИнициализация;
ОтложеннаяИнициализация = Параметры.ОтложеннаяИнициализация И Не ВыполненаОтложеннаяИнициализация;
ИспользуетсяКонтактнаяИнформация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ГруппаВидовКИ, "Используется");
Если ИспользуетсяКонтактнаяИнформация = Ложь Тогда
МассивУдаляемыхРеквизитов = Параметры.ДобавленныеРеквизиты;
Иначе
УдалитьКомандыИЭлементыФормы(Форма, ИмяЭлементаДляРазмещения);
МассивУдаляемыхРеквизитов = Новый Массив;
ИмяОбъекта = Объект.Ссылка.Метаданные().Имя;
СтатическиеРеквизиты = ОбщегоНазначения.СкопироватьРекурсивно(Параметры.ИсключаемыеВиды);
ИменаТабличныхЧастейПоВидамКИ = Неопределено;
Отбор = Новый Структура("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения);
КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Для Каждого РеквизитФормы Из КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл
Если РеквизитФормы.ЭтоРеквизитТабличнойЧасти Тогда
Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда
Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина);
ВидыКИТабличнойЧасти = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(Отбор, "Вид");
ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъекта);
КонецЕсли;
ИмяТабличнойЧасти = ИменаТабличныхЧастейПоВидамКИ[РеквизитФормы.Вид];
МассивУдаляемыхРеквизитов.Добавить("Объект." + ИмяТабличнойЧасти + "." + РеквизитФормы.ИмяРеквизита);
МассивУдаляемыхРеквизитов.Добавить("Объект." + ИмяТабличнойЧасти + "." + РеквизитФормы.ИмяРеквизита + "Значение");
ИначеЕсли НЕ РеквизитФормы.Свойство("ЭтоИсторическаяКонтактнаяИнформация")
ИЛИ НЕ РеквизитФормы.ЭтоИсторическаяКонтактнаяИнформация Тогда
Индекс = СтатическиеРеквизиты.Найти(РеквизитФормы.Вид);
Если Индекс = Неопределено Тогда // Реквизит создается динамически.
Если Не ОтложеннаяИнициализация И ЗначениеЗаполнено(РеквизитФормы.ИмяРеквизита) Тогда
МассивУдаляемыхРеквизитов.Добавить(РеквизитФормы.ИмяРеквизита);
КонецЕсли;
Иначе
СтатическиеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого РеквизитФормы Из КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл
Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Удалить(РеквизитФормы);
КонецЦикла;
КонецЕсли;
Форма.ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);
ДополнительныеПараметры = ПараметрыКонтактнойИнформации();
ДополнительныеПараметры.ИмяЭлементаДляРазмещения = ИмяЭлементаДляРазмещения;
ДополнительныеПараметры.ПоложениеЗаголовкаКИ = ПоложениеЗаголовкаКИ;
ДополнительныеПараметры.ИсключаемыеВиды = Параметры.ИсключаемыеВиды;
ДополнительныеПараметры.СкрываемыеВиды = Параметры.СкрываемыеВиды;
ДополнительныеПараметры.ОтложеннаяИнициализация = ОтложеннаяИнициализация;
ПриСозданииНаСервере(Форма, Объект, ДополнительныеПараметры);
Параметры = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
Параметры.ВыполненаОтложеннаяИнициализация = ВыполненаОтложеннаяИнициализация;
КонецПроцедуры
// Обработчик для события формы ПослеЗаписиНаСервере.
// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма объекта-владельца, предназначенная для вывода контактной информации.
// Объект - Произвольный - Объект-владелец контактной информации.
//
Процедура ПослеЗаписиНаСервере(Форма, Объект) Экспорт
ИмяОбъекта = Объект.Ссылка.Метаданные().Имя;
// Только для контактной информации в составе табличной части.
Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина);
СтрокиТабличнойЧасти = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(Отбор);
ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(СтрокиТабличнойЧасти, ИмяОбъекта);
Для Каждого СтрокаТаблицы Из СтрокиТабличнойЧасти Цикл
ВидИнформации = СтрокаТаблицы.Вид;
ИмяРеквизита = СтрокаТаблицы.ИмяРеквизита;
ТабличнаяЧастьФормы = Форма.Объект[ИменаТабличныхЧастейПоВидамКИ[ВидИнформации]];
Для Каждого СтрокаТабличнойЧастиФормы Из ТабличнаяЧастьФормы Цикл
Отбор = Новый Структура;
Отбор.Вставить("Вид", ВидИнформации);
Отбор.Вставить("ИдентификаторСтрокиТабличнойЧасти", СтрокаТабличнойЧастиФормы.ИдентификаторСтрокиТабличнойЧасти);
НайденныеСтроки = Объект.КонтактнаяИнформация.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() = 1 Тогда
СтрокаКИ = НайденныеСтроки[0];
СтрокаТабличнойЧастиФормы[ИмяРеквизита] = СтрокаКИ.Представление;
СтрокаТабличнойЧастиФормы[ИмяРеквизита + "Значение"] = СтрокаКИ.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// Обработчик для события формы ОбработкаПроверкиЗаполненияНаСервере.
// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма объекта-владельца, предназначенная для вывода контактной информации.
// Объект - Произвольный - Объект-владелец контактной информации.
// Отказ - Булево - Если Истина, то во время проверки были обнаружены ошибки.
//
Процедура ОбработкаПроверкиЗаполненияНаСервере(Форма, Объект, Отказ) Экспорт
ИмяОбъекта = Объект.Ссылка.Метаданные().Имя;
УровеньОшибок = 0;
ПредыдущийВид = Неопределено;
ИменаТабличныхЧастейПоВидамКИ = Неопределено;
Для Каждого СтрокаТаблицы Из Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл
ВидИнформации = СтрокаТаблицы.Вид;
ТипИнформации = СтрокаТаблицы.Тип;
Комментарий = СтрокаТаблицы.Комментарий;
ИмяРеквизита = СтрокаТаблицы.ИмяРеквизита;
СвойствоВидаИнформации = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВидИнформации, "ОбязательноеЗаполнение, РедактированиеТолькоВДиалоге");
ОбязательноеЗаполнение = СвойствоВидаИнформации.ОбязательноеЗаполнение;
Если СтрокаТаблицы.ЭтоРеквизитТабличнойЧасти Тогда
Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда
Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина);
ВидыКИТабличнойЧасти = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(Отбор , "Вид");
ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъекта);
КонецЕсли;
ИмяТабличнойЧасти = ИменаТабличныхЧастейПоВидамКИ[ВидИнформации];
ТабличнаяЧастьФормы = Форма.Объект[ИмяТабличнойЧасти];
Для Каждого СтрокаТабличнойЧастиФормы Из ТабличнаяЧастьФормы Цикл
Представление = СтрокаТабличнойЧастиФормы[ИмяРеквизита];
Поле = "Объект." + ИмяТабличнойЧасти + "[" + (СтрокаТабличнойЧастиФормы.НомерСтроки - 1) + "]." + ИмяРеквизита;
Если ОбязательноеЗаполнение И ПустаяСтрока(Представление) И Не ВидИнформации.ПометкаУдаления Тогда
ОбщегоНазначения.СообщитьПользователю(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"), ВидИнформации.Наименование),,Поле);
ТекущийУровеньОшибок = 2;
Иначе
Значение = СтрокаТабличнойЧастиФормы[ИмяРеквизита + "Значение"];
ТекущийУровеньОшибок = ПроверитьЗаполнениеКонтактнойИнформации(Представление, Значение, ВидИнформации,
ТипИнформации, ИмяРеквизита, , Поле);
СтрокаТабличнойЧастиФормы[ИмяРеквизита] = Представление;
СтрокаТабличнойЧастиФормы[ИмяРеквизита + "Значение"] = Значение;
КонецЕсли;
УровеньОшибок = ?(ТекущийУровеньОшибок > УровеньОшибок, ТекущийУровеньОшибок, УровеньОшибок);
КонецЦикла;
Иначе
ЭлементФормы = Форма.Элементы.Найти(ИмяРеквизита);
Если ЭлементФормы = Неопределено Или ВидИнформации.ПометкаУдаления Тогда
Продолжить; // Элемент не был создан. Не была вызвана отложенная инициализация.
КонецЕсли;
Если (СвойствоВидаИнформации.РедактированиеТолькоВДиалоге
Или ТипИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница)
И Не УправлениеКонтактнойИнформациейКлиентСервер.КонтактнаяИнформацияЗаполнена(Строка(Форма[ИмяРеквизита])) Тогда
Представление = "";
Иначе
Представление = Форма[ИмяРеквизита];
КонецЕсли;
Если ВидИнформации <> ПредыдущийВид И ОбязательноеЗаполнение И ПустаяСтрока(Представление)
И Не ЕстьДругиеЗаполненныеСтрокКИДанногоВида(Форма, СтрокаТаблицы, ВидИнформации) Тогда
// И нет других строк с данными для видов КИ с множественными значениями.
ОбщегоНазначения.СообщитьПользователю(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Поле ""%1"" не заполнено.'"), ВидИнформации.Наименование),,, ИмяРеквизита);
ТекущийУровеньОшибок = 2;
Иначе
ТекущийУровеньОшибок = ПроверитьЗаполнениеКонтактнойИнформации(Представление, СтрокаТаблицы.Значение,
ВидИнформации, ТипИнформации, ИмяРеквизита, Комментарий);
КонецЕсли;
УровеньОшибок = ?(ТекущийУровеньОшибок > УровеньОшибок, ТекущийУровеньОшибок, УровеньОшибок);
КонецЕсли;
ПредыдущийВид = ВидИнформации;
КонецЦикла;
Если УровеньОшибок <> 0 Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
// Обработчик для события формы ПередЗаписьюНаСервере.
// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы.
//
// Параметры:
// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации.
// Объект - СправочникОбъект, ДокументСсылка - Объект-владелец контактной информации.
// ДанныеФормыСтруктура - Объект, содержащий табличную часть с контактной информацией. Поддерживает работу
// со скрываемыми видами контактной информации только для уже существующих объектов,
// из-за невозможности установить ссылку для нового объекта.
// Отказ - Булево - Если Истина, то объект не был записан, т.к. во время записи возникли ошибки.
//
Процедура ПередЗаписьюНаСервере(Форма, Объект, Отказ = Ложь) Экспорт
КонтактнаяИнформация = КонтактнаяИнформацияИзРеквизитовФормы(Форма, Объект);
ЭтоПараметрыОсновногоОбъекта = Истина;
ПараметрыКонтактнойИнформации = Неопределено;
СкрываемыеВиды = Новый Массив;
ОпределитьПараметрыКонтактнойИнформацииПоВладельцу(Форма, Объект, ПараметрыКонтактнойИнформации, ЭтоПараметрыОсновногоОбъекта, СкрываемыеВиды);
Если Объект.Ссылка.Пустая() И ТипЗнч(Объект) <> Тип("ДанныеФормыСтруктура") Тогда
Если ЭтоПараметрыОсновногоОбъекта Тогда
НоваяСсылка = Объект.ПолучитьСсылкуНового();
МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Объект.Ссылка);
Если НоваяСсылка = МенеджерОбъекта.ПустаяСсылка() Тогда
Объект.УстановитьСсылкуНового(МенеджерОбъекта.ПолучитьСсылку());
КонецЕсли;
ПараметрыКонтактнойИнформации.Владелец = Объект.ПолучитьСсылкуНового();
Иначе
Возврат;
КонецЕсли;
КонецЕсли;
Если СкрываемыеВиды.Количество() = 0 Тогда
Объект.КонтактнаяИнформация.Очистить();
Иначе
Индекс = Объект.КонтактнаяИнформация.Количество() -1;
Пока Индекс >= 0 Цикл
СтрокаТаблицы = Объект.КонтактнаяИнформация.Получить(Индекс);
Если СкрываемыеВиды.Найти(СтрокаТаблицы.Вид) = Неопределено Тогда
Объект.КонтактнаяИнформация.Удалить(СтрокаТаблицы);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецЕсли;
УстановитьКонтактнуюИнформациюОбъекта(Объект, КонтактнаяИнформация);
КонецПроцедуры
// Добавляет (удаляет) поле ввода или комментарий на форму, обновляя данные.
// Вызывается из модуля формы объекта-владельца контактной информации.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - Форма объекта-владельца, предназначенная для вывода контактной информации.
// Объект - Произвольный - Объект-владелец контактной информации.
// Результат - Произвольный - Необязательный служебный реквизит, полученный из предыдущего обработчика события.
//
// Возвращаемое значение:
// Неопределено - значение не используется, обратная совместимость.
//
Функция ОбновитьКонтактнуюИнформацию(Форма, Объект, Результат = Неопределено) Экспорт
Если Результат = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если Результат.Свойство("ЭтоДобавлениеКомментария") Тогда
ИзменитьКомментарий(Форма, Результат.ИмяРеквизита, Результат.ИмяЭлементаДляРазмещения);
ИначеЕсли Результат.Свойство("ДобавляемыйВид") Тогда
ДобавитьСтрокуКонтактнойИнформации(Форма, Результат, Результат.ИмяЭлементаДляРазмещения);
ИначеЕсли Результат.Свойство("ПоменятьМестамиЭлементы") Тогда
Отбор = Новый Структура("ИмяРеквизита", Результат.ПервыйЭлемент);
ОписаниеКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
ПервыйЭлемент = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0];
Отбор = Новый Структура("ИмяРеквизита", Результат.ВторойЭлемент);
ВторойЭлемент = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0];
СписокПереносимыхСвойств = "Комментарий,Представление,Значение";
ВременныйБуфер = Новый Структура(СписокПереносимыхСвойств);
ЗаполнитьЗначенияСвойств(ВременныйБуфер, ПервыйЭлемент);
ЗаполнитьЗначенияСвойств(ПервыйЭлемент, ВторойЭлемент, СписокПереносимыхСвойств);
ЗаполнитьЗначенияСвойств(ВторойЭлемент, ВременныйБуфер);
Форма[Результат.ПервыйЭлемент] = ПервыйЭлемент.Представление;
Форма[Результат.ВторойЭлемент] = ВторойЭлемент.Представление;
Форма.Элементы[Результат.ПервыйЭлемент].РасширеннаяПодсказка.Заголовок = ПервыйЭлемент.Комментарий;
Форма.Элементы[Результат.ВторойЭлемент].РасширеннаяПодсказка.Заголовок = ВторойЭлемент.Комментарий;
КонецЕсли;
Если Результат.Свойство("ОбновитьКонтекстноеМеню") Тогда
Если Результат.Свойство("ИмяЭлементаДляРазмещения") Тогда
ОбновитьКонтекстноеМеню(Форма, Результат.ИмяЭлементаДляРазмещения);
Если Результат.Свойство("ИмяРеквизита") Тогда
ОписаниеКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
Отбор = Новый Структура("ИмяРеквизита", Результат.ИмяРеквизита);
НайденнаяСтрока = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0];
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(НайденнаяСтрока.Значение) Тогда
КонтактнаяИнформацияПоПолям = УправлениеКонтактнойИнформациейСлужебный.СтрокуJSONВСтруктуру(НайденнаяСтрока.Значение);
КонтактнаяИнформацияПоПолям.Comment = ?(Результат.Свойство("Комментарий"), Результат.Комментарий, "");
НайденнаяСтрока.Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(КонтактнаяИнформацияПоПолям);
КонецЕсли;
КонецЕсли;
Иначе
Для каждого ИмяЭлементаРазмещения Из Форма.ПараметрыКонтактнойИнформации Цикл
ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаРазмещения.Ключ);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
// Обработчик подписки события "ОбработкаЗаполнения".
//
// Параметры:
// Источник - Произвольный - объект, содержащий контактную информацию.
// ДанныеЗаполнения - Структура - данные с контактной информацией для заполнения объекта.
// ТекстЗаполнения - Строка - не используется.
// СтандартнаяОбработка - Булево - не используется.
//
Процедура ОбработкаЗаполненияКонтактнойИнформации(Источник, ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) Экспорт
ОбработкаЗаполненияКонтактнойИнформацииОбъекта(Источник, ДанныеЗаполнения);
КонецПроцедуры
// Обработчик подписки события "ПередЗаписью" для обновления контактной информации для списков.
//
// Параметры:
// Объект - Произвольный - Объект, содержащий контактную информацию.
// Отказ - Булево - Не используется, обратная совместимость.
//
Процедура ОбработкаОбновленияКонтактнойИнформации(Объект, Отказ) Экспорт
Если Объект.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ОбновитьКонтактнуюИнформациюДляСписков(Объект);
КонецПроцедуры
// Обработчик подписки события "ОбработкаЗаполнения" для документов.
//
// Параметры:
// Источник - Произвольный - Объект, содержащий контактную информацию.
// ДанныеЗаполнения - Структура - Данные с контактной информацией для заполнения объекта.
// ТекстЗаполнения - Строка, Неопределено - Данные заполнения реквизита Наименование.
// СтандартнаяОбработка - Булево - Не используется.
//
Процедура ОбработкаЗаполненияКонтактнойИнформацииДокумента(Источник, ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) Экспорт
ОбработкаЗаполненияКонтактнойИнформацииОбъекта(Источник, ДанныеЗаполнения);
КонецПроцедуры
// Выполняет отложенную инициализацию реквизитов и элементов контактной информации.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - форма объекта-владельца, предназначенная для вывода контактной информации.
// Объект - Произвольный - объект-владелец контактной информации.
// ИмяЭлементаДляРазмещения - Строка - имя группы, где размещена контактная информация.
//
Процедура ВыполнитьОтложеннуюИнициализацию(Форма, Объект, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") Экспорт
КонтактнаяИнформацияЗаглушка = Форма.Элементы.Найти("КонтактнаяИнформацияЗаглушка"); // временный элемент
Если КонтактнаяИнформацияЗаглушка <> Неопределено Тогда
Форма.Элементы.Удалить(КонтактнаяИнформацияЗаглушка);
КонецЕсли;
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(, "Вид, Представление, Значение, Комментарий");
Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Очистить();
ПоложениеЗаголовкаКИ = ?(ЗначениеЗаполнено(ПараметрыКонтактнойИнформации.ПоложениеЗаголовка), ПредопределенноеЗначение(ПараметрыКонтактнойИнформации.ПоложениеЗаголовка), ПоложениеЗаголовкаЭлементаФормы.Лево);
ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, ПараметрыКонтактнойИнформации.ИсключаемыеВиды);
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
Для Каждого ВидКонтактнойИнформации Из ПараметрыКонтактнойИнформации.ИсключаемыеВиды Цикл
Отбор = Новый Структура("Вид", ВидКонтактнойИнформации);
МассивСтрок = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Если МассивСтрок.Количество() > 0 Тогда
СохраненноеЗначение = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор)[0];
ТекущееЗначение = МассивСтрок[0];
ЗаполнитьЗначенияСвойств(ТекущееЗначение, СохраненноеЗначение);
Форма[ТекущееЗначение.ИмяРеквизита] = СохраненноеЗначение.Представление;
КонецЕсли;
КонецЦикла;
Если Форма.Элементы.Найти("ПустаяДекорацияКонтактнаяИнформация") <> Неопределено Тогда
Форма.Элементы.ПустаяДекорацияКонтактнаяИнформация.Видимость = Ложь;
КонецЕсли;
ПараметрыКонтактнойИнформации.ВыполненаОтложеннаяИнициализация = Истина;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Вспомогательные функции и конструкторы.
// Возвращает ссылку на вид контактной информации.
// Если по виден не был найден по имени, то выполняется поиск по именам предопределенных элементов.
//
// Параметры:
// Имя - Строка - Уникальное имя вида контактной информации.
//
// Возвращаемое значение:
// СправочникСсылка.ВидыКонтактнойИнформации - Ссылка на элемент справочника виды контактной информации.
//
Функция ВидКонтактнойИнформацииПоИмени(Имя) Экспорт
Вид = Неопределено;
Если Не ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы() Тогда
Виды = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.ВидыКонтактнойИнформацииПоИмени();
Вид = Виды.Получить(Имя);
Иначе
Виды = ПредопределенныеВидыКонтактнойИнформации(Имя);
Если Виды.Количество() > 0 Тогда
Вид = Виды[0].Ссылка;
КонецЕсли;
КонецЕсли;
Если Вид <> Неопределено Тогда
Возврат Вид;
КонецЕсли;
Возврат Справочники.ВидыКонтактнойИнформации[Имя];
КонецФункции
// Описание параметров контактной информации, используемых в обработчике ПриСозданииНаСервере.
//
// Возвращаемое значение:
// Структура - параметры контактной информации.
// * Индекс - Строка - индекс адреса.
// * Страна - Строка - страна адреса.
// * ТипПомещения - Строка - наименование типа помещения, который будет установлен
// в форме ввода нового адреса. По умолчанию, "Квартира".
// * ИмяЭлементаДляРазмещения - Строка - группа, куда будут размещены элементы контактной информации.
// * ИсключаемыеВиды - Массив - виды контактной информации, которые при отложенной инициализации будут созданы на форме,
// только после вызова процедуры УправлениеКонтактнойИнформацией.ВыполнитьОтложеннуюИнициализацию.
// * СкрываемыеВиды - Массив - виды контактной информации, которые не требуется отображать на форме.
// * ОтложеннаяИнициализация - Булево - если Истина, то создание полей контактной информации на форме будет отложено.
// * ПоложениеЗаголовкаКИ - ПоложениеЗаголовкаЭлементаФормы - может принимать значения:
// ПоложениеЗаголовкаЭлементаФормы.Верх или
// ПоложениеЗаголовкаЭлементаФормы.Лево (по умолчанию).
//
Функция ПараметрыКонтактнойИнформации() Экспорт
Результат = Новый Структура;
Результат.Вставить("ТипПомещения", "Квартира");
Результат.Вставить("Индекс", Неопределено);
Результат.Вставить("Страна", Неопределено);
Результат.Вставить("ОтложеннаяИнициализация", Ложь);
Результат.Вставить("ПоложениеЗаголовкаКИ", "");
Результат.Вставить("ИсключаемыеВиды", Неопределено);
Результат.Вставить("СкрываемыеВиды", Неопределено);
Результат.Вставить("ИмяЭлементаДляРазмещения", "ГруппаКонтактнаяИнформация");
Возврат Результат;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Проверка и сведения об адресе
// Проверяет контактную информацию.
//
// Параметры:
// Представление - Строка - Представление контактной информации. Используется, если невозможно определить
// представление из параметра ЗначенияПолей (отсутствие поля Представление).
// ЗначенияПолей - Строка, Структура, Соответствие, СписокЗначений - Описание полей контактной информации.
// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - Используется для определения типа, если его невозможно
// определить по параметру ЗначенияПолей.
// ТипИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации.
// ИмяРеквизита - Строка - Имя реквизита на форме.
// Комментарий - Строка - Текст комментария.
// ПутьКРеквизиту - Строка - Путь к реквизиту.
//
// Возвращаемое значение:
// Число - уровень ошибок, 0 - ошибки отсутствуют.
//
Функция ПроверитьКонтактнуюИнформацию(Представление, ЗначенияПолей, ВидИнформации, ТипИнформации,
ИмяРеквизита, Комментарий = Неопределено, ПутьКРеквизиту = "") Экспорт
ТекстСериализации = ?(ПустаяСтрока(ЗначенияПолей), Представление, ЗначенияПолей);
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ТекстСериализации) Тогда
ОбъектКИ = КонтактнаяИнформацияВJSON(ТекстСериализации);
Иначе
ОбъектКИ = ЗначенияПолей;
КонецЕсли;
// Проверка
Если ТипИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
УровеньОшибок = ОшибкиЗаполненияЭлектроннойПочты(ОбъектКИ, ВидИнформации, ИмяРеквизита, ПутьКРеквизиту);
ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
УровеньОшибок = ОшибкиЗаполненияАдреса(ОбъектКИ, ВидИнформации, ИмяРеквизита);
ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
УровеньОшибок = ОшибкиЗаполненияТелефона(ОбъектКИ, ВидИнформации, ИмяРеквизита);
ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Факс Тогда
УровеньОшибок = ОшибкиЗаполненияТелефона(ОбъектКИ, ВидИнформации, ИмяРеквизита);
ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда
УровеньОшибок = ОшибкиЗаполненияВебСтраницы(ОбъектКИ, ВидИнформации, ИмяРеквизита);
Иначе
// Другое (прочее) не проверяем.
УровеньОшибок = 0;
КонецЕсли;
Возврат УровеньОшибок;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы.
// Устанавливает свойства группы контактной информации.
//
// Параметры:
// Параметры - Структура - содержит структуру с полями:
// * Код - Строка - Код вида контактной информации для идентификации элемента.
// * Наименование - Строка - Наименование вида контактной информации.
// * Используется - Булево -Признак использования вида контактной информации. Значение по умолчанию Истина.
// Возвращаемое значение:
// СправочникСсылка.ВидыКонтактнойИнформации - ссылка на группу.
//
Функция УстановитьСвойстваГруппыВидаКонтактнойИнформации(Параметры) Экспорт
Объект = ОбъектВидаКонтактнойИнформации(Параметры.Имя, Истина);
Объект.ИмяПредопределенногоВида = Параметры.Имя;
Объект.Родитель = Параметры.Группа;
Объект.Используется = Параметры.Используется;
Если ПустаяСтрока(Параметры.Наименование) Тогда
Наименования = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.НаименованияВидовКонтактнойИнформации();
Для каждого Язык Из Метаданные.Языки Цикл
Представление = Наименования[Язык.КодЯзыка][СокрЛП(Объект.ИмяПредопределенногоВида)];
Если ЗначениеЗаполнено(Представление) Тогда
Если ТекущийЯзык() = Метаданные.ОсновнойЯзык Тогда
Объект.Наименование = Представление;
Иначе
НоваяСтрока = Объект.Представления.Добавить();
НоваяСтрока.КодЯзыка = Язык.КодЯзыка;
НоваяСтрока.Наименование = Представление;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
Объект.Наименование = Параметры.Наименование;
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Объект);
Возврат Объект.Ссылка;
КонецФункции
// Устанавливает свойства вида контактной информации.
// Примечание. При использовании параметра Порядок следует внимательно следить за уникальностью назначаемого значения.
// Если после выполнения обновления значения порядка окажутся неуникальными в пределах группы, то настройка порядка
// пользователем будет невозможна.
// В общем случае рекомендуется не использовать этот параметр (порядок не изменится), либо заполнять его значением
// 0 (порядок будет назначен автоматически в подсистеме "Настройка порядка элементов" при выполнении процедуры).
// Для размещения видов КИ в определенной последовательности относительно друг друга без явного размещения в начале
// списка достаточно вызывать данную процедуру в нужной последовательности для каждого вида КИ с указанием порядка 0.
// Если добавляется предопределенный вид КИ к уже существующим в ИБ, не рекомендуется назначать порядок в явном виде.
//
// Параметры:
// Параметры - Структура - содержит структуру с полями:
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации, Строка - Ссылка на вид контактной информации или
// идентификатор предопределенного элемента.
// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации или его
// идентификатор.
// * Порядок - Число, Неопределено - Порядок вида контактной информации, положение в
// списке относительно других элементов:
// Неопределено - не переназначать;
// 0 - назначить автоматически;
// Число > 0 - назначить указанный порядок.
// * МожноИзменятьСпособРедактирования - Булево - Истина, если есть возможность изменять способ
// редактирования только в диалоге, Ложь - иначе.
// * РедактированиеТолькоВДиалоге - Булево - Истина, если редактировать только в диалоге,
// Ложь - иначе.
// * ОбязательноеЗаполнение - Булево - Истина, если требуется обязательное
// заполнение поля, Ложь - иначе.
// * РазрешитьВводНесколькихЗначений - Булево - Признак возможности использования дополнительных
// полей ввода для данного вида.
// * ЗапретитьРедактированиеПользователем - Булево - Признак недоступности редактирования
// пользователем свойства вида контактной
// информации.
// * ХранитьИсториюИзменений - Булево - Признак хранения истории изменений вида
// контактной информации.
// Значение по умолчанию Ложь.
// * Используется - Булево - Признак использования вида контактной информации.
// Значение по умолчанию Истина.
// * ВидПоляДругое - Строка - Внешний вид поля типа "Другое". Возможные значения:
// МногострочноеШирокое, ОднострочноеШирокое, ОднострочноеУзкое.
// Значение по умолчанию - ОднострочноеШирокое.
// * НастройкиПроверки - Структура, Неопределено - Настройки проверки вида контактной информации.
// Для типа Адрес - Структура, содержащая поля:
// * ТолькоНациональныйАдрес - Булево - Истина, если возможен ввод только российских адресов.
// * ПроверятьКорректность - Булево - Истина, если требуется запрещать пользователю записывать
// некорректные адреса.
// * ЗапрещатьВводНекорректного - Булево - Устарел. Все переданные значения игнорируются.
// Для запрета пользователю записывать некорректные адреса
// следует использовать параметр ПроверятьКорректность.
// * СкрыватьНеактуальныеАдреса - Булево - Истина, если не требуется показывать неактуальные адреса при
// вводе (только если ТолькоНациональныйАдрес = Истина).
// * ВключатьСтрануВПредставление - Булево - Истина, если требуется включать наименование страны в
// представление адреса.
// Для типа АдресЭлектроннойПочты - Структура, содержащая поля:
// * ПроверятьКорректность - Булево - Истина, если требуется запрещать пользователю записывать
// некорректный адрес электронной почты.
// * ЗапрещатьВводНекорректного - Булево - Устарел. Все переданные значения игнорируются.
// Для запрета пользователю записывать некорректные адреса
// следует использовать параметр ПроверятьКорректность.
// Для остальных типов или для задания настроек по умолчанию используется Неопределено.
//
Процедура УстановитьСвойстваВидаКонтактнойИнформации(Параметры) Экспорт
Если Не ЗначениеЗаполнено(Параметры.Вид) Тогда
Объект = ОбъектВидаКонтактнойИнформации(Параметры.Имя);
ИначеЕсли ТипЗнч(Параметры.Вид) = Тип("Строка") Тогда
Объект = ОбъектВидаКонтактнойИнформации(Параметры.Вид);
Иначе
Объект = Параметры.Вид.ПолучитьОбъект();
КонецЕсли;
ЗаполнитьЗначенияСвойств(Объект, Параметры, "Тип, МожноИзменятьСпособРедактирования,
|РедактированиеТолькоВДиалоге, ОбязательноеЗаполнение, РазрешитьВводНесколькихЗначений,
|ЗапретитьРедактированиеПользователем, Используется, ХранитьИсториюИзменений ,МеждународныйФорматАдреса");
Если ПустаяСтрока(Параметры.Наименование) Тогда
Наименования = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.НаименованияВидовКонтактнойИнформации();
Для каждого Язык Из Метаданные.Языки Цикл
Представление = Наименования[Язык.КодЯзыка][СокрЛП(Объект.ИмяПредопределенногоВида)];
Если ЗначениеЗаполнено(Представление) Тогда
Если ТекущийЯзык() = Метаданные.ОсновнойЯзык Тогда
Объект.Наименование = Представление;
Иначе
НоваяСтрока = Объект.Представления.Добавить();
НоваяСтрока.КодЯзыка = Язык.КодЯзыка;
НоваяСтрока.Наименование = Представление;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
Объект.Наименование = Параметры.Наименование;
КонецЕсли;
Если ЗначениеЗаполнено(Параметры.Имя) Тогда
Объект.ИмяПредопределенногоВида = Параметры.Имя;
КонецЕсли;
Если ПустаяСтрока(Объект.ИмяПредопределенногоВида) Тогда
Объект.ИмяПредопределенногоВида = Объект.ИмяПредопределенныхДанных;
КонецЕсли;
Если ПустаяСтрока(Объект.Родитель) Тогда
Объект.Родитель = Параметры.Группа;
КонецЕсли;
Объект.ИмяГруппы = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Родитель, "ИмяПредопределенногоВида");
Если Параметры.Тип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда
Объект.ВидПоляДругое = Параметры.ВидПоляДругое;
КонецЕсли;
НастройкиПроверки = Параметры.НастройкиПроверки;
ПроверятьНастройки = ТипЗнч(НастройкиПроверки) = Тип("Структура");
Если ПроверятьНастройки И Параметры.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
ЗаполнитьЗначенияСвойств(Объект, НастройкиПроверки);
ИначеЕсли ПроверятьНастройки И Параметры.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
УстановитьЗначенияРеквизитовПроверки(Объект, НастройкиПроверки);
ИначеЕсли ПроверятьНастройки И Параметры.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
Объект.ТелефонCДобавочнымНомером = НастройкиПроверки.ТелефонCДобавочнымНомером;
Иначе
УстановитьЗначенияРеквизитовПроверки(Объект);
КонецЕсли;
Результат = УправлениеКонтактнойИнформациейСлужебный.ПроверитьПараметрыВидаКонтактнойИнформации(Объект);
Если Результат.ЕстьОшибки Тогда
ВызватьИсключение Результат.ТекстОшибки;
КонецЕсли;
Если Параметры.Порядок <> Неопределено Тогда
Объект.РеквизитДопУпорядочивания = Параметры.Порядок;
КонецЕсли;
ЗначениеИспользуетсяУГруппы = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Родитель, "Используется");
Если ЗначениеИспользуетсяУГруппы = Ложь И Объект.Используется Тогда
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.ВидыКонтактнойИнформации");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Объект.Родитель.Ссылка);
Блокировка.Заблокировать();
Родитель = Объект.Родитель.ПолучитьОбъект();
Родитель.Используется = Истина;
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Родитель);
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Объект);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Иначе
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Объект);
КонецЕсли;
КонецПроцедуры
// Возвращает структуру параметров группы вида контактной информации.
//
// Параметры:
// ГруппаКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации- группа контактной информации.
//
// Возвращаемое значение:
// Структура - содержит структуру с полями:
// * Имя - Строка - Уникальное имя вида контактной информации.
// * Наименование - Строка - Наименование вида контактной информации.
// * Группа - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на группу(родителя) элемента справочника.
// * Используется - Булево - Признак использования вида контактной информации. Значение по умолчанию Истина.
//
Функция ПараметрыГруппыВидаКонтактнойИнформации(ГруппаКонтактнойИнформации = Неопределено) Экспорт
Результат = ОписаниеОбщихПараметровВидаКонтактнойИнформации();
Если ТипЗнч(ГруппаКонтактнойИнформации ) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
Значения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ГруппаКонтактнойИнформации, "ИмяПредопределенногоВида, ИмяПредопределенныхДанных, Родитель, Наименование, Используется");
Результат.Имя = ?(ЗначениеЗаполнено(Значения.ИмяПредопределенногоВида), Значения.ИмяПредопределенногоВида, Значения.ИмяПредопределенныхДанных);
Результат.Группа = Значения.Родитель;
Результат.Наименование = Значения.Наименование;
Результат.Используется = Значения.Используется;
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает структуру параметров вида контактной информации для определенного типа.
//
// Параметры:
// ТипИлиВидКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации, Строка - тип контактной информации,
// - СправочникСсылка.ВидыКонтактнойИнформации- вид контактной информации для
// заполнения свойства НастройкиПроверки.
//
// Возвращаемое значение:
// Структура - содержит структуру с полями:
// * Имя - Строка - Уникальное имя вида контактной информации.
// * Наименование - Строка - Наименование вида контактной информации.
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации, Строка - Ссылка на вид контактной информации или
// идентификатор предопределенного элемента.
// * Группа - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на группу(родителя) элемента справочника.
// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации или его идентификатор.
// * Порядок - Число, Неопределено - Порядок вида контактной информации, положение в списке относительно других элементов:
// Неопределено - не переназначать;
// 0 - назначить автоматически;
// Число > 0 - назначить указанный порядок.
// Примечание. При использовании параметра Порядок следует внимательно следить
// за уникальностью назначаемого значения. Если после выполнения обновления
// значения порядка окажутся неуникальными в пределах группы, то настройка
// порядка пользователем будет невозможна. В общем случае рекомендуется не
// использовать этот параметр (порядок не изменится), либо заполнять его
// значением 0 (порядок будет назначен автоматически в подсистеме "Настройка
// порядка элементов" при выполнении процедуры). Для размещения видов КИ в
// определенной последовательности относительно друг друга без явного
// размещения в начале списка достаточно вызывать данную процедуру в нужной
// последовательности для каждого вида КИ с указанием порядка 0. Если
// добавляется предопределенный вид КИ к уже существующим в ИБ, не
// рекомендуется назначать порядок в явном виде.
// * МожноИзменятьСпособРедактирования - Булево -Признак возможности изменения свойств вида контактной информации пользователем.
// Если Ложь, то в форме вида контактной информации свойства доступны только для просмотра.
// Значение по умолчанию - Ложь.
// * РедактированиеТолькоВДиалоге - Булево - Если Истина, то форме выводится гиперссылка с представлением контактной информации
// по нажатию на которую, открывается форма соответствующего типа КИ.
// Свойство применимо только для контактной информации с типом: Адрес, Телефон, Факс, ВебСтраница.
// Значение по умолчанию - Ложь.
// * ХранитьИсториюИзменений - Булево - Признак возможности хранения истории контактной информации.
// Хранение истории допускается, если признак РедактированиеТолькоВДиалоге равен Истина.
// Свойство применимо если табличная часть КонтактнаяИнформация содержит реквизит ДействуетС.
// Значение по умолчанию - Ложь.
// * ОбязательноеЗаполнение - Булево - Если Истина, то требуется обязательный ввод значения в поле
// контактной информации. Значение по умолчанию - Ложь.
// * РазрешитьВводНесколькихЗначений - Булево - Признак возможности ввода нескольких значений для данного вида.
// Значение по умолчанию - Ложь.
// * ЗапретитьРедактированиеПользователем - Булево - Признак недоступности редактирования пользователем
// вида контактной информации. Значение по умолчанию - Ложь.
// * Используется - Булево - Если Ложь, то вид контактной информации недоступен для использования пользователем.
// Такой вид не выводится в формах и списке видов контактной информации.
// Значение по умолчанию - Истина.
// * МеждународныйФорматАдреса - Булево - Признак международного формата адреса.
// Если Истина, то ввода всех адресов только в международном формате.
// Значение по умолчанию - Ложь.
// * ВидПоляДругое - Строка - Определяет внешний вид поля с типом Другое на форме.
// Варианты: МногострочноеШирокое, ОднострочноеШирокое, ОднострочноеУзкое.
// Свойство применимо только для контактной информации с типом: Другое.
// Для вида КИ с типом Другое значение по умолчанию - "ОднострочноеШирокое", иначе пустая строка.
// * НастройкиПроверки - Структура, Неопределено - Настройки проверки вида контактной информации.
// Состав полей зависит от типа контактной информации.
// Для типа Адрес - Структура, содержащая поля:
// * ТолькоНациональныйАдрес - Булево - если Истина, то разрешается ввод только национальных адресов.
// Изменение страны у адреса не допускается.
// * ПроверятьКорректность - Булево - если Истина, то для национальных адресов доступен ввод только адресов с разбивкой
// по полям проходящих проверку по ФИАС. Допускается ввод адресов других стран
// в свободной форме, если свойство ТолькоНациональныйАдрес = Ложь.
// Значение по умолчанию - Ложь.
// * ВключатьСтрануВПредставление - Булево - если Истина, то Наименование страны всегда добавляется в представление адреса,
// даже когда другие поля адреса пустые.
// Значение по умолчанию - Ложь
// * УказыватьОКТМО - Булево - признак возможности ручного ввода кода ОКМТО в форме ввода адреса.
// Для типа АдресЭлектроннойПочты - Структура, содержащая поля:
// * ПроверятьКорректность - Булево - если Истина, то запрещается пользователю ввод
// некорректный адрес электронной почты.
// Значение по умолчанию - Ложь.
// Для типа Телефон - Структура, содержащая поля:
// * ТелефонCДобавочнымНомером - Булево - если Истина, то в форме ввода телефона доступен ввод добавочного номера.
// Значение по умолчанию - Истина.
// Для остальных типов по умолчанию - Неопределено.
//
Функция ПараметрыВидаКонтактнойИнформации(ТипИлиВидКонтактнойИнформации = Неопределено) Экспорт
Если ТипЗнч(ТипИлиВидКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
ПараметрыВида = ПараметрыИзВидаКонтактнойИнформации(ТипИлиВидКонтактнойИнформации);
Иначе
Если ТипЗнч(ТипИлиВидКонтактнойИнформации) = Тип("Строка") Тогда
УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации[ТипИлиВидКонтактнойИнформации];
Иначе
УстанавливаемыйТип = ТипИлиВидКонтактнойИнформации;
КонецЕсли;
ПараметрыВида = ОписаниеПараметровКонтактнойИнформации(УстанавливаемыйТип);
КонецЕсли;
Возврат ПараметрыВида;
КонецФункции
// Записывает контактную информацию из XML в поля табличной части Контактная информация объекта.
//
// Параметры:
// Объект - ЛюбаяСсылка - ссылка на объект конфигурации, содержащий табличную часть контактная информация.
// Значение - Строка - контактная информация в внутреннем формате JSON.
// ВидИнформации - Справочник.ВидыКонтактнойИнформация - ссылка на вид контактной информации.
// ТипИнформации - Перечисление.ТипыКонтактнойИнформация - тип контактной информации.
// ИдентификаторСтроки - Число - идентификатор строки табличной части.
// Дата - Дата - Дата, с которой действует запись контактной информации,
// используется при хранении истории изменения контактной информации.
Процедура ЗаписатьКонтактнуюИнформацию(Объект, Знач Значение, ВидИнформации, ТипИнформации, ИдентификаторСтроки = 0, Дата = Неопределено) Экспорт
Если ПустаяСтрока(Значение) Тогда
Возврат;
КонецЕсли;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Значение) Тогда
ОбъектКИ = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(Значение, ТипИнформации);
Иначе
ОбъектКИ = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Значение, ТипИнформации);
КонецЕсли;
Если Не УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияЗаполнена(ОбъектКИ) Тогда
Возврат;
КонецЕсли;
НоваяСтрока = Объект.КонтактнаяИнформация.Добавить();
НоваяСтрока.Представление = ОбъектКИ.Value;
НоваяСтрока.Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(ОбъектКИ);
НоваяСтрока.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзJSONВXML(ОбъектКИ, ТипИнформации);
НоваяСтрока.Вид = ВидИнформации;
НоваяСтрока.Тип = ТипИнформации;
Если ЗначениеЗаполнено(Дата) Тогда
НоваяСтрока.ДействуетС = Дата;
КонецЕсли;
Если ЗначениеЗаполнено(ИдентификаторСтроки) Тогда
НоваяСтрока.ИдентификаторСтрокиТабличнойЧасти = ИдентификаторСтроки;
КонецЕсли;
// Заполнение дополнительных реквизитов ТЧ.
ЗаполнитьТехническиеПоляКонтактнойИнформации(НоваяСтрока, ОбъектКИ, ТипИнформации);
КонецПроцедуры
// Обновляет представление контактной информации в служебном поле ВидДляСписка,
// используемое для вывода ее в динамических списках и отчетах.
//
// Параметры:
// Объект - ОбъектСсылка - ссылка на объект конфигурации, содержащий табличную часть контактная информация.
//
Процедура ОбновитьКонтактнуюИнформациюДляСписков(Объект = Неопределено) Экспорт
Если Объект = Неопределено Тогда
УправлениеКонтактнойИнформациейСлужебный.ОбновитьКонтактнуюИнформациюДляСписков();
Иначе
Если Объект.Метаданные().ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ВидДляСписка") <> Неопределено Тогда
УправлениеКонтактнойИнформациейСлужебный.ОбновитьКонтактнуюИнформациюДляСписковДляОбъекта(Объект);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Выполняет отложенное обновление контактной информации для списков.
//
// Параметры:
// Параметры - Структура - параметры обработчика обновления.
// РазмерПорции - Число - необязательный параметр, размер порции обрабатываемых данных за один запуск.
//
Процедура ОбновитьКонтактнуюИнформациюДляСписковОтложенно(Параметры, РазмерПорции = 1000) Экспорт
ОбъектыСВидомДляСписка = Неопределено;
Параметры.Свойство("ОбъектыСВидомДляСписка", ОбъектыСВидомДляСписка);
Если Параметры.ПрогрессВыполнения.ВсегоОбъектов = 0 Тогда
// расчет количества
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка,
|ВЫБОР
| КОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида <> """"
| ТОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида
| ИНАЧЕ ВидыКонтактнойИнформации.ИмяПредопределенныхДанных
|КОНЕЦ КАК ИмяПредопределенногоВида
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ГДЕ
| ВидыКонтактнойИнформации.ЭтоГруппа = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ОбъектыСВидомДляСписка = Новый Массив;
ТекстЗапроса = "";
Разделитель = "";
ШаблонЗапроса = "ВЫБРАТЬ
| КОЛИЧЕСТВО(ТаблицаСКонтактнойИнформацией.Ссылка) КАК Количество,
| ТИПЗНАЧЕНИЯ(ТаблицаСКонтактнойИнформацией.Ссылка) КАК Ссылка
|ИЗ
| %1.%2 КАК ТаблицаСКонтактнойИнформацией
| СГРУППИРОВАТЬ ПО
| ТИПЗНАЧЕНИЯ(ТаблицаСКонтактнойИнформацией.Ссылка)";
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если СтрНачинаетсяС(ВыборкаДетальныеЗаписи.ИмяПредопределенногоВида, "Справочник") Тогда
ИмяОбъекта = Сред(ВыборкаДетальныеЗаписи.ИмяПредопределенногоВида, СтрДлина("Справочник") + 1);
Если Метаданные.Справочники.Найти(ИмяОбъекта) <> Неопределено Тогда
КонтактнаяИнформация = Метаданные.Справочники[ИмяОбъекта].ТабличныеЧасти.КонтактнаяИнформация;
Если КонтактнаяИнформация.Реквизиты.Найти("ВидДляСписка") <> Неопределено Тогда
ТекстЗапроса = ТекстЗапроса + Разделитель + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, "Справочник", ИмяОбъекта);
Разделитель = " ОБЪЕДИНИТЬ ВСЕ ";
КонецЕсли;
КонецЕсли;
ИначеЕсли СтрНачинаетсяС(ВыборкаДетальныеЗаписи.ИмяПредопределенногоВида, "Документ") Тогда
ИмяОбъекта = Сред(ВыборкаДетальныеЗаписи.ИмяПредопределенногоВида, СтрДлина("Документ") + 1);
Если Метаданные.Документы.Найти(ИмяОбъекта) <> Неопределено Тогда
КонтактнаяИнформация = Метаданные.Документы[ИмяОбъекта].ТабличныеЧасти.КонтактнаяИнформация;
Если КонтактнаяИнформация.Реквизиты.Найти("ВидДляСписка") <> Неопределено Тогда
ТекстЗапроса = ТекстЗапроса + Разделитель + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, "Документ", ИмяОбъекта);
Разделитель = " ОБЪЕДИНИТЬ ВСЕ ";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(ТекстЗапроса) Тогда
Параметры.ОбработкаЗавершена = Ложь;
Возврат;
КонецЕсли;
Запрос = Новый Запрос(ТекстЗапроса);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Количество = 0;
ОбъектыСВидомДляСписка = Новый Массив;
Пока РезультатЗапроса.Следующий() Цикл
Количество = Количество + РезультатЗапроса.Количество;
ОбъектыСВидомДляСписка.Добавить(РезультатЗапроса.Ссылка);
КонецЦикла;
Параметры.ПрогрессВыполнения.ВсегоОбъектов = Количество;
Параметры.Вставить("ОбъектыСВидомДляСписка", ОбъектыСВидомДляСписка);
КонецЕсли;
Если ОбъектыСВидомДляСписка = Неопределено ИЛИ ОбъектыСВидомДляСписка.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ПолноеИмяОбъектаСВидомДляСписка = Метаданные.НайтиПоТипу(ОбъектыСВидомДляСписка.Получить(0)).ПолноеИмя();
ТекстЗапроса = " ВЫБРАТЬ ПЕРВЫЕ " + Формат(РазмерПорции, "ЧГ=0") + "
| КонтактнаяИнформация.Ссылка КАК Ссылка
|ИЗ
| " + ПолноеИмяОбъектаСВидомДляСписка + ".КонтактнаяИнформация КАК КонтактнаяИнформация
|
|СГРУППИРОВАТЬ ПО
| КонтактнаяИнформация.Ссылка
|
|ИМЕЮЩИЕ
| СУММА(ВЫБОР
| КОГДА КонтактнаяИнформация.ВидДляСписка = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка)
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ) = 0";
Запрос = Новый Запрос(ТекстЗапроса);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Количество = РезультатЗапроса.Количество();
Если Количество > 0 Тогда
Пока РезультатЗапроса.Следующий() Цикл
Объект = РезультатЗапроса.Ссылка.ПолучитьОбъект();
ОбновитьКонтактнуюИнформациюДляСписков(Объект);
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект);
КонецЦикла;
Если Количество < 1000 Тогда
ОбъектыСВидомДляСписка.Удалить(0);
КонецЕсли;
Параметры.ПрогрессВыполнения.ОбработаноОбъектов = Параметры.ПрогрессВыполнения.ОбработаноОбъектов + Количество;
Иначе
ОбъектыСВидомДляСписка.Удалить(0);
КонецЕсли;
Если ОбъектыСВидомДляСписка.Количество() > 0 Тогда
Параметры.ОбработкаЗавершена = Ложь;
КонецЕсли;
Параметры.Вставить("ОбъектыСВидомДляСписка", ОбъектыСВидомДляСписка);
КонецПроцедуры
// Удаляет информацию о соответствии элемента справочника виде контактной информации предопределенному значению,
// которое помечено как удаленное. Для однократного вызова в обработчиках обновления по отказу от предопределенных
// элементов справочника ВидыКонтактнойИнформации.
//
Процедура СнятьПризнакПредопределенныйДляВидовКонтактнойИнформации() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка КАК ВидКИ,
| ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
| ЕСТЬNULL(ВидыКонтактнойИнформации.Родитель.ИмяПредопределенныхДанных, """") КАК Группа,
| ВидыКонтактнойИнформации.ИмяПредопределенногоВида КАК ИмяПредопределенногоВида,
| ВидыКонтактнойИнформации.Предопределенный КАК Предопределенный
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации";
ВидыКонтактнойИнформации = Запрос.Выполнить().Выгрузить();
ВидыКонтактнойИнформации.Индексы.Добавить("ИмяПредопределенногоВида");
Для каждого Вид Из ВидыКонтактнойИнформации Цикл
Если Не Вид.Предопределенный Или Не СтрНачинаетсяС(НРег(Вид.ИмяПредопределенныхДанных), "удалить") Тогда
Продолжить;
КонецЕсли;
ИмяПредопределенногоВида = Сред(Вид.ИмяПредопределенныхДанных, СтрДлина("удалить") + 1);
Если ВидыКонтактнойИнформации.Найти(ИмяПредопределенногоВида, "ИмяПредопределенногоВида") <> Неопределено Тогда
Продолжить;
КонецЕсли;
ОбъектВидКИ = Вид.ВидКИ.ПолучитьОбъект();
Если Не ОбъектВидКИ.ЭтоГруппа Тогда
ОбъектВидКИ.ИмяГруппы = Сред(Вид.Группа, СтрДлина("удалить") + 1);
КонецЕсли;
ОбъектВидКИ.ИмяПредопределенногоВида = ИмяПредопределенногоВида;
ОбъектВидКИ.ИмяПредопределенныхДанных = "";
ОбновлениеИнформационнойБазы.ЗаписатьДанные(ОбъектВидКИ);
КонецЦикла;
КонецПроцедуры
#Область УстаревшиеПроцедурыИФункции
////////////////////////////////////////////////////////////////////////////////
// Обратная совместимость.
// Устарела. Следует использовать УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению.
// Преобразует представление контактной информации в XML строку соответствующую структуре
// XDTO пакетам КонтактнаяИнформация и Адрес.
// Для адресов, введенных в свободной форме, корректное преобразование не гарантируется.
//
// Параметры:
// Представление - Строка - Строковое представление контактной информации, выводимое пользователю.
// ОжидаемыйВид - СправочникСсылка.ВидыКонтактнойИнформации, ПеречислениеСсылка.ТипыКонтактнойИнформации,
// Структура - Вид или тип контактной информации.
//
// Возвращаемое значение:
// Строка - Контактная информация в виде XML, соответствующего структуре XDTO пакетов КонтактнаяИнформация и Адрес.
//
Функция КонтактнаяИнформацияXMLПоПредставлению(Представление, ОжидаемыйВид) Экспорт
Возврат УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(
УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(Представление, ОжидаемыйВид));
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Устанавливает доступность элементов контактной информации на форме.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения - передаваемая форма.
// Элементы - Соответствие - Список видов контактной информации, для которых устанавливается доступ.
// ** Ключ - ОбъектМетаданных - Подсистема, в которой размещается отчет или вариант отчета.
// ** Значение - Булево - Если ЛОЖЬ, то элемент доступен только для просмотра.
//
Процедура УстановитьДоступностьЭлементовКонтактнойИнформации(Форма, Элементы, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") Экспорт
Для каждого Элемент Из Элементы Цикл
Отбор = Новый Структура("Вид", Элемент.Ключ);
НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
Если НайденныеСтроки <> Неопределено Тогда
Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
ЭлементКИ = Форма.Элементы[НайденнаяСтрока.ИмяРеквизита];
ЭлементКИ.ТолькоПросмотр = НЕ Элемент.Значение;
КонецЦикла;
// Если у элемента только просмотр, то удаляем возможность добавления этого элемента на форму.
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
Если НЕ Элемент.Значение Тогда
Для каждого ЭлементКонтекстногоМеню Из ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов Цикл
Если ЭлементКонтекстногоМеню.Значение.Ссылка = Элемент.Ключ Тогда
ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Удалить(ЭлементКонтекстногоМеню);
Продолжить;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Форма.Элементы.Найти("КонтактнаяИнформацияДобавитьПолеВвода") <> Неопределено Тогда
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
Если ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Количество() = 0 Тогда
// Делаем кнопку Добавить недоступной, т.к. контекстное меню пустое.
Форма.Элементы.КонтактнаяИнформацияДобавитьПолеВвода.Доступность = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Дополняет список колонки для загрузки данных колонками контактной информации.
//
// Параметры:
// МетаданныеСправочника - ОбъектМетаданных - Метаданные справочника.
// ИнформацияПоКолонкам - ТаблицаЗначение - колонки макета.
//
Процедура КолонкиДляЗагрузкиДанных(МетаданныеСправочника, ИнформацияПоКолонкам) Экспорт
Если МетаданныеСправочника.ТабличныеЧасти.Найти("КонтактнаяИнформация") = Неопределено Тогда
Возврат;
КонецЕсли;
Позиция = ИнформацияПоКолонкам.Количество() + 1;
ВидыКонтактнойИнформации = ВидыКонтактнойИнформацияОбъекта(Справочники[МетаданныеСправочника.Имя].ПустаяСсылка());
Для каждого ВидКонтактнойИнформации Из ВидыКонтактнойИнформации Цикл
ИмяКолонки = "КонтактнаяИнформация_" + СтандартныеПодсистемыСервер.ПреобразоватьСтрокуВДопустимоеНаименованиеКолонки(ВидКонтактнойИнформации.Наименование);
Если ИнформацияПоКолонкам.Найти(ИмяКолонки, "ИмяКолонки") = Неопределено Тогда
СтрокаИнфоПроКолонки = ИнформацияПоКолонкам.Добавить();
СтрокаИнфоПроКолонки.ИмяКолонки = ИмяКолонки;
СтрокаИнфоПроКолонки.ПредставлениеКолонки = ВидКонтактнойИнформации.Представление;
СтрокаИнфоПроКолонки.ТипКолонки = Новый ОписаниеТипов("Строка");
СтрокаИнфоПроКолонки.ОбязательнаДляЗаполнения = Ложь;
СтрокаИнфоПроКолонки.Позиция = Позиция;
СтрокаИнфоПроКолонки.Группа = НСтр("ru = 'Контактная информация'");
СтрокаИнфоПроКолонки.Видимость = Истина;
СтрокаИнфоПроКолонки.Ширина = 30;
Позиция = Позиция + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Виды контактной информация объекта.
//
// Параметры:
// ВладелецКонтактнойИнформации - Ссылка на владельца контактной информации.
// Объект владельца контактной информации.
// ДанныеФормыСтруктура (по типу объекта владельца свойств).
// Возвращаемое значение:
// ТаблицаЗначений - виды контактной информации.
//
Функция ВидыКонтактнойИнформацияОбъекта(ВладелецКонтактнойИнформации) Экспорт
Если ТипЗнч(ВладелецКонтактнойИнформации) = Тип("ДанныеФормыСтруктура") Тогда
ТипСсылки = ТипЗнч(ВладелецКонтактнойИнформации.Ссылка)
ИначеЕсли ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ВладелецКонтактнойИнформации)) Тогда
ТипСсылки = ТипЗнч(ВладелецКонтактнойИнформации);
Иначе
ТипСсылки = ТипЗнч(ВладелецКонтактнойИнформации.Ссылка)
КонецЕсли;
МетаданныеСправочника = Метаданные.НайтиПоТипу(ТипСсылки);
ПолноеИмяОбъектаМетаданных = МетаданныеСправочника.ПолноеИмя();
ИмяГруппыВидовКИ = СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", "");
ГруппаВидовКИ = Неопределено;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка КАК Ссылка,
|ВЫБОР
| КОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида <> """"
| ТОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида
| ИНАЧЕ ВидыКонтактнойИнформации.ИмяПредопределенныхДанных
|КОНЕЦ КАК ИмяПредопределенногоВида
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ГДЕ
| ВидыКонтактнойИнформации.ЭтоГруппа = ИСТИНА
| И ВидыКонтактнойИнформации.ПометкаУдаления = ЛОЖЬ
| И ВидыКонтактнойИнформации.Используется = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Пока РезультатЗапроса.Следующий() Цикл
Если СтрСравнить(РезультатЗапроса.ИмяПредопределенногоВида, ИмяГруппыВидовКИ) = 0 Тогда
ГруппаВидовКИ = РезультатЗапроса.Ссылка;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ЗначениеЗаполнено(ГруппаВидовКИ) Тогда
Возврат Новый ТаблицаЗначений;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка,
| ВидыКонтактнойИнформации.Представление,
| ВидыКонтактнойИнформации.Наименование,
| ВидыКонтактнойИнформации.РазрешитьВводНесколькихЗначений,
| ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания,
| ВидыКонтактнойИнформации.Тип
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ГДЕ
| ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ
| И ВидыКонтактнойИнформации.ПометкаУдаления = ЛОЖЬ
| И ВидыКонтактнойИнформации.Используется = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| РеквизитДопУпорядочивания";
Запрос.УстановитьПараметр("ГруппаВидовКИ", ГруппаВидовКИ);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Возврат РезультатЗапроса;
КонецФункции
// Возвращает тип контактной информации.
//
// Параметры:
// Наименование - Строка - Тип контактной информация в виде строки.
//
// Возвращаемое значение:
// ПеречислениеСсылка.ТипыКонтактнойИнформации - соответствующий тип.
//
Функция ТипКонтактнойИнформацииПоНаименованию(Знач Наименование) Экспорт
Возврат Перечисления.ТипыКонтактнойИнформации[Наименование];
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
////////////////////////////////////////////////////////////////////////////////
// Инициализация элементов на форме объект-владельца контактной информации.
Процедура ОпределитьПараметрыКонтактнойИнформацииПоВладельцу(Форма, Объект, ПараметрыКонтактнойИнформации, ЭтоПараметрыОсновногоОбъекта, СкрываемыеВиды)
СкрываемыеВиды = Новый Массив;
Для каждого ПараметрКонтактнойИнформации Из Форма.ПараметрыКонтактнойИнформации Цикл
Если ПараметрКонтактнойИнформации.Значение.Владелец = Объект.Ссылка
Или Форма.ПараметрыКонтактнойИнформации.Количество() = 1 Тогда
ПараметрыКонтактнойИнформации = ПараметрКонтактнойИнформации.Значение;
СкрываемыеВиды = ПараметрыКонтактнойИнформации.СкрываемыеВиды;
Возврат;
КонецЕсли;
ЭтоПараметрыОсновногоОбъекта = Ложь;
КонецЦикла;
КонецПроцедуры
Процедура СоздатьРеквизитыКонтактнойИнформации(Знач Форма, Знач ДобавляемыеРеквизиты, Знач ИмяОбъекта, Знач ИсключаемыеВиды,
Знач КонтактнаяИнформация, Знач ОтложеннаяИнициализация, Знач ОбработкаНавигационнойСсылки)
Строка1500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(1500));
ФорматированнаяСтрока = Новый ОписаниеТипов("ФорматированнаяСтрока");
СозданныеРеквизиты = ОбщегоНазначения.СкопироватьРекурсивно(ИсключаемыеВиды);
ПредыдущийВид = Неопределено;
ПорядковыйНомер = 1;
Для Каждого ОбъектКонтактнойИнформации Из КонтактнаяИнформация Цикл
Если ОбъектКонтактнойИнформации.ЭтоРеквизитТабличнойЧасти Тогда
ИмяВидаКИ = ОбъектКонтактнойИнформации.ИмяПредопределенногоВида;
Позиция = СтрНайти(ИмяВидаКИ, ИмяОбъекта);
ИмяТабличнойЧасти = Сред(ИмяВидаКИ, Позиция + СтрДлина(ИмяОбъекта));
ПредыдущийВид = Неопределено;
ИмяРеквизита = "";
ОбъектКонтактнойИнформации.Строки.Сортировать("РеквизитДопУпорядочивания");
Для Каждого СтрокаКИ Из ОбъектКонтактнойИнформации.Строки Цикл
ТекущийВид = СтрокаКИ.Вид;
Если ТекущийВид <> ПредыдущийВид Тогда
ИмяРеквизита = "КонтактнаяИнформацияПоле" + ИмяТабличнойЧасти + СтрЗаменить(ТекущийВид.УникальныйИдентификатор(), "-", "x")
+ ОбъектКонтактнойИнформации.Строки.Индекс(СтрокаКИ);
ПутьРеквизитов = "Объект." + ИмяТабличнойЧасти;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита, Строка1500, ПутьРеквизитов, СтрокаКИ.Наименование, Истина));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита + "Значение", Новый ОписаниеТипов("Строка"), ПутьРеквизитов,, Истина));
ПредыдущийВид = ТекущийВид;
КонецЕсли;
СтрокаКИ.ИмяРеквизита = ИмяРеквизита;
КонецЦикла;
Иначе
Если ОбъектКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда
СкорректироватьКонтактнуюИнформацию(Форма, ОбъектКонтактнойИнформации);
Продолжить;
КонецЕсли;
ТекущийВид = ОбъектКонтактнойИнформации.Вид;
Если ТекущийВид <> ПредыдущийВид Тогда
ПредыдущийВид = ТекущийВид;
ПорядковыйНомер = 1;
Иначе
ПорядковыйНомер = ПорядковыйНомер + 1;
КонецЕсли;
Индекс = СозданныеРеквизиты.Найти(ТекущийВид);
Если Индекс = Неопределено Тогда
ОбъектКонтактнойИнформации.ИмяРеквизита = "КонтактнаяИнформацияПоле" + СтрЗаменить(ТекущийВид.УникальныйИдентификатор(), "-", "x")
+ ПорядковыйНомер;
Если Не ОтложеннаяИнициализация Тогда
ТипРеквизита = Строка1500;
Если ОбъектКонтактнойИнформации.Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница И ОбработкаНавигационнойСсылки Тогда
ТипРеквизита = ФорматированнаяСтрока;
КонецЕсли;
ДобавляемыеРеквизиты.Добавить(
Новый РеквизитФормы(ОбъектКонтактнойИнформации.ИмяРеквизита, ТипРеквизита,, ОбъектКонтактнойИнформации.Наименование, Истина));
КонецЕсли;
Иначе
ОбъектКонтактнойИнформации.ИмяРеквизита = "КонтактнаяИнформацияПоле" + ОбъектКонтактнойИнформации.ИмяПредопределенногоВида;
СозданныеРеквизиты.Удалить(Индекс);
КонецЕсли;
СкорректироватьКонтактнуюИнформацию(Форма, ОбъектКонтактнойИнформации);
КонецЕсли;
КонецЦикла;
// Добавим новые реквизиты
Если ДобавляемыеРеквизиты.Количество() > 0 Тогда
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
КонецЕсли;
КонецПроцедуры
Процедура СкрытьКонтактнуюИнформацию(Знач Форма, Знач ДобавляемыеРеквизиты, ПараметрыВывода)
Если ДобавляемыеРеквизиты.Количество() > 0 Тогда
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
КонецЕсли;
ДобавленныеРеквизиты = Новый Массив;
Для Каждого ДобавляемыйРеквизит Из ДобавляемыеРеквизиты Цикл
Если ПустаяСтрока(ДобавляемыйРеквизит.Путь) Тогда
ДобавленныеРеквизиты.Добавить(ДобавляемыйРеквизит.Имя);
КонецЕсли;
КонецЦикла;
ПараметрыКонтактнойИнформации = ПараметрыВыводаКонтактнойИнформации(Форма, ПараметрыВывода.ИмяЭлементаДляРазмещения,
ПараметрыВывода.ПоложениеЗаголовкаКИ, ПараметрыВывода.ОтложеннаяИнициализация,
ПараметрыВывода.ИсключаемыеВиды, ПараметрыВывода.СкрываемыеВиды);
ПараметрыКонтактнойИнформации.ДобавленныеРеквизиты = ДобавленныеРеквизиты;
ПараметрыКонтактнойИнформации.Владелец = ПараметрыВывода.СсылкаНаОбъект;
Если Не ПустаяСтрока(ПараметрыВывода.ИмяЭлементаДляРазмещения) Тогда
Форма.Элементы[ПараметрыВывода.ИмяЭлементаДляРазмещения].Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьКнопкуДополнительногоПоляКонтактнойИнформации(Знач Форма, Знач ИмяЭлементаДляРазмещения)
Описание = НСтр("ru = 'Добавить дополнительное поле контактной информации'");
ГруппаКоманды = Группа("ГруппаКонтактнаяИнформацияДобавитьПолеВвода" + ИмяЭлементаДляРазмещения, Форма, Описание, ИмяЭлементаДляРазмещения);
ГруппаКоманды.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение;
ИмяКоманды = "КонтактнаяИнформацияДобавитьПолеВвода" + ИмяЭлементаДляРазмещения;
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Подсказка = Описание;
Команда.Отображение = ОтображениеКнопки.КартинкаИТекст;
Команда.Картинка = БиблиотекаКартинок.ДобавитьЭлементСписка;
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаКоманды);
Кнопка.Доступность = НЕ Форма.Элементы[ИмяЭлементаДляРазмещения].ТолькоПросмотр;
Кнопка.Заголовок = НСтр("ru = 'Добавить'");
Команда.ИзменяетСохраняемыеДанные = Истина;
Кнопка.ИмяКоманды = ИмяКоманды;
Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].ДобавленныеЭлементы.Добавить(ИмяКоманды, 2, Ложь);
КонецПроцедуры
Процедура ДобавитьПояснениеПоСбросуНастроекФормы(Знач Форма, Знач ИмяЭлементаДляРазмещения, Знач ОтложеннаяИнициализация)
ГруппаДляРазмещения = Форма.Элементы[ИмяЭлементаДляРазмещения];
// Если отложенная инициализация и на странице нет элементов, то платформа скрывает страницу,
// поэтому надо создавать временный элемент, который при переходе на страницу удаляется.
Если ОтложеннаяИнициализация
И ГруппаДляРазмещения.Вид = ВидГруппыФормы.Страница
И Форма.Элементы.Найти("КонтактнаяИнформацияЗаглушка") = Неопределено Тогда
ГруппаСтраниц = ГруппаДляРазмещения.Родитель;
ЗаголовокСтраницы = ?(ЗначениеЗаполнено(ГруппаДляРазмещения.Заголовок), ГруппаДляРазмещения.Заголовок, ГруппаДляРазмещения.Имя);
ЗаголовокГруппыСтраниц = ?(ЗначениеЗаполнено(ГруппаСтраниц.Заголовок), ГруппаСтраниц.Заголовок, ГруппаСтраниц.Имя);
ПредупреждениеОРазмещении = НСтр("ru = 'Для отображения контактной информации необходимо разместить группу ""%1"" не первым элементом (после любой другой группы) в группе ""%2"" (меню Еще - Изменить форму).'");
ПредупреждениеОРазмещении = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПредупреждениеОРазмещении,
ЗаголовокСтраницы, ЗаголовокГруппыСтраниц);
ТекстПодсказки = НСтр("ru = 'Также можно установить стандартные настройки формы:
| • в меню Еще выбрать пункт Изменить форму...;
| • в открывшейся форме ""Настройка формы"" в меню Еще выбрать пункт ""Установить стандартные настройки"".'");
Декорация = Форма.Элементы.Добавить("КонтактнаяИнформацияЗаглушка", Тип("ДекорацияФормы"), ГруппаДляРазмещения);
Декорация.Заголовок = ПредупреждениеОРазмещении;
Декорация.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
Декорация.Подсказка = ТекстПодсказки;
Декорация.ЦветТекста = ЦветаСтиля.ПоясняющийОшибкуТекст;
Декорация.АвтоМаксимальнаяВысота = Ложь;
КонецЕсли;
КонецПроцедуры
Функция ЗаголовокСлева(Знач ПоложениеЗаголовкаКИ = Неопределено)
Если ЗначениеЗаполнено(ПоложениеЗаголовкаКИ) Тогда
ПоложениеЗаголовкаКИ = ПредопределенноеЗначение(ПоложениеЗаголовкаКИ);
Иначе
ПоложениеЗаголовкаКИ = ПоложениеЗаголовкаЭлементаФормы.Лево;
КонецЕсли;
Возврат (ПоложениеЗаголовкаКИ = ПоложениеЗаголовкаЭлементаФормы.Лево);
КонецФункции
Процедура ИзменитьКомментарий(Форма, ИмяРеквизита, ИмяЭлементаДляРазмещения)
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
Если ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.НайтиПоЗначению(ИмяРеквизита) = Неопределено Тогда
Возврат;
КонецЕсли;
ОписаниеКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
Отбор = Новый Структура("ИмяРеквизита", ИмяРеквизита);
НайденнаяСтрока = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0];
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(НайденнаяСтрока.Значение) Тогда
КонтактнаяИнформацияПоПолям = УправлениеКонтактнойИнформациейСлужебный.СтрокуJSONВСтруктуру(НайденнаяСтрока.Значение);
КонтактнаяИнформацияПоПолям.Comment = НайденнаяСтрока.Комментарий;
НайденнаяСтрока.Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(КонтактнаяИнформацияПоПолям);
КонецЕсли;
ПолеВвода = Форма.Элементы.Найти(ИмяРеквизита);
ПолеВвода.РасширеннаяПодсказка.Заголовок = НайденнаяСтрока.Комментарий;
КонецПроцедуры
Процедура ДобавитьСтрокуКонтактнойИнформации(Форма, Результат, ИмяЭлементаДляРазмещения, ЭтоНовыйВидКИ = Ложь, КоличествоАдресов = Неопределено, СледующаяСтрока = Неопределено)
ДобавлениеНовогоЗначения = ТипЗнч(Результат) = Тип("Структура");
Если ДобавлениеНовогоЗначения Тогда
Результат.Свойство("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения);
ДобавляемыйВид = Результат.ДобавляемыйВид;
Если ТипЗнч(ДобавляемыйВид)= Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
ИнформацияОВидеКИ = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДобавляемыйВид, "Тип, Наименование, РедактированиеТолькоВДиалоге, ВидПоляДругое");
Иначе
ИнформацияОВидеКИ = ДобавляемыйВид;
ДобавляемыйВид = ДобавляемыйВид.Ссылка;
КонецЕсли;
Иначе
ИнформацияОВидеКИ = Результат;
ДобавляемыйВид = Результат.Вид;
КонецЕсли;
ТаблицаКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
ОтборПоВиду = Новый Структура("Вид, ЭтоИсторическаяКонтактнаяИнформация", ДобавляемыйВид, Ложь);
Если ДобавлениеНовогоЗначения Тогда
НайденныеСтроки = ТаблицаКонтактнойИнформации.НайтиСтроки(ОтборПоВиду);
КоличествоСтрокВида = НайденныеСтроки.Количество();
Если КоличествоСтрокВида > 0 Тогда
ПоследняяСтрока = НайденныеСтроки.Получить(КоличествоСтрокВида - 1);
ИндексДобавляемойСтроки = ТаблицаКонтактнойИнформации.Индекс(ПоследняяСтрока) + 1;
Иначе
ИндексДобавляемойСтроки = 0;
КонецЕсли;
ЭтоПоследняяСтрока = Ложь;
Если ИндексДобавляемойСтроки = ТаблицаКонтактнойИнформации.Количество() Тогда
ЭтоПоследняяСтрока = Истина;
КонецЕсли;
НоваяСтрока = ТаблицаКонтактнойИнформации.Вставить(ИндексДобавляемойСтроки);
ИмяРеквизита = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1%2%3",
"КонтактнаяИнформацияПоле",
СтрЗаменить(ДобавляемыйВид.УникальныйИдентификатор(), "-", "x"),
КоличествоСтрокВида + 1);
НоваяСтрока.ИмяРеквизита = ИмяРеквизита;
НоваяСтрока.Вид = ДобавляемыйВид;
НоваяСтрока.Тип = ИнформацияОВидеКИ.Тип;
НоваяСтрока.ИмяЭлементаДляРазмещения = ИмяЭлементаДляРазмещения;
НоваяСтрока.ЭтоРеквизитТабличнойЧасти = Ложь;
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки;
Если ОбработкаНавигационнойСсылки = Истина Тогда
ОписаниеТипаРеквизита = Новый ОписаниеТипов("ФорматированнаяСтрока");
Иначе
ОписаниеТипаРеквизита = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500));
КонецЕсли;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, ОписаниеТипаРеквизита,, ИнформацияОВидеКИ.Наименование, Истина));
Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
ЕстьКомментарий = Ложь;
ОбязательноеЗаполнение = Ложь;
Иначе
ЭтоПоследняяСтрока = СледующаяСтрока = Неопределено;
ИмяРеквизита = ИнформацияОВидеКИ.ИмяРеквизита;
ЕстьКомментарий = ЗначениеЗаполнено(ИнформацияОВидеКИ.Комментарий);
ОбязательноеЗаполнение = ИнформацияОВидеКИ.ОбязательноеЗаполнение;
КонецЕсли;
// Отрисовка на форме
ГруппаСтроки = Группа("Группа" + ИмяРеквизита, Форма, ДобавляемыйВид.Наименование, ИмяЭлементаДляРазмещения);
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
ГруппаСтроки.ОтображатьЗаголовок = Истина;
КонецЕсли;
Родитель = Родитель(Форма, ИмяЭлементаДляРазмещения);
Если Не ЭтоПоследняяСтрока Тогда
Если СледующаяСтрока = Неопределено Тогда
ИмяСледующейГруппы = "Группа" + ПоследняяСтрока.ИмяРеквизита;
Если Форма.Элементы.Найти(ИмяСледующейГруппы) <> Неопределено Тогда
ИндексСледующейГруппы = Родитель.ПодчиненныеЭлементы.Индекс(Форма.Элементы[ИмяСледующейГруппы]) + 1;
СледующаяГруппа = Родитель.ПодчиненныеЭлементы.Получить(ИндексСледующейГруппы);
КонецЕсли;
Иначе
ИмяГруппы = "Группа" + СледующаяСтрока.ИмяРеквизита;
Если Форма.Элементы.Найти(ИмяГруппы) <> Неопределено Тогда
СледующаяГруппа = Форма.Элементы[ИмяГруппы];
КонецЕсли;
КонецЕсли;
Форма.Элементы.Переместить(ГруппаСтроки, Родитель, СледующаяГруппа);
ИначеЕсли ДобавлениеНовогоЗначения Тогда
СледующаяГруппа = Форма.Элементы[Результат.ИмяКоманды].Родитель;
Форма.Элементы.Переместить(ГруппаСтроки, Родитель, СледующаяГруппа);
КонецЕсли;
// Обработка ситуации, когда на форме выводится одновременно множественная динамическая и статическая контактная информация.
ИмяСледующейГруппыТекущегоВида = "Группа" + ИмяРеквизита;
Если Форма.Элементы.Найти(ИмяСледующейГруппыТекущегоВида) <> Неопределено Тогда
Отбор = Новый Структура("ИмяРеквизита", ИмяРеквизита);
НайденныеСтрокиТекущегоВида = ТаблицаКонтактнойИнформации.НайтиСтроки(Отбор);
Если НайденныеСтрокиТекущегоВида.Количество() > 0 Тогда
ТекущийВид = НайденныеСтрокиТекущегоВида[0].Вид;
КонецЕсли;
ИндексПредыдущейГруппыВида = Родитель.ПодчиненныеЭлементы.Индекс(Форма.Элементы[ИмяСледующейГруппыТекущегоВида]) - 1;
Если ИндексПредыдущейГруппыВида >= 0 Тогда
ПредыдущаяГруппаВида = Родитель.ПодчиненныеЭлементы.Получить(ИндексПредыдущейГруппыВида);
Если ПредыдущаяГруппаВида <> Неопределено Тогда
Отбор = Новый Структура("ИмяРеквизита", СтрЗаменить(ПредыдущаяГруппаВида.Имя, "Группа", ""));
НайденныеСтрокиПредыдущегоВида = ТаблицаКонтактнойИнформации.НайтиСтроки(Отбор);
Если НайденныеСтрокиПредыдущегоВида.Количество() > 0 Тогда
ПредыдущийВид = НайденныеСтрокиПредыдущегоВида[0].Вид;
КонецЕсли;
Если ТекущийВид <> ПредыдущийВид Тогда
ЭтоНовыйВидКИ = Истина;
КонецЕсли;
КонецЕсли;
Иначе
ЭтоНовыйВидКИ = Истина;
КонецЕсли;
КонецЕсли;
ПолеВвода = СоздатьПолеВвода(Форма, ГруппаСтроки, ИнформацияОВидеКИ, ИмяРеквизита, ИмяЭлементаДляРазмещения, ЭтоНовыйВидКИ, ОбязательноеЗаполнение);
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
КонецЕсли;
Если ЕстьКомментарий Тогда
ПолеВвода.РасширеннаяПодсказка.Заголовок = ИнформацияОВидеКИ.Комментарий;
ПолеВвода.РасширеннаяПодсказка.АвтоМаксимальнаяШирина = Ложь;
ПолеВвода.РасширеннаяПодсказка.МаксимальнаяШирина = ПолеВвода.Ширина;
ПолеВвода.РасширеннаяПодсказка.Ширина = ПолеВвода.Ширина;
КонецЕсли;
Если КоличествоАдресов = Неопределено Тогда
ОтборПоТипу = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
КоличествоАдресов = ТаблицаКонтактнойИнформации.НайтиСтроки(ОтборПоТипу).Количество();
КонецЕсли;
СоздатьДействие(Форма, ИнформацияОВидеКИ, ИмяРеквизита, ГруппаСтроки, КоличествоАдресов, ЕстьКомментарий, ИмяЭлементаДляРазмещения);
Если Не ЭтоНовыйВидКИ Тогда
Если ТаблицаКонтактнойИнформации.Количество() > 1 И ТаблицаКонтактнойИнформации[0].Свойство("ЭтоИсторическаяКонтактнаяИнформация") Тогда
ПунктКонтекстногоМенюПеремещения(ПолеВвода, Форма, 1, ИмяЭлементаДляРазмещения);
НайденныеСтроки = ТаблицаКонтактнойИнформации.НайтиСтроки(ОтборПоВиду);
Если НайденныеСтроки.Количество() > 1 Тогда
ПредыдущаяСтрока = НайденныеСтроки.Получить(НайденныеСтроки.Количество() - 2);
ПунктКонтекстногоМенюПеремещения(Форма.Элементы[ПредыдущаяСтрока.ИмяРеквизита], Форма, - 1, ИмяЭлементаДляРазмещения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ДобавлениеНовогоЗначения Тогда
Форма.ТекущийЭлемент = Форма.Элементы[ИмяРеквизита];
Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес
И ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге Тогда
Результат.Вставить("ЭлементФормыАдреса", ИмяРеквизита);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция СоздатьПолеВвода(Форма, Родитель, ИнформацияОВидеКИ, ИмяРеквизита, ИмяЭлементаДляРазмещения,ЭтоНовыйВидКИ = Ложь, ОбязательноеЗаполнение = Ложь)
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки;
ЗаголовокСлева = ЗаголовокСлева(ПараметрыКонтактнойИнформации.ПоложениеЗаголовка);
Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Родитель);
Элемент.ПутьКДанным = ИмяРеквизита;
Если ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге И ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
Элемент.Вид = ВидПоляФормы.ПолеНадписи;
Элемент.Гиперссылка = Истина;
Элемент.УстановитьДействие("Нажатие", "Подключаемый_КонтактнаяИнформацияПриНажатии");
Если ПустаяСтрока(Форма[ИмяРеквизита]) Тогда
Форма[ИмяРеквизита] = УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки();
КонецЕсли;
ИначеЕсли ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница И ОбработкаНавигационнойСсылки Тогда
Элемент.Вид = ВидПоляФормы.ПолеНадписи;
Элемент.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_КонтактнаяИнформацияОбработкаНавигационнойСсылки");
Если ТипЗнч(ИнформацияОВидеКИ) <> Тип("Структура") И УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(ИнформацияОВидеКИ.Значение) Тогда
КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(ИнформацияОВидеКИ.Значение, Перечисления.ТипыКонтактнойИнформации.ВебСтраница);
АдресСайта = КонтактнаяИнформация.value;
Представление = ?(КонтактнаяИнформация.Свойство("name") И ЗначениеЗаполнено(КонтактнаяИнформация.name), КонтактнаяИнформация.name, ИнформацияОВидеКИ.Представление);
Иначе
АдресСайта = "";
Представление = УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки();
КонецЕсли;
Форма[ИмяРеквизита] = УправлениеКонтактнойИнформациейКлиентСервер.АдресСайта(Представление, АдресСайта);
Иначе
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.УстановитьДействие("Очистка", "Подключаемый_КонтактнаяИнформацияОчистка");
Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
Элемент.УстановитьДействие("Автоподбор", "Подключаемый_КонтактнаяИнформацияАвтоподбор");
Элемент.УстановитьДействие("ОбработкаВыбора", "Подключаемый_КонтактнаяИнформацияОбработкаВыбора");
КонецЕсли;
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Элемент.МногострочныйРежим = Истина;
КонецЕсли;
КонецЕсли;
Элемент.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСнизу;
Элемент.РастягиватьПоГоризонтали = Ложь;
Элемент.РастягиватьПоВертикали = Ложь;
Элемент.ВысотаЗаголовка = ?(ОбщегоНазначения.ЭтоМобильныйКлиент(), 1, 2);
Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
Элемент.Ширина = 70;
ИначеЕсли ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда
Если ИнформацияОВидеКИ.ВидПоляДругое = "МногострочноеШирокое" Тогда
Элемент.Высота = 3;
Элемент.Ширина = 70;
Элемент.МногострочныйРежим = Истина;
ИначеЕсли ИнформацияОВидеКИ.ВидПоляДругое = "ОднострочноеШирокое" Тогда
Элемент.Высота = 1;
Элемент.Ширина = 70;
Элемент.МногострочныйРежим = Ложь;
Иначе // ОднострочноеУзкое
Элемент.Высота = 1;
Элемент.Ширина = 35;
Элемент.МногострочныйРежим = Ложь;
КонецЕсли;
Иначе
Элемент.Ширина = 35;
КонецЕсли;
Если Не ЭтоНовыйВидКИ Тогда
Элемент.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Право;
Элемент.ЦветТекстаЗаголовка = ЦветаСтиля.ЦветФонаФормы;
КонецЕсли;
Элемент.ПоложениеЗаголовка = ?(ЗаголовокСлева, ПоложениеЗаголовкаЭлементаФормы.Лево, ПоложениеЗаголовкаЭлементаФормы.Верх);
Если ЗаголовокСлева Тогда
Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;
Иначе
Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;
КонецЕсли;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяРеквизита, 2, Ложь);
// Устанавливаем свойства поля ввода.
Если ИнформацияОВидеКИ.Тип <> Перечисления.ТипыКонтактнойИнформации.Другое И Не ИнформацияОВидеКИ.ПометкаУдаления Тогда
// Ввод комментария через контекстное меню.
ИмяКоманды = "КонтекстноеМеню" + ИмяРеквизита;
Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), Элемент.КонтекстноеМеню);
Кнопка.Заголовок = НСтр("ru = 'Ввести комментарий'");
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Подсказка = НСтр("ru = 'Ввести комментарий'");
Команда.Картинка = БиблиотекаКартинок.Комментарий;
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Команда.ИзменяетСохраняемыеДанные = Истина;
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
КонецЕсли;
Если ИнформацияОВидеКИ.ХранитьИсториюИзменений И Не ИнформацияОВидеКИ.ПометкаУдаления Тогда
// Вывод истории контактной информации через контекстное меню.
ИмяКоманды = "КонтекстноеМенюИстория" + ИмяРеквизита;
Кнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Элемент.КонтекстноеМеню);
Кнопка.Заголовок = НСтр("ru = 'История изменений...'");
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Картинка = БиблиотекаКартинок.ИсторияИзменений;
Команда.Подсказка = НСтр("ru = 'Показывает историю изменения контактной информации'");
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Команда.ИзменяетСохраняемыеДанные = Ложь;
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
КонецЕсли;
Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
ГруппаРазделительКарты = Форма.Элементы.Добавить("ПодменюРазделительКонтекстКарты" + ИмяРеквизита, Тип("ГруппаФормы"), Элемент.КонтекстноеМеню);
ГруппаРазделительКарты.Вид = ВидГруппыФормы.ГруппаКнопок;
ИмяКоманды = "КонтекстноеМенюКартаЯндекс" + ИмяРеквизита;
Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделительКарты);
Кнопка.Заголовок = НСтр("ru = 'Адрес на Яндекс.Картах'");
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Картинка = БиблиотекаКартинок.ЯндексКарты;
Команда.Подсказка = НСтр("ru = 'Показывает адрес на картах Яндекс.Карты'");
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
ИмяКоманды = "КонтекстноеМенюКартаGoogle" + ИмяРеквизита;
Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделительКарты);
Кнопка.Заголовок = НСтр("ru = 'Адрес на Google Maps'");
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Картинка = БиблиотекаКартинок.GoogleMaps;
Команда.Подсказка = НСтр("ru = 'Показывает адрес на карте Google Maps'");
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
ГруппКнопокРазделитель = Форма.Элементы.Добавить("ПодменюРазделительКарты" + ИмяРеквизита, Тип("ГруппаФормы"), Элемент.КонтекстноеМеню);
ГруппКнопокРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок;
Если Не ИнформацияОВидеКИ.ПометкаУдаления Тогда
// Заполнить
ГруппаПодменюАдреса = Форма.Элементы.Добавить("КонтекстноеПодменюКопироватьАдреса" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппКнопокРазделитель);
ГруппаПодменюАдреса.Вид = ВидГруппыФормы.Подменю;
ГруппаПодменюАдреса.Отображение = ОтображениеКнопки.Текст;
ГруппаПодменюАдреса.Заголовок = НСтр("ru='Заполнить'");
КонецЕсли;
КонецЕсли;
Если ОбязательноеЗаполнение И ЭтоНовыйВидКИ И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
Элемент.АвтоОтметкаНезаполненного = Истина;
КонецЕсли;
// Редактирование в диалоге
Если ДляТипаКонтактнойИнформацииДоступноРедактированиеВДиалоге(ИнформацияОВидеКИ.Тип)
И Элемент.Вид = ВидПоляФормы.ПолеВвода Тогда
Элемент.КнопкаВыбора = Не ИнформацияОВидеКИ.ПометкаУдаления;
Если ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге Тогда
Элемент.РедактированиеТекста = Ложь;
Элемент.ЦветФона = ЦветаСтиля.КонтактнаяИнформацияСРедактированиемВДиалогеЦвет;
КонецЕсли;
Элемент.УстановитьДействие("НачалоВыбора", "Подключаемый_КонтактнаяИнформацияНачалоВыбора");
КонецЕсли;
Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_КонтактнаяИнформацияПриИзменении");
Если ИнформацияОВидеКИ.ПометкаУдаления Тогда
Элемент.ШрифтЗаголовка = Новый Шрифт(,,,,, Истина);
Если Не ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге Тогда
Элемент.КнопкаОчистки = Истина;
Элемент.РедактированиеТекста = Ложь;
Иначе
Элемент.ТолькоПросмотр = Истина;
КонецЕсли;
КонецЕсли;
Возврат Элемент;
КонецФункции
Процедура ПунктКонтекстногоМенюПеремещения(ПредыдущийЭлемент, Форма, Направление, ИмяЭлементаДляРазмещения)
Если Направление > 0 Тогда
ИмяКоманды = "КонтекстноеМенюВверх" + ПредыдущийЭлемент.Имя;
Иначе
ИмяКоманды = "КонтекстноеМенюВниз" + ПредыдущийЭлемент.Имя;
КонецЕсли;
Команда = Форма.Команды.Добавить(ИмяКоманды);
Кнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ПредыдущийЭлемент.КонтекстноеМеню);
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Если Направление > 0 Тогда
ТекстКоманды = НСтр("ru = 'Переместить вверх'");
Кнопка.Картинка = БиблиотекаКартинок.ПереместитьВверх;
Иначе
ТекстКоманды = НСтр("ru = 'Переместить вниз'");
Кнопка.Картинка = БиблиотекаКартинок.ПереместитьВниз;
КонецЕсли;
Кнопка.Заголовок = ТекстКоманды;
Команда.Подсказка = ТекстКоманды;
Кнопка.ИмяКоманды = ИмяКоманды;
Команда.ИзменяетСохраняемыеДанные = Истина;
Кнопка.Доступность = Истина;
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
КонецПроцедуры
// Убирает разделители в номере телефона.
//
// Параметры:
// НомерТелефона - Строка - номер телефона или факса.
//
// Возвращаемое значение:
// Строка - номер телефона или факса без разделителей.
//
Функция УбратьРазделителиВНомерТелефона(Знач НомерТелефона)
Поз = СтрНайти(НомерТелефона, ",");
Если Поз <> 0 Тогда
НомерТелефона = Лев(НомерТелефона, Поз-1);
КонецЕсли;
НомерТелефона = СтрЗаменить(НомерТелефона, "-", "");
НомерТелефона = СтрЗаменить(НомерТелефона, " ", "");
НомерТелефона = СтрЗаменить(НомерТелефона, "+", "");
Возврат НомерТелефона;
КонецФункции
Функция Группа(ИмяГруппы, Форма, Заголовок, ИмяЭлементаДляРазмещения)
Группа = Форма.Элементы.Найти(ИмяГруппы);
Если Группа = Неопределено Тогда
Родитель = Родитель(Форма, ИмяЭлементаДляРазмещения);
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Родитель.ШрифтЗаголовка = Новый Шрифт(,, Истина);
КонецЕсли;
Группа = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), Родитель);
Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Группа.Заголовок = Заголовок;
Группа.ОтображатьЗаголовок = Ложь;
Группа.РазрешитьИзменениеСостава = Ложь;
Группа.Отображение = ОтображениеОбычнойГруппы.Нет;
Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяГруппы, 5);
КонецЕсли;
Возврат Группа;
КонецФункции
Процедура ПроверитьНаличиеРеквизитовКонтактнойИнформации(Форма, МассивДобавляемыхРеквизитов)
СписокРеквизитовФормы = Форма.ПолучитьРеквизиты();
СоздатьПараметрыКонтактнойИнформации = Истина;
СоздатьТаблицуКонтактнойИнформации = Истина;
Для Каждого Реквизит Из СписокРеквизитовФормы Цикл
Если Реквизит.Имя = "ПараметрыКонтактнойИнформации" Тогда
СоздатьПараметрыКонтактнойИнформации = Ложь;
ИначеЕсли Реквизит.Имя = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов" Тогда
СоздатьТаблицуКонтактнойИнформации = Ложь;
КонецЕсли;
КонецЦикла;
Строка500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500));
ИмяОписания = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов";
Если СоздатьТаблицуКонтактнойИнформации Тогда
// Создадим таблицу значений
ИмяОписания = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов";
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяОписания, Новый ОписаниеТипов("ТаблицаЗначений")));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизита", Строка500, ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Вид", Новый ОписаниеТипов("СправочникСсылка.ВидыКонтактнойИнформации"), ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Тип", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации"), ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Значение", Новый ОписаниеТипов("Строка"), ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Представление", Строка500, ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Комментарий", Новый ОписаниеТипов("Строка"), ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЭтоРеквизитТабличнойЧасти", Новый ОписаниеТипов("Булево"), ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЭтоИсторическаяКонтактнаяИнформация", Новый ОписаниеТипов("Булево"), ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ДействуетС", Новый ОписаниеТипов("Дата"), ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ХранитьИсториюИзменений", Новый ОписаниеТипов("Булево"), ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяЭлементаДляРазмещения", Строка500, ИмяОписания));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("МеждународныйФорматАдреса", Новый ОписаниеТипов("Булево"), ИмяОписания));
Иначе
РеквизитыТаблицы = Форма.ПолучитьРеквизиты("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов");
РеквизитыДляСоздания = Новый Соответствие;
РеквизитыДляСоздания.Вставить("ИмяЭлементаДляРазмещения", Истина);
РеквизитыДляСоздания.Вставить("ХранитьИсториюИзменений", Истина);
РеквизитыДляСоздания.Вставить("ДействуетС", Истина);
РеквизитыДляСоздания.Вставить("ЭтоИсторическаяКонтактнаяИнформация", Истина);
РеквизитыДляСоздания.Вставить("Значение", Истина);
РеквизитыДляСоздания.Вставить("МеждународныйФорматАдреса", Истина);
Для Каждого Реквизит Из РеквизитыТаблицы Цикл
Если РеквизитыДляСоздания[Реквизит.Имя] <> Неопределено Тогда
РеквизитыДляСоздания[Реквизит.Имя] = Ложь;
КонецЕсли;
КонецЦикла;
Если РеквизитыДляСоздания["Значение"] Тогда
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Значение", Новый ОписаниеТипов("Строка"), ИмяОписания));
КонецЕсли;
Если РеквизитыДляСоздания["МеждународныйФорматАдреса"] Тогда
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("МеждународныйФорматАдреса", Новый ОписаниеТипов("Булево"), ИмяОписания));
КонецЕсли;
Если РеквизитыДляСоздания["ИмяЭлементаДляРазмещения"] Тогда
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяЭлементаДляРазмещения", Строка500, ИмяОписания));
КонецЕсли;
Если РеквизитыДляСоздания["ХранитьИсториюИзменений"] Тогда
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ХранитьИсториюИзменений", Новый ОписаниеТипов("Булево"), ИмяОписания));
КонецЕсли;
Если РеквизитыДляСоздания["ДействуетС"] Тогда
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ДействуетС", Новый ОписаниеТипов("Дата"), ИмяОписания));
КонецЕсли;
Если РеквизитыДляСоздания["ЭтоИсторическаяКонтактнаяИнформация"] Тогда
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЭтоИсторическаяКонтактнаяИнформация", Новый ОписаниеТипов("Булево"), ИмяОписания));
КонецЕсли;
КонецЕсли;
Если СоздатьПараметрыКонтактнойИнформации Тогда
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ПараметрыКонтактнойИнформации", Новый ОписаниеТипов()));
КонецЕсли;
КонецПроцедуры
Процедура УстановитьЗначенияРеквизитовПроверки(Объект, НастройкиПроверки = Неопределено)
Объект.ПроверятьКорректность = ?(НастройкиПроверки = Неопределено, Ложь, НастройкиПроверки.ПроверятьКорректность);
Объект.ТолькоНациональныйАдрес = Ложь;
Объект.ВключатьСтрануВПредставление = Ложь;
Объект.СкрыватьНеактуальныеАдреса = Ложь;
КонецПроцедуры
Процедура ДобавитьРеквизитВОписание(Форма, СтрокаКонтактнойИнформации, ДанныеВидовКонтактнойИнформации, ЭтоНовыйВидКИ,
ЭтоРеквизитТабличнойЧасти = Ложь, ЗаполнятьЗначениеРеквизита = Истина, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация")
НоваяСтрока = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить();
НоваяСтрока.ИмяРеквизита = СтрокаКонтактнойИнформации.ИмяРеквизита;
НоваяСтрока.Вид = СтрокаКонтактнойИнформации.Вид;
НоваяСтрока.Тип = СтрокаКонтактнойИнформации.Тип;
НоваяСтрока.ИмяЭлементаДляРазмещения = ИмяЭлементаДляРазмещения;
НоваяСтрока.ЭтоРеквизитТабличнойЧасти = ЭтоРеквизитТабличнойЧасти;
Если НоваяСтрока.Свойство("ЭтоИсторическаяКонтактнаяИнформация") Тогда
НоваяСтрока.ЭтоИсторическаяКонтактнаяИнформация = СтрокаКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация;
КонецЕсли;
Если НоваяСтрока.Свойство("ДействуетС") Тогда
НоваяСтрока.ДействуетС = СтрокаКонтактнойИнформации.ДействуетС;
КонецЕсли;
Если НоваяСтрока.Свойство("ХранитьИсториюИзменений") Тогда
НоваяСтрока.ХранитьИсториюИзменений = СтрокаКонтактнойИнформации.ХранитьИсториюИзменений;
КонецЕсли;
Если НоваяСтрока.Свойство("МеждународныйФорматАдреса") Тогда
НоваяСтрока.МеждународныйФорматАдреса = СтрокаКонтактнойИнформации.МеждународныйФорматАдреса;
КонецЕсли;
НоваяСтрока.Значение = СтрокаКонтактнойИнформации.Значение;
НоваяСтрока.Представление = СтрокаКонтактнойИнформации.Представление;
НоваяСтрока.Комментарий = СтрокаКонтактнойИнформации.Комментарий;
Если ЗаполнятьЗначениеРеквизита И Не ЭтоРеквизитТабличнойЧасти Тогда
Если СтрокаКонтактнойИнформации.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес
И СтрокаКонтактнойИнформации.РедактированиеТолькоВДиалоге
И ПустаяСтрока(СтрокаКонтактнойИнформации.Представление) Тогда
Форма[СтрокаКонтактнойИнформации.ИмяРеквизита] = УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки();
Иначе
Форма[СтрокаКонтактнойИнформации.ИмяРеквизита] = СтрокаКонтактнойИнформации.Представление;
КонецЕсли;
КонецЕсли;
ДанныеВидаКонтактнойИнформации = ДанныеВидовКонтактнойИнформации[СтрокаКонтактнойИнформации.Вид];
ДанныеВидаКонтактнойИнформации.Вставить("Ссылка", СтрокаКонтактнойИнформации.Вид);
Если ЭтоНовыйВидКИ И ДанныеВидаКонтактнойИнформации.РазрешитьВводНесколькихЗначений И Не ЭтоРеквизитТабличнойЧасти И Не ДанныеВидаКонтактнойИнформации.ПометкаУдаления Тогда
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Добавить(ДанныеВидаКонтактнойИнформации, СтрокаКонтактнойИнформации.Вид.Наименование);
КонецЕсли;
КонецПроцедуры
Процедура УдалитьКомандыИЭлементыФормы(Форма, ИмяЭлементаДляРазмещения)
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
ДобавленныеЭлементы = ПараметрыКонтактнойИнформации.ДобавленныеЭлементы;
ДобавленныеЭлементы.СортироватьПоПредставлению();
Для Каждого УдаляемыйЭлемент Из ДобавленныеЭлементы Цикл
Если УдаляемыйЭлемент.Пометка Тогда
Форма.Команды.Удалить(Форма.Команды[УдаляемыйЭлемент.Значение]);
Иначе
Форма.Элементы.Удалить(Форма.Элементы[УдаляемыйЭлемент.Значение]);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Возвращает доступно ли редактирование в диалоге по типу контактной информации.
//
// Параметры:
// Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации.
//
// Возвращаемое значение:
// Булево - доступно или нет редактирование в диалоге.
//
Функция ДляТипаКонтактнойИнформацииДоступноРедактированиеВДиалоге(Тип)
Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
Возврат Истина;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
Возврат Истина;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Факс Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Процедура ЗаполнитьТаблицуВидовКИ(ТаблицаВидов, ВетвьДерева)
Для каждого СтрокаВида Из ВетвьДерева.Строки Цикл
Группа = ТаблицаВидов.Добавить();
Группа.Имя = СтрокаВида.Имя;
Группа.Наименование = СтрокаВида.Наименование;
Если СтрокаВида.Родитель <> Неопределено Тогда
Группа.Группа = ВетвьДерева.Наименование;
Группа.ИмяГруппы = ВетвьДерева.Имя;
КонецЕсли;
Если СтрокаВида.Строки.Количество() > 0 Тогда
ЗаполнитьТаблицуВидовКИ(ТаблицаВидов, СтрокаВида);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Возвращает имена табличных частей документа по виду контактной информации.
//
// Параметры:
// ТаблицаВидовКонтактнойИнформации - ТаблицаЗначений - Список видов контактной информации.
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации.
// ИмяОбъекта - Строка - полное имя объекта метаданного.
//
// Возвращаемое значение:
// Соответствие - имена табличных части или пустая строка, если табличной части нет.
//
Функция ИменаТабличныхЧастейПоВидамКИ(ТаблицаВидовКонтактнойИнформации, ИмяОбъекта)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВидыКонтактнойИнформации.Вид КАК ВидКИ
|ПОМЕСТИТЬ ВидыКИ
|ИЗ
| &ТаблицаВидовКонтактнойИнформации КАК ВидыКонтактнойИнформации
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЫБОР
| КОГДА ВидыКонтактнойИнформации.Родитель.ИмяПредопределенногоВида <> """"
| ТОГДА ВидыКонтактнойИнформации.Родитель.ИмяПредопределенногоВида
| ИНАЧЕ ВидыКонтактнойИнформации.Родитель.ИмяПредопределенныхДанных
| КОНЕЦ КАК ИмяТабличнойЧасти,
| ВидыКИ.ВидКИ КАК ВидКонтактнойИнформации
|ИЗ
| ВидыКИ КАК ВидыКИ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
| ПО ВидыКИ.ВидКИ = ВидыКонтактнойИнформации.Ссылка";
Запрос.УстановитьПараметр("ТаблицаВидовКонтактнойИнформации", ТаблицаВидовКонтактнойИнформации);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Результат = Новый Соответствие;
Пока РезультатЗапроса.Следующий() Цикл
Если ЗначениеЗаполнено(РезультатЗапроса.ИмяТабличнойЧасти) Тогда
ИмяТабличнойЧасти = Сред(РезультатЗапроса.ИмяТабличнойЧасти, СтрНайти(РезультатЗапроса.ИмяТабличнойЧасти, ИмяОбъекта) + СтрДлина(ИмяОбъекта));
Иначе
ИмяТабличнойЧасти = "";
КонецЕсли;
Результат.Вставить(РезультатЗапроса.ВидКонтактнойИнформации, ИмяТабличнойЧасти);
КонецЦикла;
Возврат Результат;
КонецФункции
// Проверяет на наличие в форме заполненных строк КИ того же вида (за исключением текущей).
//
Функция ЕстьДругиеЗаполненныеСтрокКИДанногоВида(Знач Форма, Знач ПроверяемаяСтрока, Знач ВидКонтактнойИнформации)
ВсеСтрокиЭтогоВида = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(
Новый Структура("Вид", ВидКонтактнойИнформации));
Для Каждого СтрокаВида Из ВсеСтрокиЭтогоВида Цикл
Если СтрокаВида <> ПроверяемаяСтрока Тогда
Представление = Форма[СтрокаВида.ИмяРеквизита];
Если Не ПустаяСтрока(Представление) Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ВывестиСообщениеПользователю(ТекстСообщения, ИмяРеквизита, ПолеРеквизита)
ИмяРеквизита = ?(ПустаяСтрока(ПолеРеквизита), ИмяРеквизита, "");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения,, ПолеРеквизита, ИмяРеквизита);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Заполнение дополнительных реквизитов табличной части "Контактная информация".
Процедура КонвертацияКонтактнойИнформацииВJSON(КонтактнаяИнформация)
// Конвертация
Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл
Если ПустаяСтрока(СтрокаКИ.Значение) Тогда
Если ЗначениеЗаполнено(СтрокаКИ.ЗначенияПолей) Тогда
КонтактнаяИнформацияПоПолям = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(СтрокаКИ.ЗначенияПолей,
СтрокаКИ.Тип, СтрокаКИ.Представление, Ложь);
СтрокаКИ.Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(КонтактнаяИнформацияПоПолям);
ИначеЕсли ЗначениеЗаполнено(СтрокаКИ.Представление) Тогда
СтрокаКИ.Значение = КонтактнаяИнформацияПоПредставлению(СтрокаКИ.Представление, СтрокаКИ.Тип);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СоздатьЭлементыТабличнойЧасти(Знач Форма, Знач ИмяОбъекта, ИмяЭлементаДляРазмещения,
Знач СтрокаКонтактнойИнформации, Знач ДанныеВидовКонтактнойИнформации)
ВидыКонтактнойИнформацииТЧ = Новый Массив;
Для Каждого СтрокаТабличнойЧасти Из СтрокаКонтактнойИнформации.Строки Цикл
ВидыКонтактнойИнформацииТЧ.Добавить(СтрокаТабличнойЧасти.Вид);
КонецЦикла;
ДанныеВидовКонтактнойИнформацииТЧ = УправлениеКонтактнойИнформациейСлужебный.ДанныеВидовКонтактнойИнформации(
ВидыКонтактнойИнформацииТЧ);
ИмяВидаКонтактнойИнформации = ДанныеВидовКонтактнойИнформации[СтрокаКонтактнойИнформации.Вид].ИмяПредопределенногоВида;
Если ПустаяСтрока(ИмяВидаКонтактнойИнформации) Тогда
ИмяВидаКонтактнойИнформации = ДанныеВидовКонтактнойИнформации[СтрокаКонтактнойИнформации.Вид].ИмяПредопределенныхДанных;
КонецЕсли;
Позиция = СтрНайти(ИмяВидаКонтактнойИнформации, ИмяОбъекта);
ИмяТабличнойЧасти = Сред(ИмяВидаКонтактнойИнформации, Позиция + СтрДлина(ИмяОбъекта));
ПредыдущийВидТЧ = Неопределено;
Для Каждого СтрокаТабличнойЧасти Из СтрокаКонтактнойИнформации.Строки Цикл
ВидКонтактнойИнформацииТЧ = СтрокаТабличнойЧасти.Вид;
Если ВидКонтактнойИнформацииТЧ <> ПредыдущийВидТЧ Тогда
ГруппаТабличнойЧасти = Форма.Элементы[ИмяТабличнойЧасти + "ГруппаКонтактнаяИнформация"];
Элемент = Форма.Элементы.Добавить(СтрокаТабличнойЧасти.ИмяРеквизита, Тип("ПолеФормы"), ГруппаТабличнойЧасти);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = "Объект." + ИмяТабличнойЧасти + "." + СтрокаТабличнойЧасти.ИмяРеквизита;
Если ДляТипаКонтактнойИнформацииДоступноРедактированиеВДиалоге(СтрокаТабличнойЧасти.Тип) Тогда
Элемент.КнопкаВыбора = Не СтрокаТабличнойЧасти.ПометкаУдаления;;
Если ВидКонтактнойИнформацииТЧ.РедактированиеТолькоВДиалоге Тогда
Элемент.РедактированиеТекста = Ложь;
КонецЕсли;
Элемент.УстановитьДействие("НачалоВыбора", "Подключаемый_КонтактнаяИнформацияНачалоВыбора");
КонецЕсли;
Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_КонтактнаяИнформацияПриИзменении");
Если СтрокаТабличнойЧасти.ПометкаУдаления Тогда
Элемент.Шрифт = Новый Шрифт(,,,,, Истина);
Элемент.РедактированиеТекста = Ложь;
КонецЕсли;
Если ВидКонтактнойИнформацииТЧ.ОбязательноеЗаполнение Тогда
Элемент.АвтоОтметкаНезаполненного = Не СтрокаТабличнойЧасти.ПометкаУдаления;
КонецЕсли;
Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].ДобавленныеЭлементы.Добавить(СтрокаТабличнойЧасти.ИмяРеквизита,
2, Ложь);
ДобавитьРеквизитВОписание(Форма, СтрокаТабличнойЧасти, ДанныеВидовКонтактнойИнформацииТЧ, Ложь, Истина,, ИмяЭлементаДляРазмещения);
ПредыдущийВидТЧ = ВидКонтактнойИнформацииТЧ;
КонецЕсли;
Отбор = Новый Структура;
Отбор.Вставить("ИдентификаторСтрокиТабличнойЧасти", СтрокаТабличнойЧасти.ИдентификаторСтрокиТабличнойЧасти);
СтрокиТаблицы = Форма.Объект[ИмяТабличнойЧасти].НайтиСтроки(Отбор);
Если СтрокиТаблицы.Количество() = 1 Тогда
СтрокаТаблицы = СтрокиТаблицы[0];
СтрокаТаблицы[СтрокаТабличнойЧасти.ИмяРеквизита] = СтрокаТабличнойЧасти.Представление;
СтрокаТаблицы[СтрокаТабличнойЧасти.ИмяРеквизита + "Значение"] = СтрокаТабличнойЧасти.Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТехническиеПоляКонтактнойИнформации(СтрокаКонтактнойИнформации, Объект, ТипКонтактнойИнформации)
// Заполнение дополнительных реквизитов ТЧ.
Если ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
ЗаполнитьРеквизитыТабличнойЧастиДляАдресаЭлектроннойПочты(СтрокаКонтактнойИнформации, Объект);
ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
ЗаполнитьРеквизитыТабличнойЧастиДляАдреса(СтрокаКонтактнойИнформации, Объект);
ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(СтрокаКонтактнойИнформации, Объект);
ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Факс Тогда
ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(СтрокаКонтактнойИнформации, Объект);
ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда
ЗаполнитьРеквизитыТабличнойЧастиДляВебСтраницы(СтрокаКонтактнойИнформации, Объект);
КонецЕсли;
КонецПроцедуры
// Заполняет дополнительные реквизиты табличной части "Контактная информация" для адреса.
//
// Параметры:
// СтрокаТабличнойЧасти - СтрокаТабличнойЧасти - заполняемая строка табличной части "Контактная информация".
// Источник - ОбъектXDTO - контактная информация.
//
Процедура ЗаполнитьРеквизитыТабличнойЧастиДляАдреса(СтрокаТабличнойЧасти, Адрес)
// Умолчания
СтрокаТабличнойЧасти.Страна = "";
СтрокаТабличнойЧасти.Регион = "";
СтрокаТабличнойЧасти.Город = "";
Если Адрес.Свойство("Country") Тогда
СтрокаТабличнойЧасти.Страна = Адрес.Country;
Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда
Обработки["РасширенныйВводКонтактнойИнформации"].ЗаполнитьРасширенныеРеквизитыТабличнойЧастиДляАдреса(Адрес, СтрокаТабличнойЧасти);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Заполняет дополнительные реквизиты табличной части "Контактная информация" для адреса электронной почты.
//
// Параметры:
// СтрокаТабличнойЧасти - СтрокаТабличнойЧасти - заполняемая строка табличной части "Контактная информация".
// Источник - ОбъектXDTO - контактная информация.
//
Процедура ЗаполнитьРеквизитыТабличнойЧастиДляАдресаЭлектроннойПочты(СтрокаТабличнойЧасти, Источник)
Результат = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(СтрокаТабличнойЧасти.Представление, Ложь);
Если Результат.Количество() > 0 Тогда
СтрокаТабличнойЧасти.АдресЭП = Результат[0].Адрес;
Поз = СтрНайти(СтрокаТабличнойЧасти.АдресЭП, "@");
Если Поз <> 0 Тогда
СтрокаТабличнойЧасти.ДоменноеИмяСервера = Сред(СтрокаТабличнойЧасти.АдресЭП, Поз+1);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Заполняет дополнительные реквизиты табличной части "Контактная информация" для телефона и факса.
//
// Параметры:
// СтрокаТабличнойЧасти - СтрокаТабличнойЧасти - заполняемая строка табличной части "Контактная информация".
// Источник - ОбъектXDTO - контактная информация.
//
Процедура ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(СтрокаТабличнойЧасти, Телефон)
Если НЕ ЗначениеЗаполнено(Телефон) Тогда
Возврат;
КонецЕсли;
// Умолчания
СтрокаТабличнойЧасти.НомерТелефонаБезКодов = "";
СтрокаТабличнойЧасти.НомерТелефона = "";
КодСтраны = Телефон.CountryCode;
КодГорода = Телефон.AreaCode;
НомерТелефона = Телефон.Number;
Если СтрНачинаетсяС(КодСтраны, "+") Тогда
КодСтраны = Сред(КодСтраны, 2);
КонецЕсли;
Поз = СтрНайти(НомерТелефона, ",");
Если Поз <> 0 Тогда
НомерТелефона = Лев(НомерТелефона, Поз-1);
КонецЕсли;
Поз = СтрНайти(НомерТелефона, Символы.ПС);
Если Поз <> 0 Тогда
НомерТелефона = Лев(НомерТелефона, Поз-1);
КонецЕсли;
СтрокаТабличнойЧасти.НомерТелефонаБезКодов = УбратьРазделителиВНомерТелефона(НомерТелефона);
СтрокаТабличнойЧасти.НомерТелефона = УбратьРазделителиВНомерТелефона(Строка(КодСтраны) + КодГорода + НомерТелефона);
КонецПроцедуры
// Заполняет дополнительные реквизиты табличной части "Контактная информация" для телефона и факса.
//
// Параметры:
// СтрокаТабличнойЧасти - СтрокаТабличнойЧасти - заполняемая строка табличной части "Контактная информация".
// Источник - Структура, ОбъектXDTO - контактная информация.
//
Процедура ЗаполнитьРеквизитыТабличнойЧастиДляВебСтраницы(СтрокаТабличнойЧасти, Источник)
// Умолчания
СтрокаТабличнойЧасти.ДоменноеИмяСервера = "";
АдресСтраницы = "";
Если ТипЗнч(Источник) = Тип("Структура") Тогда
Если Источник.Свойство("value") Тогда
АдресСтрокой = Источник.value;
КонецЕсли;
Иначе
АдресСтраницы = Источник.Состав;
ПространствоИмен = УправлениеКонтактнойИнформациейСлужебный.ПространствоИмен();
Если АдресСтраницы <> Неопределено И АдресСтраницы.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда
АдресСтрокой = АдресСтраницы.Значение;
КонецЕсли;
КонецЕсли;
// Удалим протокол
Позиция = СтрНайти(АдресСтрокой, "://");
АдресСервера = ?(Позиция = 0, АдресСтрокой, Сред(АдресСтрокой, Позиция + 3));
СтрокаТабличнойЧасти.ДоменноеИмяСервера = АдресСервера;
КонецПроцедуры
// Проверяет контактную информацию электронной почты и сообщает об ошибках.
//
// Параметры:
// АдресЭП - Структура, Строка - контактная информацией.
// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации с настройками проверки.
// ИмяРеквизита - Строка - необязательно имя реквизита для привязки сообщения об ошибке.
//
// Возвращаемое значение:
// Число - уровень ошибок: 0 - нет, 1 - неблокирующие, 2 - блокирующие.
//
Функция ОшибкиЗаполненияЭлектроннойПочты(АдресЭП, ВидИнформации, Знач ИмяРеквизита = "", ПолеРеквизита = "")
Если Не ВидИнформации.ПроверятьКорректность Тогда
Возврат 0;
КонецЕсли;
Если Не ЗначениеЗаполнено(АдресЭП) Тогда
Возврат 0;
КонецЕсли;
СтрокаОшибки = "";
ЭлектроннаяПочта = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(АдресЭП, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Попытка
Результат = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(ЭлектроннаяПочта.Value);
Если Результат.Количество() > 1 Тогда
СтрокаОшибки = НСтр("ru = 'Допускается ввод только одного адреса электронной почты'");
КонецЕсли;
Исключение
СтрокаОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Если Не ПустаяСтрока(СтрокаОшибки) Тогда
ВывестиСообщениеПользователю(СтрокаОшибки, ИмяРеквизита, ПолеРеквизита);
УровеньОшибки = ?(ВидИнформации.ПроверятьКорректность, 2, 1);
Иначе
УровеньОшибки = 0;
КонецЕсли;
Возврат УровеньОшибки;
КонецФункции
// Проверяет контактную информацию.
//
Функция ПроверитьЗаполнениеКонтактнойИнформации(Представление, Значение, ВидИнформации, ТипИнформации,
ИмяРеквизита, Комментарий = Неопределено, ПутьКРеквизиту = "")
Если ПустаяСтрока(Значение) Тогда
Если ПустаяСтрока(Представление) Тогда
Возврат 0;
КонецЕсли;
РедактированиеТолькоВДиалоге = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидИнформации, "РедактированиеТолькоВДиалоге");
Если РедактированиеТолькоВДиалоге И СтрСравнить(Представление, УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки()) = 0 Тогда
Возврат 0;
КонецЕсли;
КонтактнаяИнформация = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияПоПредставлению(Представление, ВидИнформации);
Значение = ?(ТипЗнч(КонтактнаяИнформация) = Тип("Структура"), УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(КонтактнаяИнформация), "");
ИначеЕсли УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Значение) Тогда
Значение = КонтактнаяИнформацияВJSON(Значение, ВидИнформации);
КонецЕсли;
// Проверка
Если ТипИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
УровеньОшибок = ОшибкиЗаполненияЭлектроннойПочты(Значение, ВидИнформации, ИмяРеквизита, ПутьКРеквизиту);
ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
УровеньОшибок = ОшибкиЗаполненияАдреса(Значение, ВидИнформации, ИмяРеквизита, ПутьКРеквизиту);
ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
УровеньОшибок = ОшибкиЗаполненияТелефона(Значение, ВидИнформации, ИмяРеквизита);
ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Факс Тогда
УровеньОшибок = ОшибкиЗаполненияТелефона(Значение, ВидИнформации, ИмяРеквизита);
ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда
УровеньОшибок = ОшибкиЗаполненияВебСтраницы(Значение, ВидИнформации, ИмяРеквизита);
Иначе
// Другое (прочее) не проверяем.
УровеньОшибок = 0;
КонецЕсли;
Возврат УровеньОшибок;
КонецФункции
// Получение и коррекция контактной информации
Процедура СкорректироватьКонтактнуюИнформацию(Форма, СтрокаКИ)
РезультатПреобразования = Новый Структура;
Если ПустаяСтрока(СтрокаКИ.Значение) Тогда
Если ПустаяСтрока(СтрокаКИ.Представление) И ЗначениеЗаполнено(СтрокаКИ.ЗначенияПолей) Тогда
СтрокаКИ.Представление = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеКонтактнойИнформации(СтрокаКИ.ЗначенияПолей, СтрокаКИ.Вид);
КонецЕсли;
Результат = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзXML(СтрокаКИ.ЗначенияПолей, СтрокаКИ.Вид, РезультатПреобразования, СтрокаКИ.Представление);
СтрокаКИ.Комментарий = ?(ЗначениеЗаполнено(Результат.Комментарий), Результат.Комментарий, "");
Если РезультатПреобразования.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если Не РезультатПреобразования.Свойство("СведенияИсправлены") ИЛИ РезультатПреобразования.СведенияИсправлены = Ложь Тогда
Возврат;
КонецЕсли;
Если РезультатПреобразования.СведенияИсправлены Тогда
СтрокаКИ.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(Результат);
КонецЕсли;
Если РезультатПреобразования.Свойство("ТекстОшибки") Тогда
ОбщегоНазначения.СообщитьПользователю(РезультатПреобразования.ТекстОшибки, , СтрокаКИ.ИмяРеквизита);
КонецЕсли;
Форма.Модифицированность = Истина;
Иначе
СтрокаКИ.Комментарий = КомментарийКонтактнойИнформации(СтрокаКИ.Значение);
Если ПустаяСтрока(СтрокаКИ.Представление) Тогда
СтрокаКИ.Представление = ПредставлениеКонтактнойИнформации(СтрокаКИ.Значение);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Проверяет контактную информацию адреса и сообщает об ошибках. Возвращает флаг наличия ошибок.
//
// Параметры:
// Источник - ОбъектXDTO - контактная информацией.
// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации с настройками проверки.
// ИмяРеквизита - Строка - необязательно имя реквизита для привязки сообщения об ошибке.
//
// Возвращаемое значение:
// Число - уровень ошибок: 0 - нет, 1 - неблокирующие, 2 - блокирующие.
//
Функция ОшибкиЗаполненияАдреса(Источник, ВидИнформации, ИмяРеквизита = "", ПолеРеквизита = "")
Если Не ВидИнформации.ПроверятьКорректность Тогда
Возврат 0;
КонецЕсли;
ЕстьОшибки = Ложь;
Если НЕ УправлениеКонтактнойИнформациейСлужебный.ЭтоНациональныйАдрес(Источник) Тогда
Возврат 0;
КонецЕсли;
Если Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено Тогда
СписокОшибок = Обработки["РасширенныйВводКонтактнойИнформации"].ОшибкиЗаполненияАдресаXDTO(Источник, ВидИнформации);
Для Каждого Элемент Из СписокОшибок Цикл
ВывестиСообщениеПользователю(Элемент.Представление, ИмяРеквизита, ПолеРеквизита);
ЕстьОшибки = Истина;
КонецЦикла;
КонецЕсли;
Если ЕстьОшибки И ВидИнформации.ПроверятьКорректность Тогда
Возврат 2;
ИначеЕсли ЕстьОшибки Тогда
Возврат 1;
КонецЕсли;
Возврат 0;
КонецФункции
// Проверяет контактную информацию телефона и сообщает об ошибках. Возвращает флаг наличия ошибок.
//
// Параметры:
// Источник - ОбъектXDTO - контактная информацией.
// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации с настройками проверки.
// ИмяРеквизита - Строка - необязательно имя реквизита для привязки сообщения об ошибке.
//
// Возвращаемое значение:
// Число - уровень ошибок: 0 - нет, 1 - неблокирующие, 2 - блокирующие.
//
Функция ОшибкиЗаполненияТелефона(Источник, ВидИнформации, ИмяРеквизита = "")
Возврат 0;
КонецФункции
// Проверяет контактную информацию веб страницы и сообщает об ошибках. Возвращает флаг наличия ошибок.
//
// Параметры:
// Источник - ОбъектXDTO - контактная информацией.
// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации с настройками проверки.
// ИмяРеквизита - Строка - необязательно имя реквизита для привязки сообщения об ошибке.
//
// Возвращаемое значение:
// Число - уровень ошибок: 0 - нет, 1 - неблокирующие, 2 - блокирующие.
//
Функция ОшибкиЗаполненияВебСтраницы(Источник, ВидИнформации, ИмяРеквизита = "")
Возврат 0;
КонецФункции
Процедура ОбработкаЗаполненияКонтактнойИнформацииОбъекта(Объект, Знач ДанныеЗаполнения)
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
// Наименование, если есть в объекте-приемнике.
Наименование = Неопределено;
Если ДанныеЗаполнения.Свойство("Наименование", Наименование)
И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, "Наименование") Тогда
Объект.Наименование = Наименование;
КонецЕсли;
// Таблица контактной информации, заполняется только если КИ не находится в другой ТЧ.
КонтактнаяИнформация = Неопределено;
Если ДанныеЗаполнения.Свойство("КонтактнаяИнформация", КонтактнаяИнформация)
И ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, "КонтактнаяИнформация") Тогда
Если ТипЗнч(КонтактнаяИнформация) = Тип("ТаблицаЗначений") Тогда
КолонкиТаблицы = КонтактнаяИнформация.Колонки;
Иначе
КолонкиТаблицы = КонтактнаяИнформация.ВыгрузитьКолонки().Колонки;
КонецЕсли;
Если КолонкиТаблицы.Найти("ИдентификаторСтрокиТабличнойЧасти") = Неопределено Тогда
Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл
НоваяСтрокаКИ = Объект.КонтактнаяИнформация.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаКИ, СтрокаКИ, , "ЗначенияПолей");
НоваяСтрокаКИ.ЗначенияПолей = КонтактнаяИнформацияВXML(СтрокаКИ.ЗначенияПолей, СтрокаКИ.Представление, СтрокаКИ.Вид);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция Родитель(Форма, ИмяЭлементаДляРазмещения)
Возврат ?(ПустаяСтрока(ИмяЭлементаДляРазмещения), Форма, Форма.Элементы[ИмяЭлементаДляРазмещения])
КонецФункции
Функция ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, ОтложеннаяИнициализация, ИсключаемыеВиды, СкрываемыеВиды)
Если ТипЗнч(Форма.ПараметрыКонтактнойИнформации) <> Тип("Структура") Тогда
Форма.ПараметрыКонтактнойИнформации = Новый Структура;
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда
МодульОтправкаSMS = ОбщегоНазначения.ОбщийМодуль("ОтправкаSMS");
МожноОтправлятьSMS = МодульОтправкаSMS.ДоступнаОтправкаSMS();
Иначе
МожноОтправлятьSMS = Ложь;
КонецЕсли;
ПараметрыКонтактнойИнформации = Новый Структура;
ПараметрыКонтактнойИнформации.Вставить("ГруппаДляРазмещения", ИмяЭлементаДляРазмещения);
ПараметрыКонтактнойИнформации.Вставить("ПоложениеЗаголовка", ЗначениеПоложенияЗаголовкаКИ(ПоложениеЗаголовкаКИ));
ПараметрыКонтактнойИнформации.Вставить("ДобавленныеРеквизиты", Новый СписокЗначений);
ПараметрыКонтактнойИнформации.Вставить("ОтложеннаяИнициализация", ОтложеннаяИнициализация);
ПараметрыКонтактнойИнформации.Вставить("ИсключаемыеВиды", ИсключаемыеВиды);
ПараметрыКонтактнойИнформации.Вставить("ВыполненаОтложеннаяИнициализация", Ложь);
ПараметрыКонтактнойИнформации.Вставить("ДобавленныеЭлементы", Новый СписокЗначений);
ПараметрыКонтактнойИнформации.Вставить("СписокДобавляемыхЭлементов", Новый СписокЗначений);
ПараметрыКонтактнойИнформации.Вставить("МожноОтправлятьSMS", МожноОтправлятьSMS);
ПараметрыКонтактнойИнформации.Вставить("Владелец", Неопределено);
ПараметрыКонтактнойИнформации.Вставить("ОбработкаНавигационнойСсылки", Ложь);
ПараметрыКонтактнойИнформации.Вставить("СкрываемыеВиды", СкрываемыеВиды);
ПараметрыАдреса = Новый Структура("ТипПомещения, Страна, Индекс", "Квартира");
ПараметрыКонтактнойИнформации.Вставить("ПараметрыАдреса", ПараметрыАдреса);
Форма.ПараметрыКонтактнойИнформации.Вставить(ИмяЭлементаДляРазмещения, ПараметрыКонтактнойИнформации);
Возврат Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения];
КонецФункции
Функция ГруппаВидовКонтактнойИнформацииОбъекта(Знач ПолноеИмяОбъектаМетаданных)
Возврат ВидКонтактнойИнформацииПоИмени(СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", ""));
КонецФункции
// Возвращает виды контактной информации по имени.
// Если имя не указано, то возвращается полный список программно предопределенных видов.
//
// Возвращаемое значение:
// ТаблицаЗначений - Виды контактной информации.
// * Имя - Строка - Имя вида контактной информации.
// * Ссылка - СправочникСсылка.ВидыКонтактнойИнформации - Ссылка на элемент справочника виды контактной информации.
//
Функция ПредопределенныеВидыКонтактнойИнформации(Имя = "") Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ВидыКонтактнойИнформации.ИмяПредопределенногоВида КАК Имя,
| ВидыКонтактнойИнформации.Ссылка КАК Ссылка
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ГДЕ
| &Отбор";
Запрос = Новый Запрос();
Если ЗначениеЗаполнено(Имя) Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Отбор", "ВидыКонтактнойИнформации.ИмяПредопределенногоВида = &Имя");
Запрос.УстановитьПараметр("Имя", Имя);
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Отбор", "ВидыКонтактнойИнформации.ИмяПредопределенногоВида <> """"");
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
// Определяет значение положения заголовка. Для поддержки локализованных конфигураций.
//
// Параметры:
// ПоложениеЗаголовкаКИ - Строка - положения заголовка в текстовом представление на языке локализации.
//
// Возвращаемое значение:
// Строка - положения заголовка.
//
Функция ЗначениеПоложенияЗаголовкаКИ(ПоложениеЗаголовкаКИ)
Если ПоложениеЗаголовкаЭлементаФормы.Лево = ПоложениеЗаголовкаКИ Тогда
Возврат "ПоложениеЗаголовкаЭлементаФормы.Лево";
ИначеЕсли ПоложениеЗаголовкаЭлементаФормы.Верх = ПоложениеЗаголовкаКИ Тогда
Возврат "ПоложениеЗаголовкаЭлементаФормы.Верх";
ИначеЕсли ПоложениеЗаголовкаЭлементаФормы.Низ = ПоложениеЗаголовкаКИ Тогда
Возврат "ПоложениеЗаголовкаЭлементаФормы.Низ";
ИначеЕсли ПоложениеЗаголовкаЭлементаФормы.Право = ПоложениеЗаголовкаКИ Тогда
Возврат "ПоложениеЗаголовкаЭлементаФормы.Право";
ИначеЕсли ПоложениеЗаголовкаЭлементаФормы.Нет = ПоложениеЗаголовкаКИ Тогда
Возврат "ПоложениеЗаголовкаЭлементаФормы.Нет";
ИначеЕсли ПоложениеЗаголовкаЭлементаФормы.Авто = ПоложениеЗаголовкаКИ Тогда
Возврат "ПоложениеЗаголовкаЭлементаФормы.Авто";
КонецЕсли;
Возврат "";
КонецФункции
Процедура СоздатьДействие(Форма, ВидКонтактнойИнформации, ИмяРеквизита, ГруппаДействий, КоличествоАдресов, ЕстьКомментарий = Ложь, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация")
ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения);
ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки;
Тип = ВидКонтактнойИнформации.Тип;
СоздаватьДействиеДляТипа = Новый Соответствие();
Если Не ОбработкаНавигационнойСсылки Тогда
СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.ВебСтраница, Истина);
КонецЕсли;
СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, Истина);
СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.Телефон, Истина);
СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.Адрес, ?(КоличествоАдресов > 1, Истина, Ложь));
СоздаватьДействиеДляТипа.Вставить(Перечисления.ТипыКонтактнойИнформации.Skype, Истина);
Если Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда
МодульРаботаСПочтовымиСообщениями = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениями");
Если НЕ МодульРаботаСПочтовымиСообщениями.ДоступнаОтправкаПисем() Тогда
СоздаватьДействиеДляТипа[Тип] = Ложь;
КонецЕсли;
Иначе
СоздаватьДействиеДляТипа[Тип] = Ложь;
КонецЕсли;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И ВидКонтактнойИнформации.РедактированиеТолькоВДиалоге Тогда
СоздаватьДействиеДляТипа[Тип] = Ложь;
КонецЕсли;
Если СоздаватьДействиеДляТипа[Тип] = Истина Тогда
Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
ГруппаПодменюВерхнийУровень = Форма.Элементы.Добавить("КоманднаяПанель" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаДействий);
ГруппаПодменюВерхнийУровень.Вид = ВидГруппыФормы.КоманднаяПанель;
ГруппаПодменю = Форма.Элементы.Добавить("Подменю" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаПодменюВерхнийУровень);
ГруппаПодменю.Заголовок = НСтр("ru='Контактная информация'");
ГруппаПодменю.Вид = ВидГруппыФормы.Подменю;
ГруппаПодменю.Картинка = БиблиотекаКартинок.МенюДополнительныеФункции;
ГруппаПодменю.Отображение = ОтображениеКнопки.Картинка;
ГруппаПодменю.РастягиватьПоГоризонтали = Ложь;
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
ГруппаДействий.ОтображатьЗаголовок = Истина;
ГруппаПодменюВерхнийУровень.РастягиватьПоГоризонтали = Ложь;
ГруппаПодменюВерхнийУровень.Ширина = 5;
ГруппаПодменюВерхнийУровень.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
ГруппаПодменюВерхнийУровень.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлемента.Центр;
КонецЕсли;
Иначе
ГруппаПодменю = ГруппаДействий;
// Есть действие
ИмяКоманды = "Команда" + ИмяРеквизита;
Команда = Форма.Команды.Добавить(ИмяКоманды);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
Команда.Отображение = ОтображениеКнопки.Картинка;
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Элемент = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаПодменю);
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Элемент.ВертикальноеПоложениеВГруппе = ВертикальноеПоложениеЭлемента.Центр;
Элемент.Ширина = 5;
КонецЕсли;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 2);
Элемент.ИмяКоманды = ИмяКоманды;
КонецЕсли;
Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
Если Не ВидКонтактнойИнформации.ПометкаУдаления Тогда
// Ввод комментария через контекстное меню.
ИмяКоманды = "КонтекстноеМенюПодменю" + ИмяРеквизита;
Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаПодменю);
Кнопка.Заголовок = НСтр("ru = 'Ввести комментарий'");
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Подсказка = НСтр("ru = 'Ввести комментарий'");
Команда.Картинка = БиблиотекаКартинок.Комментарий;
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Команда.ИзменяетСохраняемыеДанные = Истина;
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
КонецЕсли;
// История изменений
Если ВидКонтактнойИнформации.ХранитьИсториюИзменений И Не ВидКонтактнойИнформации.ПометкаУдаления Тогда
ИмяКоманды = "КонтекстноеМенюПодменюИстория" + ИмяРеквизита;
Кнопка = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ГруппаПодменю);
Кнопка.Заголовок = НСтр("ru = 'История изменений...'");
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Картинка = БиблиотекаКартинок.ИсторияИзменений;
Команда.Подсказка = НСтр("ru = 'Показывает историю изменения контактной информации'");
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Команда.ИзменяетСохраняемыеДанные = Ложь;
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
КонецЕсли;
// Устанавливаем свойства поля ввода.
ГруппаРазделитель = Форма.Элементы.Добавить("ПодменюРазделительАдрес" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаПодменю);
ГруппаРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок;
ИмяКоманды = "КартаЯндексМеню" + ИмяРеквизита;
Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделитель);
Кнопка.Заголовок = НСтр("ru = 'Адрес на Яндекс.Картах'");
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Картинка = БиблиотекаКартинок.ЯндексКарты;
Команда.Подсказка = НСтр("ru = 'Показывает адрес на картах Яндекс.Карты'");
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
ИмяКоманды = "КартаGoogleМеню" + ИмяРеквизита;
Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаРазделитель);
Кнопка.Заголовок = НСтр("ru = 'Адрес на Google Maps'");
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Картинка = БиблиотекаКартинок.GoogleMaps;
Команда.Подсказка = НСтр("ru = 'Показывает адрес на карте Google Maps'");
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 1);
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
Если Не ВидКонтактнойИнформации.ПометкаУдаления Тогда
ГруппаРазделитель = Форма.Элементы.Добавить("ПодменюРазделитель" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаРазделитель);
ГруппаРазделитель.Вид = ВидГруппыФормы.ГруппаКнопок;
ГруппаПодменюАдреса = Форма.Элементы.Добавить("ПодменюКопироватьАдреса" + ИмяРеквизита, Тип("ГруппаФормы"), ГруппаРазделитель);
ГруппаПодменюАдреса.Вид = ВидГруппыФормы.Подменю;
ГруппаПодменюАдреса.Отображение = ОтображениеКнопки.Текст;
ГруппаПодменюАдреса.Заголовок = НСтр("ru='Заполнить'");
КонецЕсли;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
Элемент.Заголовок = НСтр("ru = 'Написать письмо'");
Команда.Подсказка = НСтр("ru = 'Написать письмо'");
Команда.Картинка = БиблиотекаКартинок.ОтправитьЭлектронноеПисьмо;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда
Элемент.Заголовок = НСтр("ru = 'Перейти'");
Команда.Подсказка = НСтр("ru = 'Перейти по ссылке'");
Команда.Картинка = БиблиотекаКартинок.КонтактнаяИнформацияПерейтиПоСсылке;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
Если Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения].МожноОтправлятьSMS Тогда
Элемент.Заголовок = НСтр("ru = 'Позвонить или отправить SMS'");
Команда.Подсказка = НСтр("ru = 'Позвонить или отправить SMS'");
Команда.Картинка = БиблиотекаКартинок.ПозвонитьИлиОтправитьSMS;
Иначе
Элемент.Заголовок = НСтр("ru = 'Позвонить'");
Команда.Подсказка = НСтр("ru = 'Позвонить по телефону'");
Команда.Картинка = БиблиотекаКартинок.Позвонить;
КонецЕсли;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Skype Тогда
Элемент.Заголовок = НСтр("ru = 'Skype'");
Команда.Подсказка = НСтр("ru = 'Skype'");
Команда.Картинка = БиблиотекаКартинок.Skype;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ПараметрыКонтактнойИнформацииФормы(ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения)
Если НЕ ЗначениеЗаполнено(ИмяЭлементаДляРазмещения) ИЛИ НЕ ПараметрыКонтактнойИнформации.Свойство(ИмяЭлементаДляРазмещения) Тогда
Для каждого ПерваяЗапись Из ПараметрыКонтактнойИнформации Цикл
Возврат ПерваяЗапись.Значение;
КонецЦикла;
Возврат ПараметрыКонтактнойИнформации;
КонецЕсли;
Возврат ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения];
КонецФункции
Функция ОпределитьСледующуюСтроку(Форма, КонтактнаяИнформация, СтрокаКИ)
Позиция = КонтактнаяИнформация.Индекс(СтрокаКИ) + 1;
Пока Позиция < КонтактнаяИнформация.Количество() Цикл
СледующаяСтрока = КонтактнаяИнформация.Получить(Позиция);
Если СледующаяСтрока = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если Форма.Элементы.Найти(СледующаяСтрока.ИмяРеквизита) <> Неопределено Тогда
Возврат СледующаяСтрока;
КонецЕсли;
Позиция = Позиция + 1;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция НайтиСтрокиКонтактнойИнформации(ВидКонтактнойИнформации, Дата, КонтактнаяИнформация)
Отбор = Новый Структура("Вид", ВидКонтактнойИнформации);
Если ВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда
Отбор.Вставить("ДействуетС", Дата);
КонецЕсли;
НайденныеСтроки = КонтактнаяИнформация.НайтиСтроки(Отбор);
Возврат НайденныеСтроки;
КонецФункции
Функция ЗапрещенВводНесколькихЗначений(ВидКонтактнойИнформации, КонтактнаяИнформация, Дата, ИдентификаторСтрокиТабличнойЧасти = Неопределено)
Если ВидКонтактнойИнформации.РазрешитьВводНесколькихЗначений Тогда
Возврат Ложь;
КонецЕсли;
Отбор = Новый Структура("Вид", ВидКонтактнойИнформации);
Если ИдентификаторСтрокиТабличнойЧасти <> Неопределено Тогда
Отбор.Вставить("ИдентификаторСтрокиТабличнойЧасти", ИдентификаторСтрокиТабличнойЧасти);
КонецЕсли;
Если ВидКонтактнойИнформации.ХранитьИсториюИзменений Тогда
Отбор.Вставить("ДействуетС", Дата);
КонецЕсли;
НайденныеСтроки = КонтактнаяИнформация.НайтиСтроки(Отбор);
Возврат НайденныеСтроки.Количество() > 0;
КонецФункции
Процедура ЗаполнитьКонтактнуюИнформациюОбъектаИзСтроки(СтрокаКонтактнойИнформацииОбъекта, Периодическая, СтрокаКонтактнойИнформации)
ЗаполнитьЗначенияСвойств(СтрокаКонтактнойИнформации, СтрокаКонтактнойИнформацииОбъекта);
Если Периодическая Тогда
СтрокаКонтактнойИнформации.ДействуетС = СтрокаКонтактнойИнформацииОбъекта.Дата;
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаКонтактнойИнформации.Значение) Тогда
ОбъектКонтактнойИнформации = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(СтрокаКонтактнойИнформации.Значение, СтрокаКонтактнойИнформацииОбъекта.Тип);
ЗаполнитьТехническиеПоляКонтактнойИнформации(СтрокаКонтактнойИнформации, ОбъектКонтактнойИнформации, СтрокаКонтактнойИнформацииОбъекта.Тип);
КонецЕсли;
КонецПроцедуры
Процедура ВосстановитьПустыеЗначениеПредставление(СтрокаКонтактнойИнформации)
Если ПустаяСтрока(СтрокаКонтактнойИнформации.Тип) Тогда
СтрокаКонтактнойИнформации.Тип = УправлениеКонтактнойИнформациейСлужебныйПовтИсп.ТипВидаКонтактнойИнформации(
СтрокаКонтактнойИнформации.Вид);
КонецЕсли;
// ЗначенияПолей может отсутствовать в строке контактной информации
СведенияПолей = Новый Структура("ЗначенияПолей", Неопределено);
ЗаполнитьЗначенияСвойств(СведенияПолей, СтрокаКонтактнойИнформации);
ЕстьЗначенияПолей = (СведенияПолей.ЗначенияПолей <> Неопределено);
ПустоеПредставление = ПустаяСтрока(СтрокаКонтактнойИнформации.Представление);
ПустоеЗначение = ПустаяСтрока(СтрокаКонтактнойИнформации.Значение);
ПустыеЗначенияПолей = ?(ЕстьЗначенияПолей, ПустаяСтрока(СведенияПолей.ЗначенияПолей), Истина);
ВсеПоляПустые = ПустоеПредставление И ПустоеЗначение И ПустыеЗначенияПолей;
ВсеПоляЗаполнены = Не ПустоеПредставление И Не ПустоеЗначение И НЕ ПустыеЗначенияПолей;
Если ВсеПоляПустые Или ВсеПоляЗаполнены Тогда
Возврат;
КонецЕсли;
Если ПустоеПредставление Тогда
ФорматКонтактнойИнформации = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаКонтактнойИнформации.Вид,
"Тип, ВключатьСтрануВПредставление, ПроверятьПоФИАС");
Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда
МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами");
МодульРаботаСАдресами.ОпределитьФорматКонтактнойИнформации(ФорматКонтактнойИнформации);
КонецЕсли;
ИсточникЗначений = ?(ПустыеЗначенияПолей, СтрокаКонтактнойИнформации.Значение, СтрокаКонтактнойИнформации.ЗначенияПолей);
СтрокаКонтактнойИнформации.Представление = УправлениеКонтактнойИнформациейСлужебный.ПредставлениеКонтактнойИнформации(
ИсточникЗначений, ФорматКонтактнойИнформации);
КонецЕсли;
Если ПустоеЗначение Тогда
Если Не ПустоеПредставление И ПустыеЗначенияПолей Тогда
АдресПоПолям = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияПоПредставлению(
СтрокаКонтактнойИнформации.Представление, СтрокаКонтактнойИнформации.Тип);
СтрокаКонтактнойИнформации.Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(АдресПоПолям);
Если ЕстьЗначенияПолей Тогда
СтрокаКонтактнойИнформации.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзJSONВXML(
СтрокаКонтактнойИнформации.Значение, СтрокаКонтактнойИнформации.Тип);
КонецЕсли;
ИначеЕсли Не ПустыеЗначенияПолей Тогда
СтрокаКонтактнойИнформации.Значение = КонтактнаяИнформацияВJSON(СтрокаКонтактнойИнформации.ЗначенияПолей,
СтрокаКонтактнойИнформации.Тип);
КонецЕсли;
ИначеЕсли ПустыеЗначенияПолей И ЕстьЗначенияПолей Тогда
СтрокаКонтактнойИнформации.ЗначенияПолей = КонтактнаяИнформацияВXML(СтрокаКонтактнойИнформации.Значение,
СтрокаКонтактнойИнформации.Представление, СтрокаКонтактнойИнформации.Вид);
КонецЕсли;
КонецПроцедуры
// Приводит код страны к единому виду - строка длиной три символа.
//
Функция КодСтраныМира(Знач КодСтраны)
Если ТипЗнч(КодСтраны)=Тип("Число") Тогда
Возврат Формат(КодСтраны, "ЧЦ=3; ЧН=; ЧВН=; ЧГ=");
КонецЕсли;
Возврат Прав("000" + КодСтраны, 3);
КонецФункции
// Возвращает строку в кавычках.
//
Функция КонтрольКавычекВСтроке(Знач Строка)
Возврат """" + СтрЗаменить(Строка, """", """""") + """";
КонецФункции
Процедура ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения)
ПараметрыКонтактнойИнформации = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения];
ВсеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
НайденныеСтроки = ВсеСтроки.НайтиСтроки(
Новый Структура("Тип, ЭтоРеквизитТабличнойЧасти", Перечисления.ТипыКонтактнойИнформации.Адрес, Ложь));
ОбщееКоличествоКоманд = 0;
Для Каждого СтрокаКИ Из ВсеСтроки Цикл
Если ОбщееКоличествоКоманд > 50 Тогда // Ограничение для большого количества адресов на форме
Прервать;
КонецЕсли;
Если СтрокаКИ.Тип <> Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
Продолжить;
КонецЕсли;
ПодменюКопироватьАдреса = Форма.Элементы.Найти("ПодменюКопироватьАдреса" + СтрокаКИ.ИмяРеквизита);
КонтекстноеПодменюКопироватьАдреса = Форма.Элементы.Найти("КонтекстноеПодменюКопироватьАдреса" + СтрокаКИ.ИмяРеквизита);
Если ПодменюКопироватьАдреса <> Неопределено И КонтекстноеПодменюКопироватьАдреса = Неопределено Тогда
Продолжить;
КонецЕсли;
КоличествоКомандВПодменю = 0;
СписокАдресовВПодменю = Новый Соответствие();
СписокАдресовВПодменю.Вставить(ВРег(СтрокаКИ.Представление), Истина);
Для Каждого Адрес Из НайденныеСтроки Цикл
Если КоличествоКомандВПодменю > 7 Тогда // Ограничение для большого количества адресов на форме
Прервать;
КонецЕсли;
Если Адрес.ЭтоИсторическаяКонтактнаяИнформация Или Адрес.ИмяРеквизита = СтрокаКИ.ИмяРеквизита Тогда
Продолжить;
КонецЕсли;
ИмяКоманды = "МенюПодменюАдрес" + СтрокаКИ.ИмяРеквизита + "_" + Адрес.ИмяРеквизита;
Команда = Форма.Команды.Найти(ИмяКоманды);
Если Команда = Неопределено Тогда
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Подсказка = НСтр("ru = 'Скопировать адрес'");
Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду";
Команда.ИзменяетСохраняемыеДанные = Истина;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяКоманды, 9, Истина);
КоличествоКомандВПодменю = КоличествоКомандВПодменю + 1;
КонецЕсли;
ПредставлениеАдреса = ?(СтрокаКИ.МеждународныйФорматАдреса,
СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(Адрес.Представление), Адрес.Представление);
Если СписокАдресовВПодменю[ВРег(Адрес.Представление)] <> Неопределено Тогда
ПредставлениеАдреса = "";
Иначе
СписокАдресовВПодменю.Вставить(ВРег(Адрес.Представление), Истина);
КонецЕсли;
Если ПодменюКопироватьАдреса <> Неопределено Тогда
ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды,
ПредставлениеАдреса, ПараметрыКонтактнойИнформации, ПодменюКопироватьАдреса);
КонецЕсли;
Если КонтекстноеПодменюКопироватьАдреса <> Неопределено Тогда
ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды,
ПредставлениеАдреса, ПараметрыКонтактнойИнформации, КонтекстноеПодменюКопироватьАдреса);
КонецЕсли;
КонецЦикла;
ОбщееКоличествоКоманд = ОбщееКоличествоКоманд + КоличествоКомандВПодменю;
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьКнопкуСкопироватьАдрес(Форма, ИмяКоманды, ЗаголовокЭлемента, ПараметрыКонтактнойИнформации, Подменю)
ИмяЭлемента = Подменю.Имя + "_" + ИмяКоманды;
Кнопка = Форма.Элементы.Найти(ИмяЭлемента);
Если Кнопка = Неопределено Тогда
Кнопка = Форма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), Подменю);
Кнопка.ИмяКоманды = ИмяКоманды;
ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяЭлемента, 1);
КонецЕсли;
Кнопка.Заголовок = ЗаголовокЭлемента;
Кнопка.Видимость = ЗначениеЗаполнено(ЗаголовокЭлемента);
КонецПроцедуры
Функция ОписаниеНовойКонтактнойИнформации(Знач Тип) Экспорт
Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресамиКлиентСервер") <> Неопределено Тогда
МодульРаботаСАдресамиКлиентСервер = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресамиКлиентСервер");
Возврат МодульРаботаСАдресамиКлиентСервер.ОписаниеНовойКонтактнойИнформации(Тип);
КонецЕсли;
Возврат УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(Тип);
КонецФункции
// Получение глубокого свойства объекта.
//
Функция ПолучитьXDTOРеквизитОбъекта(ОбъектXTDO, XPath) Экспорт
// Переносов строки в XPath не ожидаем.
СтрокаСвойств = СтрЗаменить(СтрЗаменить(XPath, "/", Символы.ПС), Символы.ПС + Символы.ПС, "/");
ЧислоСвойств = СтрЧислоСтрок(СтрокаСвойств);
Если ЧислоСвойств = 1 Тогда
Результат = ОбъектXTDO.Получить(СтрокаСвойств);
Если ТипЗнч(Результат) = Тип("ОбъектXDTO") Тогда
Возврат Результат.Значение;
КонецЕсли;
Возврат Результат;
КонецЕсли;
Результат = ?(ЧислоСвойств = 0, Неопределено, ОбъектXTDO);
Для Индекс = 1 По ЧислоСвойств Цикл
Результат = Результат.Получить(СтрПолучитьСтроку(СтрокаСвойств, Индекс));
Если Результат = Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция КонтактнаяИнформацияИзРеквизитовФормы(Форма, Объект)
КонтактнаяИнформация = НоваяКонтактнаяИнформация(Ложь);
МетаданныеОбъекта = Объект.Ссылка.Метаданные();
ИмяОбъектаМетаданных = МетаданныеОбъекта.Имя;
ПолноеИмяОбъектаМетаданных = МетаданныеОбъекта.ПолноеИмя();
ГруппаВидовКонтактнойИнформации = ГруппаВидовКонтактнойИнформацииОбъекта(ПолноеИмяОбъектаМетаданных);
ИменаТабличныхЧастейПоВидамКИ = Неопределено;
Для Каждого СтрокаТаблицы Из Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл
ИмяРеквизита = СтрокаТаблицы.ИмяРеквизита;
Элемент = Форма.Элементы.Найти(ИмяРеквизита);
Если Элемент <> Неопределено Тогда
Если Элемент.Вид = ВидПоляФормы.ПолеНадписи И Элемент.Гиперссылка Тогда
Если ПустаяСтрока(СтрокаТаблицы.Представление)
ИЛИ СтрокаТаблицы.Представление = УправлениеКонтактнойИнформациейКлиентСервер.ТекстПустогоАдресаВВидеГиперссылки() Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ВосстановитьПустыеЗначениеПредставление(СтрокаТаблицы);
Если СтрокаТаблицы.ЭтоРеквизитТабличнойЧасти Тогда
Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда
Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина);
ВидыКИТабличнойЧасти = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(Отбор, "Вид");
ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъектаМетаданных);
КонецЕсли;
ИмяТабличнойЧасти = ИменаТабличныхЧастейПоВидамКИ[СтрокаТаблицы.Вид];
ТабличнаяЧастьФормы = Форма.Объект[ИмяТабличнойЧасти];
Для Каждого СтрокаТабличнойЧастиФормы Из ТабличнаяЧастьФормы Цикл
ИдентификаторСтроки = СтрокаТабличнойЧастиФормы.ПолучитьИдентификатор();
СтрокаТабличнойЧастиФормы.ИдентификаторСтрокиТабличнойЧасти = ИдентификаторСтроки;
СтрокаТабличнойЧасти = Объект[ИмяТабличнойЧасти][СтрокаТабличнойЧастиФормы.НомерСтроки - 1];
СтрокаТабличнойЧасти.ИдентификаторСтрокиТабличнойЧасти = ИдентификаторСтроки;
Значение = СтрокаТабличнойЧастиФормы[ИмяРеквизита + "Значение"];
ПеренестиЗаписьКонтактнойИнформацииИзФормыВТаблицу(КонтактнаяИнформация, СтрокаТаблицы, Значение, ИдентификаторСтроки);
КонецЦикла;
Иначе
Если СтрокаТаблицы.Вид.Родитель <> ГруппаВидовКонтактнойИнформации Тогда
Продолжить;
КонецЕсли;
ПеренестиЗаписьКонтактнойИнформацииИзФормыВТаблицу(КонтактнаяИнформация, СтрокаТаблицы, СтрокаТаблицы.Значение);
КонецЕсли;
КонецЦикла;
Возврат КонтактнаяИнформация;
КонецФункции
Процедура ПеренестиЗаписьКонтактнойИнформацииИзФормыВТаблицу(КонтактнаяИнформация, СтрокаТаблицы, Знач Значение, Знач ИдентификаторСтроки = Неопределено)
Если ПустаяСтрока(Значение) Тогда
Возврат;
КонецЕсли;
Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Значение) Тогда
ОбъектКИ = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияВСтруктуруJSON(Значение, СтрокаТаблицы.Тип);
Иначе
ОбъектКИ = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям(Значение, СтрокаТаблицы.Тип);
КонецЕсли;
Если Не УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияЗаполнена(ОбъектКИ) Тогда
Возврат;
КонецЕсли;
СтрокаКонтактнойИнформации = КонтактнаяИнформация.Добавить();
ДействуетС = ?(СтрокаТаблицы.Свойство("ДействуетС"), СтрокаТаблицы.ДействуетС, Неопределено);
ЗаполнитьЗначенияСвойств(СтрокаКонтактнойИнформации, СтрокаТаблицы, "Вид,Тип");
СтрокаКонтактнойИнформации.Представление = ОбъектКИ.Value;
СтрокаКонтактнойИнформации.Значение = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(ОбъектКИ);
СтрокаКонтактнойИнформации.ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияИзJSONВXML(ОбъектКИ, СтрокаТаблицы.Тип);
Если ЗначениеЗаполнено(ДействуетС) Тогда
СтрокаКонтактнойИнформации.Дата = ДействуетС;
КонецЕсли;
СтрокаКонтактнойИнформации.ИдентификаторСтрокиТабличнойЧасти = ИдентификаторСтроки;
КонецПроцедуры
// Виды контактной информации
Функция ПараметрыИзВидаКонтактнойИнформации(Знач ВидКонтактнойИнформации)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ВидыКонтактнойИнформации.Ссылка КАК Ссылка,
| ВидыКонтактнойИнформации.Родитель КАК Родитель,
| ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоГруппа,
| ВидыКонтактнойИнформации.Наименование КАК Наименование,
| ВидыКонтактнойИнформации.ТолькоНациональныйАдрес КАК ТолькоНациональныйАдрес,
| ВидыКонтактнойИнформации.ВидПоляДругое КАК ВидПоляДругое,
| ВидыКонтактнойИнформации.ВключатьСтрануВПредставление КАК ВключатьСтрануВПредставление,
| ВидыКонтактнойИнформации.ЗапретитьРедактированиеПользователем КАК ЗапретитьРедактированиеПользователем,
| ВидыКонтактнойИнформации.Используется КАК Используется,
| ВидыКонтактнойИнформации.МожноИзменятьСпособРедактирования КАК МожноИзменятьСпособРедактирования,
| ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение,
| ВидыКонтактнойИнформации.ПроверятьКорректность КАК ПроверятьКорректность,
| ВидыКонтактнойИнформации.РазрешитьВводНесколькихЗначений КАК РазрешитьВводНесколькихЗначений,
| ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге КАК РедактированиеТолькоВДиалоге,
| ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания,
| ВидыКонтактнойИнформации.СкрыватьНеактуальныеАдреса КАК СкрыватьНеактуальныеАдреса,
| ВидыКонтактнойИнформации.ТелефонCДобавочнымНомером КАК ТелефонCДобавочнымНомером,
| ВидыКонтактнойИнформации.Тип КАК Тип,
| ВидыКонтактнойИнформации.ХранитьИсториюИзменений КАК ХранитьИсториюИзменений,
| ВидыКонтактнойИнформации.ИмяПредопределенногоВида КАК Имя,
| ВидыКонтактнойИнформации.МеждународныйФорматАдреса КАК МеждународныйФорматАдреса
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ГДЕ
| ВидыКонтактнойИнформации.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ВидКонтактнойИнформации);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() = 0 Тогда
ШаблонТекстаОшибки = НСтр("ru='При получении свойств контактной информации был передан неверный вид контактной информации. %1'");
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки , Строка(ВидКонтактнойИнформации));
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Тип = РезультатЗапроса[0].Тип;
ТекущиеПараметры = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(РезультатЗапроса[0]);
ПараметрыВида = ОписаниеПараметровКонтактнойИнформации(Тип);
ЗаполнитьЗначенияСвойств(ПараметрыВида,ТекущиеПараметры);
Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
ЗаполнитьЗначенияСвойств(ПараметрыВида.НастройкиПроверки, ТекущиеПараметры, "ВключатьСтрануВПредставление,
|ПроверятьКорректность,СкрыватьНеактуальныеАдреса,ТолькоНациональныйАдрес");
Если Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда
МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами");
МодульРаботаСАдресами.ДополнитьНастройкиПроверкиАдреса(ПараметрыВида, ВидКонтактнойИнформации);
КонецЕсли;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
ПараметрыВида.НастройкиПроверки.ПроверятьКорректность = ТекущиеПараметры.ПроверятьКорректность;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
ПараметрыВида.НастройкиПроверки.ТелефонCДобавочнымНомером = ТекущиеПараметры.ТелефонCДобавочнымНомером;
ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда
ПараметрыВида.НастройкиПроверки.ВидПоляДругое = ТекущиеПараметры.ВидПоляДругое;
КонецЕсли;
ПараметрыВида.Вид = РезультатЗапроса[0].Ссылка;
Возврат ПараметрыВида;
КонецФункции
Функция ОбъектВидаКонтактнойИнформации(Имя, ЭтоГруппа = Ложь)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ВидыКонтактнойИнформации.Ссылка КАК Ссылка
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ГДЕ
| ВидыКонтактнойИнформации.ИмяПредопределенногоВида = &Имя
| И ВидыКонтактнойИнформации.ЭтоГруппа = &ЭтоГруппа";
Запрос.УстановитьПараметр("Имя", Имя);
Запрос.УстановитьПараметр("ЭтоГруппа", ЭтоГруппа);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выгрузить();
Ссылка = ВыборкаДетальныеЗаписи[0].Ссылка;
Возврат Ссылка.ПолучитьОбъект();
КонецЕсли;
ИменаПредопределенных = Метаданные.Справочники.ВидыКонтактнойИнформации.ПолучитьИменаПредопределенных();
ИмяПредопределенного = ИменаПредопределенных.Найти(Имя);
Если ИмяПредопределенного <> Неопределено Тогда
Объект = Справочники.ВидыКонтактнойИнформации[Имя].ПолучитьОбъект();
Объект.ИмяПредопределенногоВида = Имя;
Возврат Объект;
КонецЕсли;
Если ЭтоГруппа Тогда
НовыйЭлемент = Справочники.ВидыКонтактнойИнформации.СоздатьГруппу();
Иначе
НовыйЭлемент = Справочники.ВидыКонтактнойИнформации.СоздатьЭлемент();
КонецЕсли;
НовыйЭлемент.ИмяПредопределенногоВида = Имя;
Возврат НовыйЭлемент;
КонецФункции
// Возвращает описание свойств контактной информации для переданного типа контактной информации.
// Полученная структура используется в обработчиках обновления при заполнении видов контактной информации
// или при формировании параметров открытии формы ввода адреса или телефона для метода используемые в ОткрытьФормуКонтактнойИнформации.
//
// Параметры:
// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации.
//
// Возвращаемое значение:
// Структура - содержит структуру с полями:
// * Имя - Строка - Уникальное имя вида контактной информации.
// * Наименование - Строка - Наименование вида контактной информации.
// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - Ссылка на вид контактной информации.
// Значение по умолчанию - Справочник.ВидыКонтактнойИнформации.ПустаяСсылка.
// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации.
// * Группа - СправочникСсылка.ВидыКонтактнойИнформации, Неопределено - ссылка на группу(родителя) элемента справочника.
// Значение по умолчанию - Неопределено.
// * Используется - Булево - Если Ложь, то вид контактной информации недоступен для использования пользователем.
// Такой вид не выводится в формах и списке видов контактной информации.
// Значение по умолчанию - Истина.
// * МожноИзменятьСпособРедактирования - Булево - Признак возможности изменения свойств вида контактной информации пользователем.
// Если Ложь, то в форме вида контактной информации свойства доступны только для просмотра.
// Значение по умолчанию - Ложь.
// * РедактированиеТолькоВДиалоге - Булево - Если Истина, то форме выводится гиперссылка с представлением контактной информации
// по нажатию на которую, открывается форма соответствующего типа КИ.
// Свойство применимо только для контактной информации с типом: Адрес, Телефон, Факс, ВебСтраница.
// Значение по умолчанию - Ложь.
// * ХранитьИсториюИзменений - Булево - Признак возможности хранения истории контактной информации.
// Хранение истории допускается, если признак РедактированиеТолькоВДиалоге равен Истина.
// Свойство применимо если табличная часть КонтактнаяИнформация содержит реквизит ДействуетС.
// Значение по умолчанию - Ложь.
// * ОбязательноеЗаполнение - Булево - Если Истина, то требуется обязательный ввод значения в поле контактной информации. Значение по умолчанию - Ложь.
// * РазрешитьВводНесколькихЗначений - Булево - Признак возможности ввода нескольких значений для данного вида. Значение по умолчанию - Ложь.
// * ЗапретитьРедактированиеПользователем - Булево - Признак недоступности редактирования пользователем вида контактной информации. Значение по умолчанию - Ложь.
// * МеждународныйФорматАдреса - Булево - Признак международного формата адреса.
// Если Истина, то ввода всех адресов только в международном формате.
// Значение по умолчанию - Ложь.
// * ВидПоляДругое - Строка - Определяет внешний вид поля с типом Другое на форме. Варианты: МногострочноеШирокое, ОднострочноеШирокое, ОднострочноеУзкое.
// Свойство применимо только для контактной информации с типом: Другое.
// Для вида КИ с типом Другое значение по умолчанию - "ОднострочноеШирокое", иначе пустая строка.
// * НастройкиПроверки - Структура, Неопределено - Настройки проверки вида контактной информации. Состав полей зависит от типа контактной информации.
// Для типа Адрес - Структура, содержащая поля:
// * ТолькоНациональныйАдрес - Булево - если Истина, то разрешается ввод только национальных адресов. Изменение страны у адреса не допускается.
// * ПроверятьКорректность - Булево - если Истина, то для национальных адресов доступен ввод только адресов с разбивкой по полям проходящих проверку по ФИАС.
// Допускается ввод адресов других стран в свободной форме, если свойство ТолькоНациональныйАдрес = Ложь.
// Значение по умолчанию - Ложь.
// * ВключатьСтрануВПредставление - Булево - если Истина, то Наименование страны всегда добавляется в представление адреса, даже когда другие поля адреса пустые.
// Значение по умолчанию - Ложь
// * УказыватьОКТМО - Булево - признак возможности ручного ввода кода ОКМТО в форме ввода адреса.
// Для типа АдресЭлектроннойПочты - Структура, содержащая поля:
// * ПроверятьКорректность - Булево - если Истина, то запрещается пользователю ввод
// некорректный адрес электронной почты.
// Значение по умолчанию - Ложь.
// Для типа Телефон - Структура, содержащая поля:
// * ТелефонCДобавочнымНомером - Булево - если Истина, то в форме ввода телефона доступен ввод добавочного номера.
// Значение по умолчанию - Истина.
// Для остальных типов по умолчанию - Неопределено.
//
Функция ОписаниеПараметровКонтактнойИнформации(Знач ТипКонтактнойИнформации)
ПараметрыВида = ОписаниеОбщихПараметровВидаКонтактнойИнформации();
ПараметрыВида.Вставить("Вид", Справочники.ВидыКонтактнойИнформации.ПустаяСсылка());
ПараметрыВида.Вставить("Порядок", Неопределено);
ПараметрыВида.Вставить("Тип", ТипКонтактнойИнформации);
ПараметрыВида.Вставить("МожноИзменятьСпособРедактирования", Ложь);
ПараметрыВида.Вставить("РедактированиеТолькоВДиалоге", Ложь);
ПараметрыВида.Вставить("ОбязательноеЗаполнение", Ложь);
ПараметрыВида.Вставить("РазрешитьВводНесколькихЗначений", Ложь);
ПараметрыВида.Вставить("ЗапретитьРедактированиеПользователем", Ложь);
ПараметрыВида.Вставить("ХранитьИсториюИзменений", Ложь);
ПараметрыВида.Вставить("МеждународныйФорматАдреса", Ложь);
ВидПоляДругое = ?(ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Другое,
"ОднострочноеШирокое", "");
ПараметрыВида.Вставить("ВидПоляДругое", ВидПоляДругое);
Если ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
НастройкиПроверки = Новый Структура;
НастройкиПроверки.Вставить("ТолькоНациональныйАдрес", Ложь);
НастройкиПроверки.Вставить("ПроверятьКорректность", Ложь);
НастройкиПроверки.Вставить("ВключатьСтрануВПредставление", Ложь);
НастройкиПроверки.Вставить("УказыватьОКТМО", Ложь);
НастройкиПроверки.Вставить("СкрыватьНеактуальныеАдреса", Ложь); // устарело. Оставлено для обратной совместимости.
НастройкиПроверки.Вставить("ПроверятьПоФИАС", Истина); // устарело. Оставлено для обратной совместимости.
ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
НастройкиПроверки = Новый Структура;
НастройкиПроверки.Вставить("ПроверятьКорректность", Ложь);
ИначеЕсли ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
НастройкиПроверки = Новый Структура;
НастройкиПроверки.Вставить("ТелефонCДобавочнымНомером", Истина);
Иначе
НастройкиПроверки = Неопределено;
КонецЕсли;
ПараметрыВида.Вставить("НастройкиПроверки", НастройкиПроверки);
Возврат ПараметрыВида;
КонецФункции
Функция ОписаниеОбщихПараметровВидаКонтактнойИнформации()
ПараметрыВида = Новый Структура;
ПараметрыВида.Вставить("Имя", "");
ПараметрыВида.Вставить("Группа", Неопределено);
ПараметрыВида.Вставить("Наименование", "");
ПараметрыВида.Вставить("Используется", Истина);
Возврат ПараметрыВида;
КонецФункции
#КонецОбласти