Фоновая отправка уведомлений
Часто нужно уведомлять пользователей о событиях происходящих в системе на их электронную почту.
Например, для того что пришло уведомление о приходе денег от клиента по заказу, теперь перетащить модуль документа в расширение и вставить следующий код:
&После("ОбработкаПроведения")
Процедура Расш1__ОбработкаПроведения(Отказ, РежимПроведения)
Если Проведен = ложь тогда
Возврат;
Конецесли;
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ОснованиеПлатежа");
ТЗ.Колонки.Добавить("Партнер");
ТЗ.Колонки.Добавить("Сумма");
Для каждого стр из РасшифровкаПлатежа цикл
ЗаполнитьЗначенияСвойств(ТЗ.Добавить(),Стр);
Конеццикла;
ТЗ.Свернуть("ОснованиеПлатежа,Партнер","Сумма");
Для каждого стр из ТЗ цикл
Тема ="Приход: "+ стр.Сумма+" от "+Контрагент+?(ЗначениеЗаполнено(стр.ОснованиеПлатежа)," по "+стр.ОснованиеПлатежа,"");
КлючУникальности="Приход "+Ссылка.УникальныйИдентификатор()+" от "+Контрагент;
ДатаЗадания=ТекущаяДата();
Тема="Ознакомьтесь с поступлением денежных средств "+ Номер+ " от "+Формат(Дата,"ДФ=dd.MM.yy")+" от "+Контрагент;
Тело= "По "+стр.ОснованиеПлатежа+" поступили д.с. в размере "+ Формат(стр.Сумма,"ЧДЦ=2")+"
|
| Гиперссылка на поступление денежных средств: "+ПолучитьНавигационнуюСсылку(Ссылка)+"
|
|
| Прим. Вы можете перейти в документ, скопировав гиперссылку в буфер обмена и нажав в 1С ""Shift+F11""" ;
мо_ОтправкаУведомлений_Сервер.ОтправитьУведомлениеПоEmailВФоновомРежиме(стр.Партнер.ОсновнойМенеджер,Тема,Тело,,КлючУникальности,Ссылка);
Конеццикла;
КонецПроцедуры
На почту менеджеру придет уведомление:
Ознакомьтесь с поступлением денежных средств 0A00-001052 от 25.09.20 от ООО Uhff КФ Рус
1С:Предприятие Сегодня, 13:05 Кому: вам По Заказ клиента от "ООО Гром КФ Рус" А20-0000458 от 27.07.2020 18:29:16 поступили д.с. в размере 661 240,80
|
Преймущества по сравнению с обычным кодом:
- Уведомления не задублируются. Правильно подобрав ключ уникальности, Вы гарантируете единичную отправку сообщения.
- Вам не нужно вспоминать детали работы с электронными письмами. Все что вам нужно, это ссылка на пользователя (у него должен быть прописан e-mail в контактной информации, ссылка на объект (можно даже еще не записанный) и текст сообщения.
- Экономия времени. Теперь, чтоб добавить уведомление о событие, Вам всего лишь надо скопировать небольшой фрагмент кода и подправить текст сообщения.
- Экономия кода. Уведомлений о событиях много и основная работа с ними выделена в общий модуль.
- Все сообщения отправляются в фоновом режиме. Это значит, что сколько бы времени ни занял процесс отправки, это никак не повлияет на работу программы.
-
Пример отправки сообщения из еще не записанного справочника с отправкой гиперссылки на будущий элемент:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ПередЗаписьюНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере()
КонтрольнаяСумма=Объект.ПредпечатнаяПодготовка;
Для Каждого СтрокаВарианта Из Объект.ВариантыРасчета цикл
КонтрольнаяСумма=КонтрольнаяСумма+ СтрокаВарианта.Цена;
КонецЦикла;
КонтрольнаяСумма2=Объект.Ссылка.ПредпечатнаяПодготовка;
Для Каждого СтрокаВарианта Из Объект.Ссылка.ВариантыРасчета цикл
КонтрольнаяСумма2=КонтрольнаяСумма+ СтрокаВарианта.Цена;
КонецЦикла;
Если КонтрольнаяСумма2<> КонтрольнаяСумма Тогда
Если Объект.Ссылка=Неопределено Тогда
// Получаем возможно уже установленную ранее ссылку нового
СсылкаНаОбъект = Объект.ПолучитьСсылкуНового();
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
// Если ссылка нового пустая, то запрашиваем ее у менеджера и устанавливаем
СсылкаНаОбъект = Документы.мо_ЗаказНаРасчет.ПолучитьСсылку();
Объект.УстановитьСсылкуНового(СсылкаНаОбъект);
КонецЕсли;
Иначе
СсылкаНаОбъект = Объект.Ссылка;
КонецЕсли;
ДатаЗадания=ТекущаяДата();
Тема="Ознакомьтесь с изменением цен по расчету "+ Объект.Номер+ " от "+Формат(ДатаЗадания,"ДФ=dd.MM.yy");
КлючУникальностиДокумента= "Изменение цен по расчету "+ Объект.Номер+ " от "+Формат(ДатаЗадания,"ДФ=dd.MM.yy");
//Задача.Предмет = Сделка;
Тело= "По заданию на расчет по сделке"+Объект.Ссылка+" поменялись рассчитанные цены!
|
| Гиперссылка на заказ на расчет: "+ПолучитьНавигационнуюСсылку(СсылкаНаОбъект)+"
|
|
| Прим. Вы можете перейти в документ, скопировав гиперссылку в буфер обмена и нажав в 1С ""Shift+F11""" ;
мо_ОтправкаУведомлений_Сервер.ОтправитьУведомлениеПоEmailВФоновомРежиме(Объект.Менеджер,Тема,Тело,,КлючУникальностиДокумента,СсылкаНаОбъект);
КонецЕсли;
КонецПроцедуры
Если В
Если Вы цените свое время и чувствуете в себе силы выразить немного благодарности в виде стартмани, то рекомендую скачать расширение в готовом виде.
Если Вам это не доступно по каким то причинам, то код основных фрагментов расширения приведен ниже:
Процедура ОтправитьУведомлениеПоEmail(М_Пользователи,Тема,Тело,АдресОтвета="",КлючУникальности="",КлючеваяСсылка="") Экспорт
УстановитьПривилегированныйРежим(Истина);
ПараметрыПисьма = Новый Структура;
Кому ="";
Если ТипЗнч(М_Пользователи)=Тип("Массив") Тогда
Для Каждого Пользователь из М_Пользователи Цикл
Адрес=УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Пользователь,Справочники.ВидыКонтактнойИнформации.EmailПользователя);
Если ЗначениеЗаполнено(Адрес) Тогда
Кому =Кому+?(Кому="","",";")+Адрес;
КонецЕсли;
КонецЦикла;
Иначе
Адрес=УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(М_Пользователи,Справочники.ВидыКонтактнойИнформации.EmailПользователя);
Если ЗначениеЗаполнено(Адрес) Тогда
Кому =Кому+?(Кому="","",";")+Адрес;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(Кому) Тогда
ПараметрыПисьма.Вставить("Кому", Кому);
Иначе
возврат;
КонецЕсли;
УчетнаяЗаписьИзНастроек=Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
ПараметрыПисьма.Вставить("АдресОтвета", АдресОтвета);
ПараметрыПисьма.Вставить("Тема", Тема);
//ФайлВФорматеHTML = ПолучитьИмяВременногоФайла();
//ТабДок.Записать(ФайлВФорматеHTML, ТипФайлаТабличногоДокумента.HTML5);
//ТекстПисьма = Новый ТекстовыйДокумент;
//ТекстПисьма.Прочитать(ФайлВФорматеHTML);
// ХТМЛПоле = ТекстПисьма.ПолучитьТекст();
ПараметрыПисьма.Вставить("Тело", Тело);
ПараметрыПисьма.Вставить("ТипТекста", ПредопределенноеЗначение("Перечисление.ТипыТекстовЭлектронныхПисем.ПростойТекст"));
Если КлючУникальности="" ИЛИ РегистрыСведений.мо_СчетчикСобытий.ПолучитьСчетчик(КлючУникальности,КлючеваяСсылка)=0 Тогда
Попытка
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗаписьИзНастроек, ПараметрыПисьма);
Если КлючУникальности<>"" Тогда
РегистрыСведений.мо_СчетчикСобытий.УвеличитьСчетчик(КлючУникальности,КлючеваяСсылка);
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Функция ЗапуститьФоновоеВыполнение(ТекстПроцедуры,СтруктураПараметров=Неопределено) Экспорт
УникальныйИдентификатор = Новый УникальныйИдентификатор;
ПараметрыВыполнения = Новый Массив;
ПараметрыВыполнения.Добавить(ТекстПроцедуры);
ПараметрыВыполнения.Добавить(СтруктураПараметров);
ФоновыеЗадания.Выполнить("мо_ОтправкаУведомлений_Сервер.ФоноваяПроцедура",ПараметрыВыполнения,УникальныйИдентификатор);
Возврат УникальныйИдентификатор;
КонецФункции
Процедура ФоноваяПроцедура(ТекстМодуля,ПараметрыВыполнения) Экспорт
ПолныйТекстМодуля = "";
Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
ПолныйТекстМодуля = ПолныйТекстМодуля+ТекПараметр.Ключ+"=ПараметрыВыполнения."+ТекПараметр.Ключ+";"+Символы.ПС;
КонецЦикла;
ПолныйТекстМодуля = ПолныйТекстМодуля + ТекстМодуля;
Выполнить(ПолныйТекстМодуля);
КонецПроцедуры
Процедура ОтправитьУведомлениеПоEmailВФоновомРежиме(М_Пользователи,Тема,Тело,АдресОтвета="",КлючУникальности="",КлючеваяСсылка="") Экспорт
ТекстФоновойПроцедуры = "
|мо_ОтправкаУведомлений_Сервер.ОтправитьУведомлениеПоEmail(М_Пользователи,Тема,Тело,АдресОтвета,КлючУникальности,КлючеваяСсылка);";
СтруктураПараметров=Новый Структура;
СтруктураПараметров.Вставить("М_Пользователи",М_Пользователи);
СтруктураПараметров.Вставить("Тема",Тема);
СтруктураПараметров.Вставить("Тело",Тело);
СтруктураПараметров.Вставить("АдресОтвета",АдресОтвета);
СтруктураПараметров.Вставить("КлючУникальности",КлючУникальности);
СтруктураПараметров.Вставить("КлючеваяСсылка",КлючеваяСсылка);
ЗапуститьФоновоеВыполнение(ТекстФоновойПроцедуры,СтруктураПараметров);
КонецПроцедуры
Рег
Регистр счетчик событий:
Модуль менеджера:
&П
Процедура УвеличитьСчетчик(ИмяСобытия,КлючеваяСсылка)ЭКСПОРТ
УстановитьПривилегированныйРежим(Истина);
НЗСчетчик= РегистрыСведений.мо_СчетчикСобытий.СоздатьНаборЗаписей();
НЗСчетчик.Отбор.ИмяСобытия.Установить(ИмяСобытия);
НЗСчетчик.Отбор.КлючеваяСсылка.Установить(КлючеваяСсылка);
НЗСчетчик.Прочитать();
Если НЗСчетчик.Количество() = 0 Тогда
НовыйСчетчик = НЗСчетчик.Добавить();
НовыйСчетчик.ИмяСобытия = ИмяСобытия;
НовыйСчетчик.КлючеваяСсылка = КлючеваяСсылка;
НовыйСчетчик.Счетчик = 1;
ИначеЕсли НЗСчетчик.Количество() = 1 Тогда
НовыйСчетчик = НЗСчетчик[0];
НовыйСчетчик.Счетчик = НовыйСчетчик.Счетчик+1;
КонецЕсли;
НЗСчетчик.Записать();
КонецПроцедуры
Функция ПолучитьСчетчик(ИмяСобытия,КлючеваяСсылка)ЭКСПОРТ
УстановитьПривилегированныйРежим(Истина);
НЗСчетчик= РегистрыСведений.мо_СчетчикСобытий.СоздатьНаборЗаписей();
НЗСчетчик.Отбор.ИмяСобытия.Установить(ИмяСобытия);
НЗСчетчик.Отбор.КлючеваяСсылка.Установить(КлючеваяСсылка);
НЗСчетчик.Прочитать();
Если НЗСчетчик.Количество() = 0 Тогда
Возврат 0;
КонецЕсли;
Возврат НЗСчетчик[0].Счетчик;
КонецФункции
Подключение расширения:
Подключение осуществляется обычным способом:
Расширением гарантированно работает на платформе 8.3 (тестировано на релизах 8.3.13.1644,8.3.18.1334) 1С:Комплексная автоматизация 2 (2.5.7.298) , 1С:ERP Управление предприятием 2 (2.4.7.107) и Управление торговлей, редакция 11 (11.4.6.188) И Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.11.106) Режим совместимости Версия 8.3.12 и выше. БСП >3.*
Другие разработки автора:
Акция! Вы можете скачать архив всех моих разработок, которые я предлагаю за StartMone, по Специальной цене: //infostart.ru/public/960899/#archive
Молочников Олег Spb. 2024
Проверено на следующих конфигурациях и релизах:
- 1С:Комплексная автоматизация 2, релизы 2.5.7.298