Получение контактной информации из отбора

28.04.22

Задачи пользователя - Адаптация типовых решений

Универсальная функция получения контактной информации из отбора компоновки данных. Весь код в статье.

Понадобилось тут при создании рассылки отчетов получить электронные адреса из включенного пользователем отбора. Набросал универсальную функцию для конфигураций, основанных на БСП. Листинг функции с комментариями прилагаю.

Все действия выполняются на сервере. Версия БСП при тестировании 3.1.5. Ваша конфигурация должна включать в себя стандартную подсистему "Контактная информация" ("СтандартныеПодсистемы.КонтактнаяИнформация").

На вход подается коллекция элементов отбора КД (обязательно), тип и вид КИ (если необходимо получить только определенные виды контактной информации) и дата (для объектов, хранящих историю КИ).

На выходе получаем таблицу значений с полями Вид, Дата, Значение, ЗначенияПолей, ИдентификаторСтрокиТабличнойЧасти, НомерСтроки, Объект, Представление, Тип (повторяет структуру типовой функции БСП). Если на входе не было объектов, способных хранить КИ, возвращается Неопределено.

 

Пример вызова

Отбор = КомпоновщикНастроек.ПолучитьНастройки().Отбор;
КонтактнаяИнформация = КонтактнаяИнформацияОбъектовИзОтбора(Отбор.Элементы, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);

 

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

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

 

 

На тему БСП и смежные темы см. также публикации:

Сохранение настроек в базах на БСП без доработки конфигурации

СКД. Использование Менеджера временных таблиц в системе компоновки

БСП КИ контактная информация

См. также

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    5631    14    5    

24

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3895    11    0    

29

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    16721    dimanich70    81    

134
Оставьте свое сообщение