Перейти к основному содержимому

Пример создания и регистрации событий журнала событий

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

Создадим в проекте три события:

  • ОперацияИмпортДанных — с помощью данного события будем регистрировать начало и завершение операции импорта;
  • ОшибкаИмпорта — с помощью данного события будем регистрировать ошибки, которые могу произойти в процессе импорта;
  • ОтладкаИмпорта — с помощью данного события будем регистрировать факт успешного завершения импорта, а также записывать дополнительную информацию об измененных объектах, задании импорта и времени выполнения операции.

Создайте в проекте подсистему ИмпортДанных. Добавьте в нее три элемента проекта вида Событие Журнала Событий. Описание элементов проекта может выглядеть следующим образом:

ОперацияИмпортДанных

ВидЭлемента: СобытиеЖурналаСобытий
Ид: a565661f-7777-465b-8f71-1f90cd490890
Имя: ОперацияИмпортДанных
ОбластьВидимости: ВПодсистеме
Описание: Операция импорт отмечается событиями с началом и концом операции.
В событии конца операции при условии успешного завершения выводится
информация об измененных объектах, задании импорта и времени выполнения операции.
Важность: Низкая
ВидСобытия: Операция
ШаблонПредставленияНачала: Начало операции импорта %{Задание}
ШаблонПредставленияКонца: Операция импорта %{Задание} завершена успешно.
Добавлено %{Добавлено}, пропущено %{Пропущено} объектов.
Общее время %{Длительность}.
ШаблонПредставленияОшибки: Операция импорта %{Задание} завершена с ошибкой.
Общее время %{Длительность}.
Свойства:
-
Ид: a565661f-f458-465b-8f71-1f90cd396890
Имя: Добавлено
Тип: Число
ЗначениеПоУмолчанию: 0
-
Ид: a568521f-f458-465b-8f71-1f90cd490890
Имя: Пропущено
Тип: Число
ЗначениеПоУмолчанию: 0
-
Ид: a710661f-f458-465b-8f71-1f90cd490890
Имя: Задание
Тип: Строка
Обязательное: Истина

ОшибкаИмпорта

ВидЭлемента: СобытиеЖурналаСобытий
Ид: a568521f-f458-465b-8f31-1f90cd490890
Имя: ОшибкаИмпорта
ОбластьВидимости: ВПодсистеме
Описание: Событие регистрируется при любой ошибке импорта файла данных независимо от транзакции.
Содержит информацию о задании импорта и блоке данных, на котором произошел сбой.
ВидСобытия: Ошибка
ХарактерОшибки: ДляПоддержки
ШаблонПредставления: Задание %{Задание} завершилось с ошибкой на этапе
обработки объекта %{ОписаниеОбъекта}: %{ОтладочнаяИнформация}.
Свойства:
-
Ид: a568521f-f458-460b-8f31-1f90cd490890
Имя: Задание
Тип: Строка
Обязательное: Истина
-
Ид: a568581f-f458-465b-8f31-1f90cd490890
Имя: ОписаниеОбъекта
Тип: Строка
Обязательное: Истина
-
Ид: a568521f-f458-225b-8f31-1f90cd490890
Имя: ОтладочнаяИнформация
Тип: Строка

ОтладкаИмпорта

ВидЭлемента: СобытиеЖурналаСобытий
Id: a565661f-7237-465b-8f71-1f90cd490890
ВидСобытия: Информация
Имя: ОтладкаИмпорта
Важность: Низкая
Описание: Событие регистрируется в момент успешного окончания импорта файла данных
после подтверждения транзакции. Содержит информацию об измененных объектах,
задании импорта и времени выполнения операции.
ШаблонПредставления: Задание импорта %{Задание} успешно завершено. Объект %{ОписаниеОбъекта}
Свойства:
-
Id: a565661f-7877-465b-8f71-1f90cd490890
Имя: Задание
Тип: Строка
Обязательное: Истина
-
Id: a565661f-7777-884b-8f71-1f90cd490890
Имя: ОписаниеОбъекта
Тип: Строка
Обязательное: Истина

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

Затем добавьте в проект элемент ОбщийМодуль и назовите его ИмпортДанных. В нем вы запишите основную логику импорта данных, а также осуществите регистрацию событий в нужный момент.

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

конст КЛЮЧ_ЗАДАНИЯ: Строка = "Импорт данных"
конст ПУТЬ_К_ФАЙЛАМ_ДЛЯ_ИМПОРТА = "Путь к файлам"

@ВПроекте
метод ЗапланироватьЗадание()
знч Задание = ЗапланированныеЗадания.Создать(&ИмпортДанных.ВыполнитьИмпорт)
Задание.Настроить(Ключ = КЛЮЧ_ЗАДАНИЯ,
ХранениеРезультатов = СтратегияХраненияРезультатовЗаданий.Последний(),
ПовторыПриУспехе = СтратегияПовтораЗадания.Интервал(),
ПовторыПриОшибке = СтратегияПовтораЗадания.Интервал(),
СтратегияПубликации = СтратегияПубликацииЗадания.Перезапустить)
Задание.Запланировать()
;

