Рассылка событий журнала регистрации

Отправка событий журнала регистрации на почту с возможностью группировки и фильтрации.

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

События фильтруются по принципу: (Условие1 ИЛИ Условие2 ИЛИ ….) И НЕ (Условие3 ИЛИ Условие4 ИЛИ …).

Возможно создание нескольких настроек и расписания обработки для каждой по отдельности.

Во вложении файл конфигурации с подсистемой. Конфигурация писалась на платформе версии 8.3.6..

Кому не хочется скачивать файл, кратко опишу реализацию и приведу основную процедуру, в которой выполняется сбор и рассылка данных.

Основные объекты подсистемы:
1. Справочник Настройки оповещения
2. Регистр сведений ДатаПоследнегоОповещения
3. Регламентное задание ОтправкаОповещений

В справочнике "НастройкиОповещения" задаются Получатель оповещения и фильтр событий. В списке "Фильтр событий" вводятся строки — фрагмент сообщения об ошибке. В этом же списке отдельные события можно "Исключить".

Регистр сведений ДатаПоследнегоОповещения содержит дату и время последней обработки в разрезе НастройкиОповещения.

Регламентное задание ОтправкаОповещений запускается по своему расписанию для каждой НастройкиОповещения.

В текущей реализации анализ журнала регистрации выполняется только по "Ошибкам". При желании, список событий можно расширить.

Текст процедуры ниже.

Процедура ELN_ОтправкаОповещений(НастройкаОповещения) Экспорт

Запрос = Новый Запрос;
Запрос.Текст = Новый Запрос;
Запрос.УстановитьПараметр("НастройкаОповещения", НастройкаОповещения);
Запрос.Текст =
"ВЫБРАТЬ
| ELN_НастройкиОповещения.АдресЭП,
| ELN_НастройкиОповещения.АдресЭПКопия,
| ELN_НастройкиОповещения.УчетнаяЗаписьЭлектроннойПочты,
| ELN_НастройкиОповещения.ФильтрСообщений.(
|  Ссылка,
|  НомерСтроки,
|  Текст,
|  Исключить
| ),
| ЕСТЬNULL(ELN_ДатаПоследнегоОповещения.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПоследнегоОповещения
|ИЗ
| Справочник.ELN_НастройкиОповещения КАК ELN_НастройкиОповещения
|  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ELN_ДатаПоследнегоОповещения КАК ELN_ДатаПоследнегоОповещения
|  ПО (ELN_ДатаПоследнегоОповещения.НастройкаОповещения = ELN_НастройкиОповещения.Ссылка)
|ГДЕ
| ELN_НастройкиОповещения.Ссылка = &НастройкаОповещения
| И ELN_НастройкиОповещения.Активная";

Выборка = Запрос.Выполнить().Выбрать();
Если НЕ Выборка.Следующий() Тогда
Возврат;
КонецЕсли;

Отбор = Новый Структура;

ДатаНачала = Выборка.ДатаПоследнегоОповещения;
ДатаОкончания = ТекущаяДата();
Если ДатаНачала = '00010101' Тогда
ДатаНачала = НачалоДня(ТекущаяДата()); // первый раз с начала дня
КонецЕсли;
Отбор.Вставить("ДатаНачала", ДатаНачала);
Отбор.Вставить("ДатаОкончания", ДатаОкончания);

Уровень = Новый Массив;
Уровень.Добавить(УровеньЖурналаРегистрации.Ошибка);
Отбор.Вставить("Уровень", Уровень);

тзДанныеЖР = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(тзДанныеЖР,Отбор,,,);

тзВрем = Новый ТаблицаЗначений;
тзВрем.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
тзВрем.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(1000),));

Для Каждого СтрокаЖР из тзДанныеЖР Цикл
НоваяСтрока = тзВрем.Добавить();
НоваяСтрока.Дата = СтрокаЖР.Дата;
Если ПустаяСтрока(СтрокаЖР.Комментарий) Тогда
НоваяСтрока.Комментарий = "" + СтрокаЖР.Данные;
Иначе
НоваяСтрока.Комментарий = СтрокаЖР.Комментарий;
КонецЕсли;
КонецЦикла;
тзДанныеЖР = Неопределено;

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("тзДанныеЖР", тзВрем);
Запрос.Текст =
"ВЫБРАТЬ
| тзДанныеЖР.Дата,
| тзДанныеЖР.Комментарий
|ПОМЕСТИТЬ втДанныеЖР
|ИЗ
| &тзДанныеЖР КАК тзДанныеЖР
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втДанныеЖР.Дата КАК Дата,
| втДанныеЖР.Комментарий,
| ПОДСТРОКА(втДанныеЖР.Комментарий, 1, 300) КАК Комментарий0
|ИЗ
| втДанныеЖР КАК втДанныеЖР
|ГДЕ
| втДанныеЖР.Комментарий ПОДОБНО &Комментарий
|ИТОГИ
| КОЛИЧЕСТВО(Дата)
|ПО
| Комментарий0";

ФильтрСообщений = Выборка.ФильтрСообщений.Выбрать();
Если ФильтрСообщений.Количество() = 0 Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"втДанныеЖР.Комментарий ПОДОБНО &Комментарий", "ИСТИНА");
Иначе
ТекстУсловия = "";
ТекстУсловияНЕ = "";
Пока ФильтрСообщений.Следующий() Цикл
Если НЕ ФильтрСообщений.Исключить Тогда
ТекстУсловия = ТекстУсловия + ?(ПустаяСтрока(ТекстУсловия),"", Символы.ПС + "ИЛИ ");
ТекстУсловия = ТекстУсловия + "втДанныеЖР.Комментарий ПОДОБНО " + """%" + ФильтрСообщений.Текст + "%""";
Иначе
ТекстУсловияНЕ = ТекстУсловияНЕ + ?(ПустаяСтрока(ТекстУсловияНЕ),"", Символы.ПС + "ИЛИ ");
ТекстУсловияНЕ = ТекстУсловияНЕ + "втДанныеЖР.Комментарий ПОДОБНО " + """%" + ФильтрСообщений.Текст + "%""";
КонецЕсли;
КонецЦикла;

Если ПустаяСтрока(ТекстУсловия) Тогда
ТекстУсловия = "НЕ " + "(" + ТекстУсловияНЕ + ")";
ИначеЕсли НЕ ПустаяСтрока(ТекстУсловияНЕ) Тогда
ТекстУсловия = "(" + ТекстУсловия + ")"+ " И НЕ " + "(" + ТекстУсловияНЕ + ")";
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст,"втДанныеЖР.Комментарий ПОДОБНО &Комментарий", ТекстУсловия);
КонецЕсли;

ТекстОповещения = "";
КоличествоОшибокВсего = 0;

ВыборкаОшибки = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаОшибки.Следующий() Цикл

ТекстОповещения = ТекстОповещения + ?(ПустаяСтрока(ТекстОповещения), "", Символы.ПС + Символы.ПС + Символы.ПС);
ТекстОповещения = ТекстОповещения + "Текст ошибки:" + Символы.ПС;

ВывестиОшибку = Истина;
КоличествоОшибок = ВыборкаОшибки.Дата;
КоличествоОшибокВсего = КоличествоОшибокВсего + КоличествоОшибок;

ВыборкаДетальные = ВыборкаОшибки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаДетальные.Следующий() Цикл

Если ВывестиОшибку Тогда
ТекстОповещения = ТекстОповещения + ВыборкаДетальные.Комментарий;
ТекстОповещения = ТекстОповещения + Символы.ПС + Символы.ПС + "Количество ошибок: " + КоличествоОшибок;

ВывестиОшибку = Ложь;
КонецЕсли;

КонецЦикла;

КонецЦикла;

Если НЕ ПустаяСтрока(ТекстОповещения) Тогда

ПочтовыйПрофиль = ПолучитьПрофильИнтернетПочтовоеПодключения(Выборка.УчетнаяЗаписьЭлектроннойПочты);

ТемаПисьма = "Оповещение об ошибках в ЖР за период "
+ Формат(ДатаНачала,"ДФ='dd.MM.yyyy hh:mm:ss'")
+ " по "
+ Формат(ДатаОкончания,"ДФ='dd.MM.yyyy hh:mm:ss'")
+ ". Ошибок: "
+ КоличествоОшибокВсего;

Получатель = Выборка.АдресЭП;
Копии = Выборка.АдресЭПКопия;

Если НЕ ОтправитьЭлектронноеПисьмо(ПочтовыйПрофиль, "" + Выборка.УчетнаяЗаписьЭлектроннойПочты, ТемаПисьма,ТекстОповещения,Получатель,Копии,) Тогда
ДатаОкончания = '00010101'; // последнюю дату менять не будем
КонецЕсли;

КонецЕсли;

Если ЗначениеЗаполнено(ДатаОкончания) Тогда

НаборЗаписей = РегистрыСведений.ELN_ДатаПоследнегоОповещения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.НастройкаОповещения.Установить(НастройкаОповещения);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.НастройкаОповещения = НастройкаОповещения;
НоваяЗапись.Дата = ДатаОкончания;
НаборЗаписей.Записать();

КонецЕсли;

КонецПроцедуры

 

Спасибо за внимание.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *