Попалась на глаза публикация об отправке ошибок из журнала регистрации на почту. Делал в свое время похожее решение, но для удобства сделал возможность создавать отдельные настройки, в соответствии с которыми выполнялась фильтрация событий и их рассылка.
События фильтруются по принципу: (Условие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_ДатаПоследнегоОповещения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.НастройкаОповещения.Установить(НастройкаОповещения);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.НастройкаОповещения = НастройкаОповещения;
НоваяЗапись.Дата = ДатаОкончания;
НаборЗаписей.Записать();
КонецЕсли;
КонецПроцедуры
Спасибо за внимание.