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