ВыполнитьРассылкуОтчетов (БСП)

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

Выполнить рассылку отчетов. Формирует отчеты и отправляет их согласно настройкам транспорта (Папка, FILE, EMAIL, FTP);

// Формирует отчеты и отправляет их согласно настройкам транспорта (Папка, FILE, EMAIL, FTP);
//
// Параметры:
//   Рассылка - СправочникСсылка.РассылкиОтчетов - выполняемая рассылка отчетов.
//   ПараметрыЖурнала - Структура - параметры записи в журнал регистрации.
//       * ИмяСобытия - Строка - имя события (или группы событий).
//       * Метаданные - ОбъектМетаданных - метаданные для привязки события журнала регистрации.
//       * Данные     - Произвольный - данные для привязки события журнала регистрации.
//   ДополнительныеНастройки - Структура - настройки, которые переопределяют стандартные параметры рассылки.
//       * Получатели - Соответствие - набор получателей и их e-mail адресов.
//           ** Ключ - СправочникСсылка - получатель.
//           ** Значение - Строка - набор e-mail адресов получателя в строке с разделителями.
//
// Возвращаемое значение:
//   Булево - признак успешного выполнения рассылки.
//
Функция ВыполнитьРассылкуОтчетов(Рассылка, ПараметрыЖурнала = Неопределено, ДополнительныеНастройки = Неопределено) Экспорт
	// Параметры записи в журнал регистрации.
	Если ПараметрыЖурнала = Неопределено Тогда
		ПараметрыЖурнала = Новый Структура;
	КонецЕсли;
	
	Если Не ПараметрыЖурнала.Свойство("ИмяСобытия") Тогда
		ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Запуск по требованию'", ОбщегоНазначения.КодОсновногоЯзыка()));
	КонецЕсли;
	
	Если Не ПараметрыЖурнала.Свойство("Данные") Тогда
		ПараметрыЖурнала.Вставить("Данные", Рассылка);
	КонецЕсли;
	
	Если Не ПараметрыЖурнала.Свойство("Метаданные") Тогда
		ПараметрыЖурнала.Вставить("Метаданные", ПараметрыЖурнала.Данные.Метаданные());
	КонецЕсли;
	
	// Проверка прав доступа
	Если Не ПравоВывода(ПараметрыЖурнала) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	// Проверка базовых реквизитов рассылки.
	Если Не Рассылка.Подготовлена
		Или Рассылка.ПометкаУдаления Тогда
		
		Причина = "";
		Если Не Рассылка.Подготовлена Тогда
			Причина = Причина + Символы.ПС + НСтр("ru = 'Рассылка не подготовлена'");
		КонецЕсли;
		Если Рассылка.ПометкаУдаления Тогда
			Причина = Причина + Символы.ПС + НСтр("ru = 'Рассылка помечена на удаление'");
		КонецЕсли;
		
		ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Предупреждение,
			НСтр("ru = 'Завершение'"), СокрЛП(Причина));
		Возврат Ложь;
		
	КонецЕсли;
	
	ЗапускЗафиксирован = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеНастройки, "ЗапускЗафиксирован");
	Если ЗапускЗафиксирован <> Истина Тогда
		// Регистрация запуска (запущена, но не выполнена).
		РегистрыСведений.СостоянияРассылокОтчетов.ЗафиксироватьЗапускРассылки(Рассылка);
	КонецЕсли;
	
	// Таблица отчетов
	ТаблицаОтчетов = Новый ТаблицаЗначений;
	ТаблицаОтчетов.Колонки.Добавить("Отчет", Метаданные.Справочники.РассылкиОтчетов.ТабличныеЧасти.Отчеты.Реквизиты.Отчет.Тип);
	ТаблицаОтчетов.Колонки.Добавить("ОтправлятьЕслиПустой", Новый ОписаниеТипов("Булево"));
	
	МассивТиповНастроек = Новый Массив;
	МассивТиповНастроек.Добавить(Тип("Неопределено"));
	МассивТиповНастроек.Добавить(Тип("ПользовательскиеНастройкиКомпоновкиДанных"));
	МассивТиповНастроек.Добавить(Тип("Структура"));
	
	ТаблицаОтчетов.Колонки.Добавить("Настройки", Новый ОписаниеТипов(МассивТиповНастроек));
	ТаблицаОтчетов.Колонки.Добавить("Форматы", Новый ОписаниеТипов("Массив"));
	
	// Форматы по умолчанию
	ФорматыПоУмолчанию = Новый Массив;
	Найденные = Рассылка.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", ПустоеЗначениеОтчета()));
	Для Каждого СтрокаФормат Из Найденные Цикл
		ФорматыПоУмолчанию.Добавить(СтрокаФормат.Формат);
	КонецЦикла;
	Если ФорматыПоУмолчанию.Количество() = 0 Тогда
		СписокФорматов = СписокФорматов();
		Для Каждого ЗначениеСписка Из СписокФорматов Цикл
			Если ЗначениеСписка.Пометка Тогда
				ФорматыПоУмолчанию.Добавить(ЗначениеСписка.Значение);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Если ФорматыПоУмолчанию.Количество() = 0 Тогда
		ВызватьИсключение НСтр("ru = 'Не установлены форматы по умолчанию.'");
	КонецЕсли;
	
	// Заполнение таблицы отчетов
	Для Каждого СтрокаОтчет Из Рассылка.Отчеты Цикл
		Стр = ТаблицаОтчетов.Добавить();
		Стр.Отчет = СтрокаОтчет.Отчет;
		Стр.ОтправлятьЕслиПустой = СтрокаОтчет.ОтправлятьЕслиПустой;
		
		// Настройки
		Настройки = СтрокаОтчет.Настройки.Получить();
		Если ТипЗнч(Настройки) = Тип("ТаблицаЗначений") Тогда
			Стр.Настройки = Новый Структура;
			Найденные = Настройки.НайтиСтроки(Новый Структура("Использование", Истина));
			Для Каждого СтрокаНастройка Из Найденные Цикл
				Стр.Настройки.Вставить(СтрокаНастройка.Реквизит, СтрокаНастройка.Значение);
			КонецЦикла;
		Иначе
			Стр.Настройки = Настройки;
		КонецЕсли;
		
		// Форматы
		Найденные = Рассылка.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СтрокаОтчет.Отчет));
		Если Найденные.Количество() = 0 Тогда
			Стр.Форматы = ФорматыПоУмолчанию;
		Иначе
			Для Каждого СтрокаФормат Из Найденные Цикл
				Стр.Форматы.Добавить(СтрокаФормат.Формат);
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	// Подготовка параметров доставки.
	ПараметрыДоставки = Новый Структура;
	ПараметрыДоставки.Вставить("ЗапускЗафиксирован",           Истина);
	ПараметрыДоставки.Вставить("Автор",                        Пользователи.ТекущийПользователь());
	ПараметрыДоставки.Вставить("ИспользоватьПапку",            Рассылка.ИспользоватьПапку);
	ПараметрыДоставки.Вставить("ИспользоватьСетевойКаталог",   Рассылка.ИспользоватьСетевойКаталог);
	ПараметрыДоставки.Вставить("ИспользоватьFTPРесурс",        Рассылка.ИспользоватьFTPРесурс);
	ПараметрыДоставки.Вставить("ИспользоватьЭлектроннуюПочту", Рассылка.ИспользоватьЭлектроннуюПочту);
	ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Рассылка.ТранслитерироватьИменаФайлов);
	
	// Проверки отмеченных способов доставки.
	Если Не ПараметрыДоставки.ИспользоватьПапку
		И Не ПараметрыДоставки.ИспользоватьСетевойКаталог
		И Не ПараметрыДоставки.ИспользоватьFTPРесурс
		И Не ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда
		ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Предупреждение,
			НСтр("ru = 'Не выбран способ доставки.'"));
		Возврат Ложь;
	КонецЕсли;
	
	ПараметрыДоставки.Вставить("Персонализирована", Рассылка.Персонализирована);
	ПараметрыДоставки.Вставить("Архивировать",      Рассылка.Архивировать);
	ПараметрыДоставки.Вставить("ИмяАрхива",         Рассылка.ИмяАрхива);
	УстановитьПривилегированныйРежим(Истина);
	ПараметрыДоставки.Вставить("ПарольАрхива", ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Рассылка, "ПарольАрхива"));
	УстановитьПривилегированныйРежим(Ложь);
	
	// Подготовка параметров доставки в папку.
	Если ПараметрыДоставки.ИспользоватьПапку Тогда
		ПараметрыДоставки.Вставить("Папка", Рассылка.Папка);
	КонецЕсли;
	
	// Подготовка параметров доставки в сетевой каталог.
	Если ПараметрыДоставки.ИспользоватьСетевойКаталог Тогда
		ПараметрыДоставки.Вставить("СетевойКаталогWindows", Рассылка.СетевойКаталогWindows);
		ПараметрыДоставки.Вставить("СетевойКаталогLinux",   Рассылка.СетевойКаталогLinux);
	КонецЕсли;
	
	// Подготовка параметров доставки на FTP ресурс.
	Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда
		ПараметрыДоставки.Вставить("Сервер",              Рассылка.FTPСервер);
		ПараметрыДоставки.Вставить("Порт",                Рассылка.FTPПорт);
		ПараметрыДоставки.Вставить("Логин",               Рассылка.FTPЛогин);
		УстановитьПривилегированныйРежим(Истина);
		ПараметрыДоставки.Вставить("Пароль", ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Рассылка, "FTPПароль"));
		УстановитьПривилегированныйРежим(Ложь);
		ПараметрыДоставки.Вставить("Каталог",             Рассылка.FTPКаталог);
		ПараметрыДоставки.Вставить("ПассивноеСоединение", Рассылка.FTPПассивноеСоединение);
	КонецЕсли;
	
	// Подготовка параметров доставки по электронной почте.
	Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда
		ПараметрыДоставки.Вставить("УчетнаяЗапись",   Рассылка.УчетнаяЗапись);
		ПараметрыДоставки.Вставить("ТолькоУведомить", Рассылка.ТолькоУведомить);
		ПараметрыДоставки.Вставить("СкрытыеКопии",    Рассылка.СкрытыеКопии);
		ПараметрыДоставки.Вставить("ШаблонТемы",      Рассылка.ТемаПисьма);
		ПараметрыДоставки.Вставить("ШаблонТекста", 
			?(
				Рассылка.ПисьмоВФорматеHTML, 
				Рассылка.ТекстПисьмаВФорматеHTML, 
				Рассылка.ТекстПисьма));
		
		// Получатели
		Если ДополнительныеНастройки <> Неопределено И ДополнительныеНастройки.Свойство("Получатели") Тогда
			
			ПараметрыДоставки.Вставить("Получатели", ДополнительныеНастройки.Получатели);
			
		Иначе
			
			Получатели = СформироватьСписокПолучателейРассылки(ПараметрыЖурнала, Рассылка);
			
			Если Получатели.Количество() = 0 Тогда
				
				ПараметрыДоставки.ИспользоватьЭлектроннуюПочту = Ложь;
				
				Если Не ПараметрыДоставки.ИспользоватьПапку
					И Не ПараметрыДоставки.ИспользоватьСетевойКаталог
					И Не ПараметрыДоставки.ИспользоватьFTPРесурс Тогда
					
					Возврат Ложь;
					
				КонецЕсли;
				
			КонецЕсли;
			
			ПараметрыДоставки.Вставить("Получатели", Получатели);
			
		КонецЕсли;
		
		// Дополнительные параметры
		ПараметрыДоставки.Вставить("ПараметрыПисьма", Новый Структура);
		
		// Адрес ответа
		Если ЗначениеЗаполнено(Рассылка.АдресОтвета) Тогда
			ПараметрыДоставки.ПараметрыПисьма.Вставить("АдресОтвета", Рассылка.АдресОтвета);
		КонецЕсли;
		
		// Вложения
		ПараметрыДоставки.ПараметрыПисьма.Вставить("ТипТекста", ?(Рассылка.ПисьмоВФорматеHTML, "HTML", "ПростойТекст"));
		ПараметрыДоставки.ПараметрыПисьма.Вставить("Картинки", Новый Структура);
		Если Рассылка.ПисьмоВФорматеHTML Тогда
			ПараметрыДоставки.ПараметрыПисьма.Картинки = Рассылка.КартинкиПисьмаВФорматеHTML.Получить();
		КонецЕсли;
		
	КонецЕсли;
	
	Если Не ПараметрыДоставки.Свойство("ЗапускЗафиксирован") Или Не ПараметрыДоставки.ЗапускЗафиксирован Тогда
		РегистрыСведений.СостоянияРассылокОтчетов.ЗафиксироватьЗапускРассылки(Рассылка);
	КонецЕсли;
	
	Результат = ВыполнитьРассылку(ТаблицаОтчетов, ПараметрыДоставки, Рассылка, ПараметрыЖурнала);
	РегистрыСведений.СостоянияРассылокОтчетов.ЗафиксироватьРезультатВыполненияРассылки(Рассылка, ПараметрыДоставки);
	Возврат Результат;
	
КонецФункции

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

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

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

ВыполнитьРассылку (БСП)

ВыполнитьРассылкуПоРасписанию (БСП)

ВыполнитьСейчас (БСП)

СоздатьНовуюРассылкуИзОтчета (БСП)

ПрисоединитьОтчетКСуществующейРассылке (БСП)

ОткрытьРассылкиСОтчетом (БСП)

ПодготовитьПараметрыИВыполнитьРассылку (БСП)

РассылкаОтчетовПодборДопОтчета (БСП)

ОпределитьИсключаемыеОтчеты (БСП)

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