/////////////////////////////////////////////////////////////////////////////////////////////////////// // 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ДобавочнымНомером", Истина); Иначе НастройкиПроверки = Неопределено; КонецЕсли; ПараметрыВида.Вставить("НастройкиПроверки", НастройкиПроверки); Возврат ПараметрыВида; КонецФункции Функция ОписаниеОбщихПараметровВидаКонтактнойИнформации() ПараметрыВида = Новый Структура; ПараметрыВида.Вставить("Имя", ""); ПараметрыВида.Вставить("Группа", Неопределено); ПараметрыВида.Вставить("Наименование", ""); ПараметрыВида.Вставить("Используется", Истина); Возврат ПараметрыВида; КонецФункции #КонецОбласти