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

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

Разработка - Системная интеграция - Email рассылки

письма почта

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

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

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

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)

7

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

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

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

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

См. также

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

Статья Программист Нет файла v8 УТ11 Россия Бесплатно (free) Email

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

06.10.2019    1403    malikov_pro    5       

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

Статья Программист Нет файла v8 Россия Windows Бесплатно (free) Email

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

28.03.2019    2153    VKuser13475183    0       

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

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

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

25.12.2018    4745    1c.pro.fun    8       

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

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

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

23.01.2017    10593    RockLeeSan    0       

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

Статья Системный администратор Программист Нет файла v8 БП3.0 Россия Windows Бесплатно (free) Email Практика программирования

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

08.02.2016    14752    config    3       

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

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

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

20.07.2015    19016    Bor_ka    5       

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

Статья Системный администратор Программист Нет файла v8 УНФ Россия Windows Бесплатно (free) Email

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

19.04.2013    25823    plkv    4       

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

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

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

27.03.2013    14277    d7k    7       

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

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

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

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

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

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Email

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

21.03.2011    12089    mozz    4       

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

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

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

02.03.2011    14844    ruslanruslan    1       

Почтовая рассылка 1С 8 6

Инструменты и обработки no Внешняя обработка (ert,epf) v8 1cv8.cf Управление взаимоотношениями с клиентами (СRM) Бесплатно (free) Email

Почтовая рассылка 1С 8 Благодаря *.xml вы никогда не теряете базу mail-получателей. Рассылку можно осуществлять как через OutLook так и с обычного бесплатного сервера.

02.02.2010    12172    319    mut_mut    6       

Расчетные листки организации с рассылкой по почте 24

Инструменты и обработки Бухгалтер Архив с данными v8 ЗУП2.5 Россия БУ Зарплата Бесплатно (free) Бухгалтерские Email

Расчетные листки организации с рассылкой по почте. Основана на стандартном отчете. Добавлена возможность рассылки расчетных листков в формате xls на почтовые ящики сотрудников.

21.10.2009    10166    284    Alltruist    19       

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

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

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

06.10.2009    97752    vabue    48       

Отправка почты из 1С 209

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Россия Бесплатно (free) Email

Небольшой пример использования различных способов отправки e-mail из 1С.

13.10.2008    56733    3976    coder1cv8    71       

Рассылка электронной почты пользователям по категориям 7

Инструменты и обработки no Внешняя обработка (ert,epf) v8 УТ10 УПП1 Управление взаимоотношениями с клиентами (СRM) Бесплатно (free) Email

Обработка позволяет вам выбрать по категориям контрагентов, контактных лиц контрагентов и разослать им электронное сообщение. Удобна для организации маркетинговых рассылок.

04.07.2008    6268    122    nav-it    1