Механизм "Отложенная отправка писем", при записи документа

14.10.19

Интеграция - Email рассылки

Иногда требуется отправлять письма при записи документа. Чтобы избежать проблем с производительностью, сделал механизм "Отложенная отправка писем".

В механизме реализовано: 

  • выбор времени отправки.
  • возможность прикрепить во вложение печатную форму "Табличный документ".
  • проверка по ссылке отправляли или нет письмо по данному документу.
  • возможность оправлять письма и без привязки к документу.

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. Функция проверки отправляли письмо или нет по ссылке документа.

 
Функция ПисьмоОтправляли(Док) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПисьмаОтправленные.Объект КАК Объект
		|ИЗ
		|	РегистрСведений.ОтложеннаяОтправкаПисем КАК ПисьмаОтправленные
		|ГДЕ
		|	ПисьмаОтправленные.Объект = &Док";
	Запрос.УстановитьПараметр("Док",Док);
	Возврат Не Запрос.Выполнить().Пустой();	
	
КонецФункции

 

Тестировал на платформе 1С:Предприятие 8.3 (8.3.13.1644)

письма почта

См. также

"Акты сверки +" Групповая подготовка и рассылка актов сверки для Бухгалтерии 3.0.

Взаиморасчеты Email рассылки Акт сверки Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Платные (руб)

Внешняя обработка для Бухгалтерии 3.0 - позволяет автоматически формировать документы «Акт сверки расчетов» с контрагентами за выбранный период с последующей фоновой отправкой на почту контрагента.

3000 руб.

25.11.2020    22422    182    6    

162

Автоматическая рассылка отчетов из 1С: Управление торговлей 10.3 и 1С:УПП по электронной почте

Email рассылки Оптовая торговля Платформа 1С v8.3 1С:Управление торговлей 10 1С:Управление производственным предприятием Управленческий учет Платные (руб)

Многим сотрудникам предприятия требуется актуальная и достоверная информация для принятия верных управленческих решений. Получить данную информацию можно при помощи отчетов, существующих в конфигурации «1С: Управление торговлей 10.3» или «1С:УПП». Но не всегда у пользователей есть время, возможность и/или желание формировать отчеты непосредственно в системе. Намного привычней и удобней получать готовые отчеты на электронную почту, не открывая 1С.

12000 руб.

16.04.2014    84402    100    91    

94

Email, SMS, Telegram рассылки из 1С - Директ Маркетинг

Управление взаимоотношениями с клиентами (CRM) Мессенджеры и боты SMS рассылки Email рассылки Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Полный набор инструментов для качественных транзакционных и маркетинговых Email, SMS, Telegram рассылок из 1С. Даже простые уведомления об оплате счетов способны существенно упростить сбор дебиторской задолженности. Применение всех возможностей прямого маркетинга выводит коммуникацию с клиентами, уровень сервиса и лояльность на новый уровень.

7788 руб.

07.04.2014    83891    41    191    

127

Массовая рассылка печатных форм любых документов по электронной почте

Email рассылки Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

За $m и Руб. Решение для массовой рассылки печатных форм (в том числе и дополнительных) любых документов, и произвольных файлов по электронной почте. Рассылка пакета документов. Добавление факсимильных печати и подписи. Произвольные шаблоны HTML/Simple text с автозаполнением любыми полями документа. Любые форматы файлов. Упаковка вложений в архив. Транслитерация имен файлов. Разбиение рассылки на произвольные порции. Обход спам-фильтров. Журналирование рассылок.

3600 руб.

30.06.2022    9149    64    88    

26

Групповое формирование, согласование, печать и отправка по e-mail актов сверок взаиморасчетов (Бухгалтерия предприятия, ред. 3.0)

Email рассылки Взаиморасчеты Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Указывайте любой период, список организаций, контрагентов, видов договоров (с покупателем, с поставщиком и др.), счетов бухгалтерского учёта, валюту, необходимость детализации по договорам, список печатных форм и форматов их сохранения, а затем формируйте, согласовывайте, контролируйте, печатайте и отправляйте по e-mail готовые акты сверок прямо из 1С: Бухгалтерия предприятия, ред. 3.0.

9000 руб.

03.04.2018    30648    64    24    

64
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4674 14.10.19 14:16 Сейчас в теме
БСП: Получение и отправка электронных писем.
УправлениеЭлектроннойПочтой.ПолучениеИОтправкаЭлектронныхПисем
wolfsoft; mysm; dock; Indgo; +4 Ответить
2. John_d 5409 15.10.19 09:20 Сейчас в теме
(1) Спасибо, но одной процедуры без параметров недостаточно. Вот если бы ссылку на статью с подробным и простым описанием, как настроить это в БСП.
3. Fragster 1139 15.10.19 15:24 Сейчас в теме
(2) в БСП достаточно записать документ "ЭлектронноеПисьмоИсходящее" с заполненными реквизитами и он сам отправится в фоне. По заполнению реквизитов - в справку к БСП и списку процедур в ОтправкаПочтовыхСообщений и прочих у соответствующей подсистемы.
4. volokitinac 15.10.19 15:38 Сейчас в теме
На большом объеме записей на регистре будет много
база будет пухнуть из-за данных в МассивТабДок

пару лет назад до БСП, пришлось писать аналог на двух очередях, подписках и регламентных заданиях
1. Очередь для обработки новых документов для получения печатных форм
2. Очередь для рассылки полученных документов

как развитие можно завернуть на параллельные фоновые задания. но не стал.
5. Трактор 1247 21.10.19 10:02 Сейчас в теме
Я не гружу событие при записи. Регламентным заданием раз в минуту выбираю документы по которым надо отправить письма и создаю письма. Отправкой созданных писем занимается другое регламентное задание.
6. John_d 5409 21.10.19 10:48 Сейчас в теме
(5) Как вариант, но у меня требовали доказательств, что письма отправляются. Пользователи заходили в этот регистр и видели всю интересующую их информацию. С учетом, что тема и текст письма динамически формировались для разных получателей.
Оставьте свое сообщение