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

Публикация № 1135035 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)

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

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

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

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

См. также

Google почта, IMAP и 1C на обычных формах

Адаптация типовых решений Email рассылки Платформа 1С v8.3 Бесплатно (free)

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

30.07.2021    2489    lisrws    4    

7

Рассылка по графику запланированных отпусков из ЗУП 3.1

Зарплата Email рассылки Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Бесплатно (free)

В ЗУП 3.1 мы используем документ График отпусков, которым регистрируем на новый год запланированный список. В карточке физического лица есть возможность указать адреса корпоративной, личной электронной почты или почты руководителя, который может получить уведомление, передать или подписать самостоятельно и передать в отдел кадров по почте или лично. В последнее время это помогает автоматизировать данный процесс путем отправки уведомления, например, за 14 дней до наступления отпуска.

02.04.2021    4476    keat24    2    

2

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

Email рассылки Платформа 1С v8.3 1С:Управление торговлей 11 Россия Бесплатно (free)

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

06.10.2019    5292    malikov_pro    6    

18

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

Email рассылки Платформа 1С v8.3 Россия Бесплатно (free)

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

28.03.2019    6922    VKuser13475183    0    

6

Видеокурс-практикум: как подготовить и написать ТЗ, ЗНР, ЧТЗ. Промо

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

3 500 рублей

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

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

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

25.12.2018    10785    1c.pro.fun    9    

18

УТ 10.3. Автоматическая подстановка почты контрагента при отправке печатной формы документа на электронную почту

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

Возникла необходимость в автоматической подстановке почты контрагента при отправке печатных форм документов на электронную почту. Каждый раз искать и выбирать очень долго.

14.05.2016    5365    murz44    1    

3

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

Email рассылки Адаптация типовых решений Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

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

08.02.2016    17727    config    3    

20

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

Email рассылки Математика и алгоритмы Платформа 1С v8.3 1С:Управление торговлей 10 Украина Бесплатно (free)

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

20.07.2015    27349    Bor_ka    9    

12

Работа с 1С:Аналитика Промо

Онлайн-курс предусматривает изучение возможностей системы “1С:Аналитика”, которая работает как составная часть платформы “1С:Предприятие” и обеспечивает оперативный просмотр и анализ необходимых данных.

4500 рублей

Как создать встречу и разослать приглашения в outlook из 1С?

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

Простейший пример создания встречи с рассылкой приглашений в outlook из 1с

29.08.2013    12385    a_plastinin    6    

10

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

Email рассылки Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Россия Бесплатно (free)

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

19.04.2013    32109    plkv    4    

20

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

Email рассылки Платформа 1С v8.3 1С:Комплексная автоматизация 1.х Россия Бесплатно (free)

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

27.03.2013    16765    d7k    7    

9

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

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

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

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

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

32

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

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

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

21.03.2011    14150    mozz    4    

8

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

Email рассылки Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

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

02.03.2011    17069    ruslanruslan    1    

24

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

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

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

06.10.2009    109810    vabue    48    

121