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