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

Публикация № 1135035

Разработка - Системная интеграция - 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)

Специальные предложения

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

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

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

См. также

Реализация отправки Email через SendPulse API

Email v8 УТ11 Россия Бесплатно (free)

Описана реализация отправки Email с использованием API и применением очереди отправки как пример для программистов (вариант компоновка блоков в контексте конкретного сервиса).

06.10.2019    3903    malikov_pro    5    

Об отправке электронных писем средствами платформы "Бухгалтерия предприятия КОРП"

Email v8 Россия Бесплатно (free)

Взаимодействие между пользователями посредством пересылки сообщений электронной почты на сегодняшний день является естественной необходимостью, такой, к примеру, как пересылка сообщений в социальных сетях и чатах. Современные системы автоматизации, такие как платформа 1С, способны удовлетворить потребность пользователей в отправке документации средствами взаимодействия платформы с почтовыми сервисами. Но для осуществления такого взаимодействия необходимо произвести настройки системы, об этом и пойдёт речь.

28.03.2019    4979    VKuser13475183    0    

Вдохнем вторую жизнь во встроенный почтовый клиент из 1С:Управление торговлей 10.3

Email Управление взаимоотношениями с клиентами (СRM) Управление взаимоотношениями с клиентами (СRM) v8 УТ10 УУ Бесплатно (free)

Хотели было воспользоваться почтовым клиентом из Управление торговлей 10.3, да не тут-то было. К сожалению, фирма "1С" почти совсем ее забросила и если Ваш респондент отправляет Вам письма, содержащие HTML, то Вас ждут матюки... Ну что же, как говорится: "Спасение утопающих - дело рук самих утопающих".

25.12.2018    8919    1c.pro.fun    9    

Код для кнопки "Отправить почтовым сообщением" любого табличного документа, используя механизмы УТ 11.2

Email Практика программирования v8 УТ11 Бесплатно (free)

Это не автономный код процедуры отправки, это приписка к уже существующему механизму почтовых сообщений, реализованному в УТ 11.2, когда ваша учетная запись уже создана, и вам остается лишь "навесить" код на кнопку. Этот механизм может быть использован для любой управляемой формы, на которой также присутствует Табличный документ.

23.01.2017    12587    RockLeeSan    0    

Как отправить по почте НЕтиповой документ, используя стандартные средства БП 3.0

Email Практика программирования v8 БП3.0 Россия Бесплатно (free)

После работы с отладчиком в 23-х Общих модулях в поисках того, как же формируется тема, отправитель и тело письма, было принято решение поделиться найденными строчками кода с коллегами в надежде на то, что это поможет сократить их время при работе с похожей задачей.

08.02.2016    16860    config    3    

Алгоритм создания и отправки электронного письма (со вложением) УТ 3.0 для Украины

Практика программирования Email v8 УТ10 Украина Бесплатно (free)

Алгоритм позволит быстро создать письмо с вложением (например, печатная форма Заказа клиента в формате XLS) и отправить его партнеру. Для конфигурации Управление торговлей для Украины 3.0

20.07.2015    23826    Bor_ka    6    

Настройка электронной почты в УНФ для Google Mail (gmail)

Email v8 УНФ Россия Бесплатно (free)

В конфигурации Управление небольшой фирмой имеется встроенный почтовый клиент, но он имеет серьезный недостаток, нет поддержки шифрования SSL. Соответственно работа с ящиком gmail будет невозможна. В данной статье я расскажу как заставить УНФ работать с gmail.

19.04.2013    29273    plkv    4    

Отправка почты с использованием основного почтового клиента ОС (продолжение)

Практика программирования Email v8 КА1 Россия Бесплатно (free)

В публикации описан фрагмент кода, позволяющий отправлять печатные формы с помощью почтового клиента операционной системы. Дальнейшее развитие публикации http://infostart.ru/public/91206/ Добавлено: 1. Поддержка Mozilla Thunderbird. 2. Автоподстановка адресата письма.

27.03.2013    16103    d7k    7    

Отправка почты с использованием основного почтового клиента ОС

Универсальные функции Email v8 УТ10 УПП1 Бесплатно (free)

В публикации описан фрагмент кода, позволяющий отправлять печатные формы с помощью почтового клиента операционной системы (напр. Outlook, Bat и т.д.)

21.09.2011    30111    Администратор 1С    18    

Управление электронной почтой: картинки в теле письма как tmp

Email v8 1cv8.cf Россия Бесплатно (free)

Столкнулся с проблемой отправки картинок из 1С (при использовании внешнего HTML редактора)

21.03.2011    13677    mozz    4    

Отправка e-mail через Microsoft Office Outlook

Практика программирования Email v8 1cv8.cf Россия Бесплатно (free)

Способ обхода повышенной безопасности Microsoft Office Outlook, для программного доступа к функциям работы с почтой. Используется библиотека Outlook Redemption.

02.03.2011    16531    ruslanruslan    1    

Почтовый клиент УТ и gmail

Администрирование данных 1С Универсальные функции Email v8 Бесплатно (free)

Скрещиваем почтовый клиент Управления торговлей и Google Apps. Натолкнулся на это - http://infostart.ru/public/16429/ - решение, и вспомнил, что делал похожую вещь для MS Exchange. Модификация конфигурации не потребуется.

06.10.2009    103691    vabue    48