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

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

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

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

ОперацияИмпортДанных
ВидЭлемента: СобытиеЖурналаСобытий
Ид: 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
            Имя: ОписаниеОбъекта
            Тип: Строка
            Обязательно: Истина

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

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

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

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

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

метод ВыполнитьИмпорт()
    пер Файл = новый Файл(ПУТЬ_К_ФАЙЛАМ_ДЛЯ_ИМПОРТА)
    если Файл.Существует()
        ИмпортДанных(КЛЮЧ_ЗАДАНИЯ, Файл)
        Файлы.Удалить(Файл)
    ;
;
Затем следует написать основной код, отвечающий за импорт данных. В этом модуле вы будете регистрировать описанные ранее события:
@НаСервере
метод ИмпортДанных(КлючЗадания: Строка, Данные: Файл)
    // КлючЗадания - ключ запланированного задания
    // Данные - импортируемый файл
    исп Контекст = новый ОперацияИмпортДанных(Задание = КлючЗадания).ЗаписатьНачало()
    // Здесь регистрируется событие начала операции импорта
    // Свойства события:
    //    Задание = КлючЗадания (из конструктора)
    //    Важность = Низкая (из описания события)
    //    Добавлено = 0  (из описания события)
    //    Пропущено = 0  (из описания события)
    //    ВидСобытия = НачалоОперации
    //    Ид = случайное значение
    //    Момент = момент записи события

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

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

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

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

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

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

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

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

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

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

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