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