метод ВыполнитьИмпорт()
пер Файл = новый Файл(ПУТЬ_К_ФАЙЛАМ_ДЛЯ_ИМПОРТА)
если Файл.Существует()
ИмпортДанных(КЛЮЧ_ЗАДАНИЯ, Файл)
Файлы.Удалить(Файл)
;
;

Затем следует написать основной код, отвечающий за импорт данных. В этом модуле вы будете регистрировать описанные ранее события:

@НаСервере
метод ИмпортДанных(КлючЗадания: Строка, Данные: Файл)
// КлючЗадания - ключ запланированного задания
// Данные - импортируемый файл
исп Контекст = новый ОперацияИмпортДанных(Задание = КлючЗадания).ЗаписатьНачало()
// Здесь регистрируется событие начала операции импорта
// Свойства события:
// Задание = КлючЗадания (из конструктора)
// Важность = Низкая (из описания события)
// Добавлено = 0 (из описания события)
// Пропущено = 0 (из описания события)
// ВидСобытия = НачалоОперации
// Ид = случайное значение
// Момент = момент записи события

исп ПотокДанных = Данные.ОткрытьПотокЧтения()
пер Читатель = новый ЧтениеДанных(ПотокДанных)

пока (не Читатель.ЧтениеЗавершено())
пер Элемент = Читатель.ПрочитатьСтроку()
попытка
ВыполнитьИмпортДанных(Элемент, Контекст)
Контекст.Добавлено += 1
новый ОтладкаИмпорта(Задание=КлючЗадания, ОписаниеОбъекта = Элемент).Записать()
// Здесь регистрируется событие ОтладкаИмпорта, в свойства которого
// будет записана информация для отладки
// Свойства события:
// Задание = КлючЗадания (из конструктора)
// ОписаниеОбъекта = Элемент (текущий импортируемый элемент)
// Важность = Низкая (из описания события)
// ВидСобытия = Информация
// Ид = случайное значение
// Момент = момент записи события

поймать И: Исключение
пер Важность = ВажностьСобытияЖурналаСобытий.Высокая
если И это ИсключениеЧтенияJson
Важность = ВажностьСобытияЖурналаСобытий.Обычная
;

новый ОшибкаИмпорта(Важность = Важность, Задание = КлючЗадания,
ОписаниеОбъекта = Элемент, ОтладочнаяИнформация = И.ПоследовательностьВызовов).Записать()
// Здесь регистрируется событие ошибки
// Свойства события:
// Задание = КлючЗадания (из конструктора)
// Важность = В зависимости от типа исключения
// ОписаниеОбъекта = Элемент
// ОтладочнаяИнформация = Последовательность вызовов до места выбрасывания исключения
// ВидСобытия = Ошибка
// Ид = случайное значение
// Момент = момент записи

Контекст.Пропущено += 1
;
;

// Событие завершения операции ОперацияИмпортДанных записывается при выходе из метода
// Свойства события ОперацияИмпортДанных на момент завершения операции:
// Задание = КлючЗадания (из конструктора)
// Важность = Низкая (из описания события)
// Добавлено = подсчитанное значение
// Пропущено = подсчитанное значение
// ВидСобытия = КонецОперации
// Ид = случайное значение
// Момент = момент записи

метод ВыполнитьИмпортДанных(Элемент: Строка, Контекст: ОперацияИмпортДанных.КонтекстОперации)
// Здесь осуществляется импорт данных
;

Для того чтобы найти события типа ОтладкаИмпорта для дальнейшей работы с ними, вы можете написать следующий код:

@НаСервере
метод ПоискСобытийОтладки(): Массив<ОтладкаИмпорта>
пер НайденныеСобытия = новый Массив<ОтладкаИмпорта>()
исп Результат = ЖурналСобытий.Найти(ТипыСобытий = {Тип<ОтладкаИмпорта>})
пока (Результат.Следующий())
НайденныеСобытия.Добавить(Результат.Событие как ОтладкаИмпорта)
;
возврат НайденныеСобытия
;

Для того чтобы запустить запланированные события, следует прописать в модуле проекта следующий код:

импорт Журнал

@НастройкаПриложения(Ид="ЗапускИмпортаДанных", Номер=1)
метод ПланированиеЗаданияИмпортаДанных()
ИмпортДанных.ЗапланироватьЗадание()
;

Таким образом, при первой публикации проекта будет вызван метод ПланированиеЗаданияИмпортаДанных(), который в свою очередь вызовет метод ЗапланироватьЗадание() из модуля ИмпортДанных.

В данном примере:

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

После того как вы опубликуете приложение, запланированным заданием будет запущен импорт данных. Чтобы увидеть зарегистрированные события, перейдите в журнал событий. Для этого:

  • Откройте вкладку Приложения в панели управления.

  • Кликните на нужное приложение. Откроется панель управления приложения.

  • В правом верхнем углу кликните на символ , после чего в контекстом меню выберите Посмотреть журнал событий. У вас откроется журнал приложения.

    Здесь вы увидите все зарегистрированные события журнала событий, в том числе те, которые вы описали в проекте:

  • Кликните на событие, чтобы увидеть его описание:

  • Кликните на иконку вопроса в правом верхнем углу, чтобы получить информацию о событии: