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