СформироватьСписокПолучателейРассылки (БСП)

Автор: 1С
ОбщийМодуль.РассылкаОтчетов
БСП

Сформировать список получателей рассылки. Формирует список получателей из табличной части "Получатели" рассылки.

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ВыбратьПолучателя (БСП)

ПриЗаполненииТелефоновПолучателейВСообщении (БСП)

ПриЗаполненииПочтыПолучателейВСообщении (БСП)

ПереопределитьТаблицуТиповПолучателей (БСП)

ПередФормированиемСпискаПолучателейРассылки (БСП)

ДополнитьПолучателей (БСП)

СформироватьСписокФайловДляОтправкиПоПочте (БСП)

СформироватьСписокВсехНовостей (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз