В механизме реализовано:
- выбор времени отправки.
- возможность прикрепить во вложение печатную форму "Табличный документ".
- проверка по ссылке отправляли или нет письмо по данному документу.
- возможность оправлять письма и без привязки к документу.
1. Создаем регистр сведений
Объект - тип ДокументСсылка
Вложения - тип ХранилищеЗначения
ДатаКогдаОтправить, ДатаОтправки - тип Дата и время
Адрес,Тема,Текст,Расширение - тип Строка
2. Добавляем регламентное задание, которое будет периодически отправлять письма.
3. К регламентному заданию привязываем процедуру, которая проверяет появились письма к отправке и отправляет их.
Процедура ОтложеннаяОтправкаПисем() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПисьмаОтправленные.Адрес КАК Адрес,
| ПисьмаОтправленные.Тема КАК Тема,
| ПисьмаОтправленные.Текст КАК Текст,
| ПисьмаОтправленные.Вложения КАК Вложения,
| ЕСТЬNULL(ПисьмаОтправленные.Объект.Номер, ""file"") КАК Номер,
| ПисьмаОтправленные.Объект КАК Объект,
| ПисьмаОтправленные.ДатаКогдаОтправить КАК ДатаКогдаОтправить,
| ПисьмаОтправленные.Расширение КАК Расширение
|ИЗ
| РегистрСведений.ОтложеннаяОтправкаПисем КАК ПисьмаОтправленные
|ГДЕ
| ПисьмаОтправленные.ДатаКогдаОтправить <= &ТекущаяДата
| И ПисьмаОтправленные.ДатаОтправки = &ПустаяДата";
Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1));
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Отказ = Ложь;
СоответствиеВложений = Новый Соответствие;
МассивТабДок = ВыборкаДетальныеЗаписи.Вложения.Получить();
Если МассивТабДок <> Неопределено Тогда
Для Каждого ТабДокумент Из МассивТабДок Цикл
ИмяФайла = ВыборкаДетальныеЗаписи.Номер+ "." + ВыборкаДетальныеЗаписи.Расширение;
ИмяВременногоФайла = КаталогВременныхФайлов() + ИмяФайла;
Попытка
Если ВРег(ВыборкаДетальныеЗаписи.Расширение) = "XLS" Тогда
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS);
ИначеЕсли ВРег(ВыборкаДетальныеЗаписи.Расширение) = "PDF" Тогда
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
ИначеЕсли ВРег(ВыборкаДетальныеЗаписи.Расширение) = "XLSX" Тогда
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
ИначеЕсли ВРег(ВыборкаДетальныеЗаписи.Расширение) = "TXT" Тогда
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.TXT);
ИначеЕсли ВРег(ВыборкаДетальныеЗаписи.Расширение) = "ODS" Тогда
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.ODS);
ИначеЕсли ВРег(ВыборкаДетальныеЗаписи.Расширение) = "DOCX" Тогда
ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.DOCX);
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Отказ = Истина;
Прервать;
КонецПопытки;
СоответствиеВложений.Вставить(ИмяФайла, Новый ДвоичныеДанные(ИмяВременногоФайла));
УдалитьФайлы(ИмяВременногоФайла);
КонецЦикла;
КонецЕсли;
Если Не Отказ Тогда
Попытка
Параметры1 = Новый Структура;
Параметры1.Вставить("Кому", ВыборкаДетальныеЗаписи.Адрес);
Параметры1.Вставить("Тема", ВыборкаДетальныеЗаписи.Тема);
Параметры1.Вставить("Тело", ВыборкаДетальныеЗаписи.Текст);
Параметры1.Вставить("ТипТекста", "Строка");
Параметры1.Вставить("Вложения", СоответствиеВложений);
//Тут идет отправка через типовой механизм БСП
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты, Параметры1);
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Отказ = Истина;
КонецПопытки;
КонецЕсли;
Если Не Отказ Тогда
МенеджерЗаписи = РегистрыСведений.ОтложеннаяОтправкаПисем.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ВыборкаДетальныеЗаписи);
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.ДатаОтправки = ТекущаяДата();
МенеджерЗаписи.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
4. Добавляем в общий модуль процедуру регистрации новых писем к отправке.
Процедура ДобавитьПисьмоВРегистрПисьмаОтправленные(СтруктураНастройка) Экспорт
Набор = РегистрыСведений.ОтложеннаяОтправкаПисем.СоздатьНаборЗаписей();
Набор.Отбор.ДатаКогдаОтправить.Установить(СтруктураНастройка.ДатаКогдаОтправить);
Набор.Отбор.Объект.Установить(СтруктураНастройка.Объект);
Запись = Набор.Добавить();
ЗаполнитьЗначенияСвойств(Запись,СтруктураНастройка);
Если ТипЗнч(СтруктураНастройка.МассивТабДок) = Тип("Массив") И СтруктураНастройка.МассивТабДок.Количество() > 0 Тогда
Запись.Вложения = Новый ХранилищеЗначения(СтруктураНастройка.МассивТабДок, Новый СжатиеДанных());
КонецЕсли;
Попытка
Набор.Записать();
Исключение
ОписаниеОшибки = ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
5. В модуль документа или другом месте добавляем вызов процедуры ДобавитьПисьмоВРегистрПисьмаОтправленные
&НаСервере
Процедура ОтправкаНаСервере()
объект1 = РеквизитФормыВЗначение("Объект");
ТабДокумент = Новый ТабличныйДокумент;
Макет = объект1.ПолучитьМакет("Макет");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ТабДокумент.Вывести(ОбластьЗаголовок);
СтрНастройка = Новый Структура;
СтрНастройка.Вставить("Адрес", "abc123@abc123.ru");
СтрНастройка.Вставить("Тема" , "Тема письма");
СтрНастройка.Вставить("Текст", "Текст письма");
МассивТабДок = Новый Массив;
МассивТабДок.Добавить(ТабДокумент);
СтрНастройка.Вставить("МассивТабДок", МассивТабДок);
СтрНастройка.Вставить("Объект", Документ);
СтрНастройка.Вставить("Расширение", "XLS");
СтрНастройка.Вставить("ДатаКогдаОтправить", ТекущаяДата());
СлужебныеПроцедурыИФункции.ДобавитьПисьмоВРегистрПисьмаОтправленные(СтрНастройка);
КонецПроцедуры
6. Функция проверки отправляли письмо или нет по ссылке документа.