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

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

Выполнить рассылку. Выполняет рассылку отчетов без элемента справочника "Рассылки отчетов".

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

	Если РассылкаВыполнена Тогда
		ЗаписьЖурнала(ПараметрыЖурнала, , НСтр("ru = 'Рассылка выполнена'"));
	Иначе
		ЗаписьЖурнала(ПараметрыЖурнала, , НСтр("ru = 'Рассылка не выполнена'"));
	КонецЕсли;
	
	ФайловаяСистема.УдалитьВременныйКаталог(ПараметрыДоставки.КаталогВременныхФайлов);
	
	// Результат.
	Если ПараметрыЖурнала.Свойство("БылиОшибки") Тогда
		ПараметрыДоставки.БылиОшибки = ПараметрыЖурнала.БылиОшибки;
	КонецЕсли;
	Если ПараметрыЖурнала.Свойство("БылиПредупреждения") Тогда
		ПараметрыДоставки.БылиПредупреждения = ПараметрыЖурнала.БылиПредупреждения;
	КонецЕсли;
	
	Возврат РассылкаВыполнена;
КонецФункции

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

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

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

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

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

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

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

ВыполнитьРассылкиВФоновомЗадании (БСП)

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

УведомитьИсполнителейОНовыхЗадачах (БСП)

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

TurboConf ИР адаптер 2.63