Автор не я.
/// Вх Параметры: Например Объект - Документ,Контрагент,КонтактноеЛицоКонтрагнета,КонтактноеЛицо
/// Тип - тип контактной информации , Вид - вид контактной информации ,
/// Вых Параметры: Массив Структур , возращает массив с структурой Объект,Вид_КИ,Значение_КИ
Функция Получить_Все_ВозможныеВиды_КИ_Объекта(СсылкаЗнч,Тип_КИ,Вид_КИ = Неопределено) Экспорт
//// В документе ищет свойства и если в свойстах есть имеил тогда п
ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(СсылкаЗнч));
МассивВозврата = Новый Массив;
СоотвествияЗнч = Новый Соответствие;
ТекКонтрагент = Неопределено;
ТекКонтактноеЛицоКонтрагнета = Неопределено;
ТекКонтактноеЛицо = Неопределено;
Если ЭтоДокумент Тогда
///// Пока только для документа ЗаказПокупателя
Если ТипЗнч(СсылкаЗнч) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
ТаблицаПустая = Ложь;
Запрос = Новый Запрос("ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Свойство,
| ЗначенияСвойствОбъектов.Значение,
| ЗначенияСвойствОбъектов.Свойство.Наименование КАК Наименование_Свойства,
| ЗначенияСвойствОбъектов.Свойство.ТипЗначения КАК ТипЗначения
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Объект = &Объект");
Запрос.УстановитьПараметр("Объект",СсылкаЗнч);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 0 Тогда
ТаблицаПустая = Истина;
КонецЕсли;
СоотвествиеСвойств = Новый Соответствие;
Пока Выборка.Следующий() Цикл
СоотвествиеСвойств.Вставить(Выборка.Свойство,Выборка.Значение);
КонецЦикла;
ТаблицаСоотвествий = Константы.Простир_СоотвествиеСвойствЗаказу_РеквизитамКонтрагента.Получить();
Если Не ЗначениеЗаполнено(ТаблицаСоотвествий) Тогда
ТаблицаПустая = Истина;
КонецЕсли;
ТаблицаСоотвествий = ЗначениеИзСтрокиВнутр(ТаблицаСоотвествий);
Если ТаблицаСоотвествий.Количество() = 0 Тогда
ТаблицаПустая = Истина;
КонецЕсли;
Если НЕ ТаблицаПустая Тогда
Для Каждого Стр Из ТаблицаСоотвествий Цикл
Если ЗначениеЗаполнено(Вид_КИ) Тогда
Если Стр.РеквизитКонтрагента = Вид_КИ Тогда
ЗначениеСвойства = СоотвествиеСвойств.Получить(Стр.РеквизитКонтрагента);
Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
МассивВозврата.Добавить(Новый Структура("Объект,Вид_КИ,Значение_КИ",СсылкаЗнч,Стр.РеквизитКонтрагента,ЗначениеСвойства));
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗнч(Стр.РеквизитКонтрагента) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") И
Стр.РеквизитКонтрагента.Тип = Тип_КИ Тогда
ЗначениеСвойства = СоотвествиеСвойств.Получить(Стр.ИмяСовойстваЗаказа);
Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
МассивВозврата.Добавить(Новый Структура("Объект,Вид_КИ,Значение_КИ",СсылкаЗнч,Стр.РеквизитКонтрагента,ЗначениеСвойства));
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если СсылкаЗнч.Метаданные().Реквизиты.Найти("Контрагент") <> Неопределено Тогда
ТекКонтрагент = СсылкаЗнч.Контрагент;
КонецЕсли;
КонецЕсли;
Если ТипЗнч(СсылкаЗнч) = Тип("СправочникСсылка.Контрагенты") Тогда
ТекКонтрагент = СсылкаЗнч;
КонецЕсли;
Если ЗначениеЗаполнено(ТекКонтрагент) Тогда
МассивОбъектов_КИ = Новый Массив;
МассивОбъектов_КИ.Добавить(ТекКонтрагент);
Выборка_КонтактныеЛица_Контрагентов = Справочники.КонтактныеЛицаКонтрагентов.Выбрать(,ТекКонтрагент);
Пока Выборка_КонтактныеЛица_Контрагентов.Следующий() Цикл
Если Выборка_КонтактныеЛица_Контрагентов.ПометкаУдаления Тогда
Продолжить;
КонецЕсли;
МассивОбъектов_КИ.Добавить(Выборка_КонтактныеЛица_Контрагентов.Ссылка);
Если НЕ Выборка_КонтактныеЛица_Контрагентов.КонтактноеЛицо.Пустая() Тогда
МассивОбъектов_КИ.Добавить(Выборка_КонтактныеЛица_Контрагентов.КонтактноеЛицо);
КонецЕсли;
КонецЦикла;
Запрос = Новый Запрос("ВЫБРАТЬ
| КонтактнаяИнформация.Представление,
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Вид
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект В(&Объект)
| И КонтактнаяИнформация.Тип = &Тип");
Запрос.УстановитьПараметр("Объект",МассивОбъектов_КИ);
Запрос.УстановитьПараметр("Тип",Тип_КИ);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
МассивВозврата.Добавить(Новый Структура("Объект,Вид_КИ,Значение_КИ",Выборка.Объект,Выборка.Вид,Выборка.Представление));
КонецЦикла;
КонецЕсли;
Возврат МассивВозврата;
КонецФункции
МассивКонтактнойИнформации = Получить_Все_ВозможныеВиды_КИ_Объекта(пДокументСсылка, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, );