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

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    22400    181    5    

162

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

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

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

12000 руб.

16.04.2014    84368    100    91    

94

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

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

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

7788 руб.

07.04.2014    83821    41    191    

128

Групповое создание актов сверок

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

Обработки предназначены для массового создания актов сверки и отправки их по электронной почте для конфигураций Управление торговлей 10.3. и Бухгалтерия предприятия 3.0. Для Бухгалтерии 3.0 Разработка велась на 1С:Предприятие 8.3 (8.3.15.1830). проверялась на Бухгалтерия предприятия 3.0 (3.0.71.83) и 3.0.76.77 Для Управление торговлей 10.3 Разработка велась на 1С:Предприятие 8.3 релиз конфигурации (10.3.61.2) . РАБОТАЕТ НА БАЗОВЫХ и ПРОФ. ВЕРСИЯХ.

2000 руб.

24.04.2020    30517    120    66    

100

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

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

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

3600 руб.

30.06.2022    9126    63    88    

26

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

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

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

9000 руб.

03.04.2018    30646    64    24    

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

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

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