124 документа
← К списку

Глава 22. Журнал регистрации

страница

Глава 22. Журнал регистрации

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

Для этих целей предназначен журнал регистрации. В этом журнале могут фиксироваться различные события. С его помощью администратор может получить историю работы пользователей с системой.

Журнал регистрации не хранится в базе данных и не сохраняется при операциях загрузки/выгрузки информационной базы.

При работе пользователей система «1С:Предприятие» фиксирует в журнале основные действия, выполняемые пользователем по модификации данных информационной базы, доступу и отказу доступа к данным, выполнению регламентных операций, подключению и отключению от системы и т. д.

Кроме средств интерактивной работы с журналом, которые предоставляются в конфигураторе, доступна также и программная работа с журналом.

В данной главе описываются средства программной работы с журналом регистрации.

22.1. Управление детализацией

Имеется возможность управления уровнем детализации сообщений, которые попадают в журнал регистрации. Для этого существуют методы ПолучитьИспользованиеЖурналаРегистрации() и УстановитьИспользованиеЖурналаРегистрации().

Копировать в буфер обмена

// установим регистрацию всех событий журнала Уровни = Новый Массив; Уровни.Добавить(УровеньЖурналаРегистрации.Ошибка); Уровни.Добавить(УровеньЖурналаРегистрации.Информация); Уровни.Добавить(УровеньЖурналаРегистрации.Предупреждение); Уровни.Добавить(УровеньЖурналаРегистрации.Примечание); УстановитьИспользованиеЖурналаРегистрации(Уровни);

22.2. Запись событий

При выполнении различных операций возникает необходимость фиксировать выполняемые действия для последующего анализа. Для такой фиксации можно использовать журнал регистрации. Запись событий в него осуществляется с помощью метода глобального контекста ЗаписьЖурналаРегистрации().

Примечание. С помощью данного метода невозможно записать в журнал регистрации системные события.

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

22.3. Управление регистрацией событий

Регистрацию любого события журнала регистрации можно включить или выключить. Для этого служат методы глобального контекста ПолучитьИспользованиеСобытияЖурналаРегистрации() и УстановитьИспользованиеСобытияЖурналаРегистрации() и объект ИспользованиеСобытияЖурналаРегистрации. Следующий пример показывает, как можно выключить регистрацию события Ошибка выполнения (_$PerformError$_):

Копировать в буфер обмена

ИспользованиеСобытия = Новый ИспользованиеСобытияЖурналаРегистрации(); ИспользованиеСобытия.Использование = Ложь; УстановитьИспользованиеСобытияЖурналаРегистрации("$PerformError$", ИспользованиеСобытия);

Следует отметить, что существует два события, настройка регистрации которых имеет дополнительные возможности. Это события Доступ (_$Access$_.Access) и Отказ в доступе (_$Access$_.AccessDenied). Работа с этими событиями будет описана более подробно.

Примечание. События, связанные с транзакциями (_$Transaction$_.Begin, _$Transaction$_.Commit, _$Transaction$_.Rollback), не могут быть отключены с помощью метода УстановитьИспользованиеСобытияЖурналаРегистрации().

22.3.1. Настройка параметров события «Доступ»

Событие Доступ предназначено для регистрации фактов доступа пользователей системы к тем или иным данным. Для настройки регистрации события Доступ следует задать:

● необходимость регистрации события;

● перечень объектов метаданных, доступ к которым необходимо регистрировать;

● перечень полей объекта метаданных, чтение которых следует регистрировать (поля доступа);

● перечень полей объекта метаданных, значения которых необходимо зарегистрировать (поля регистрации).

Общая схема работы при этом выглядит следующим образом (при условии, что событие регистрируется). Если в процессе работы с данными (выбранного объекта метаданных) произошло чтение одного из заданных полей доступа, происходит фиксация в журнале регистрации полей регистрации по заданным правилам. При этом фиксация факта доступа происходит при любом доступе к данным, совершенным из сеанса пользователя, включая доступ из кода на встроенном языке, совершенного на стороне сервера «1С:Предприятия».

Объем данных, которые будут записаны в журнал регистрации, зависит от того, как настроена регистрация события:

Использование

Поля доступа

Поля
регистрации

Результат

Не задано

Событие не регистрируется

Задано

Не заданы

Не заданы

Событие не регистрируется

Задано

Заданы

Не заданы

Событие регистрируется без детализации

Задано

Заданы

Заданы

Событие регистрируется с указанием полей регистрации

Событие формируется только в случае успешного чтения данных.

Рассмотрим настройки параметров на конкретном примере:

Копировать в буфер обмена

НастройкаСправочника = Новый ОписаниеИспользованияСобытияДоступЖурналаРегистрации(); // Укажем объект, доступ к которому будет регистрироваться НастройкаСправочника.Объект = "Справочник.ФизическиеЛица"; // Укажем поля доступа НастройкаСправочника.ПоляДоступа.Добавить("ПаспортныеДанные"); НастройкаСправочника.ПоляДоступа.Добавить("Дети.СвидетельствоОРождении"); // Укажем поля регистрации НастройкаСправочника.ПоляРегистрации.Добавить("ПаспортныеДанные"); НастройкаСправочника.ПоляРегистрации.Добавить("Дети.ИмяРебенка"); АльтернативыПолей = Новый Массив(); АльтернативыПолей.Добавить("Фамилия"); АльтернативыПолей.Добавить("Имя"); НастройкаСправочника.ПоляРегистрации.Добавить(АльтернативыПолей); НастройкаОбъектовМетаданных = Новый Массив(); НастройкаОбъектовМетаданных.Добавить(НастройкаСправочника);

В данном примере будет выполняться регистрация доступа к элементам справочника ФизическиеЛица.

При этом события журнала регистрации будут формироваться в том случае, если в запросе к данным справочника ФизическиеЛица будут участвовать:

● поле ПаспортныеДанные;

● поле СвидетельствоОРождении табличной части Дети.

Если в запросе к данным описанные поля не присутствуют, событие доступа к данным не будет записано в журнал регистрации.

После того как система определит доступ к контролируемым полям, в журнал регистрации будут записаны данные о следующих полях справочника ФизическиеЛица:

● Поле ПаспортныеДанные.

● Поле ИмяРебенка из табличной части Дети.

● Какое-либо из полей Фамилия или Имя. Какое из полей будет записано в журнал регистрации, определяется наличием этих данных в запросе к данным. Причем если используются все перечисленные поля, то в журнал регистрации попадет поле, заданное с меньшим индексом (в примере – Фамилия). Если из указанной пары в запросе используется какое-либо одно поле, в журнал регистрации попадет именно оно.

Рассмотрим еще один пример настройки события Доступ:

Копировать в буфер обмена

НастройкаРегистраСведений = Новый ОписаниеИспользованияСобытияДоступЖурналаРегистрации(); // Укажем объект, доступ к которому будет регистрироваться НастройкаРегистраСведений.Объект = "РегистрСведений.ОкладыСотрудников"; // Укажем поля доступа НастройкаРегистраСведений.ПоляДоступа.Добавить("Оклад"); // Укажем поля регистрации НастройкаРегистраСведений.ПоляРегистрации.Добавить("Сотрудник"); НастройкаОбъектовМетаданных.Добавить(НастройкаРегистраСведений);

В данном примере при обращении к полю РегистрСведений.ОкладыСотрудников.Оклад будет происходить регистрация события Доступ со следующим составом поля Данные.Данные:

● если в результате запроса будет поле РегистрСведений.ОкладыСотрудников.Сотрудник (и поле Ссылка задано в настройке полей регистрации справочника ФизическиеЛица, на который ссылается поле Сотрудник), то в событие журнала регистрации будет записано:

● в поле Данные будет записана таблица значений, содержащая колонку СправочникФизическиеЛицаСсылка, в которой будут значения ссылок на объекты справочника ФизическиеЛица;

● в поле Метаданные будет записан массив, содержащий строку РегистрСведений.ОкладыСотрудников, т. е. имя объекта, который послужил поводом регистрации события доступа;

● в поле ПредставлениеМетаданных будет записан массив, содержащий строку РегистрСведений. Оклады сотрудников – представление объекта метаданных;

● если поле Ссылка не участвует в полях регистрации справочника ФизическиеЛица, то она не будет зафиксирована в запросе к регистру сведений;

● если в запросе будет использовано получение данных по ссылке типа Справочник.ФизическиеЛица, хранящейся в регистре сведений, то регистрация будет применяться к полям, которые получены через ссылку, хранящуюся в поле регистра Сотрудник:

● Имя, Фамилия и ПаспортныеДанные (все – полученные через ссылку, хранящуюся в поле регистра Сотрудник), то в журнал регистрации попадут поля ПаспортныеДанные и Фамилия (описание регистрации для справочника Сотрудники можно посмотреть в предыдущем примере).

22.3.2. Настройка параметров события «Отказ в доступе»

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

● необходимость регистрации события;

● перечень объектов метаданных, для которых необходимо регистрировать поля регистрации при отказе в доступе (для остальных объектов отказы в доступе будут регистрироваться без детализации);

● перечень полей объекта метаданных, значения которых необходимо зарегистрировать (поля регистрации) при отказе в доступе.

Общая схема работы при этом выглядит следующим образом (при условии, что событие регистрируется). Если в процессе работы с данными (выбранного объекта метаданных) произошел отказ в доступе, происходит фиксация в журнале регистрации полей регистрации по заданным правилам.

Объем данных, которые будут записаны в журнал регистрации, зависит от того, как настроена регистрация события:

Использование

Поля
регистрации

Результат

Не задано

Событие не регистрируется

Задано

Не заданы

Событие регистрируется без детализации (поле Данные не заполнено)

Задано

Заданы

Событие регистрируется с указанием полей регистрации в поле Данные

Событие формируется в следующих случаях:

● при проверке доступа к объекту данных целиком:

● в случае нарушения прав при обращении к методам и свойствам прикладного объекта из встроенного языка или из стандартных интерфейсных функций (форм, команд);

● в случае отказов в доступе при проверке прав на конфигурацию;

● при возникновении события в поле Данные записи журнала будет помещена структура со свойством Право, содержащим действие, в выполнении которого было отказано;

● при проверке ограничений доступа к данным:

● в случае нарушения условий ограничения доступа к данным;

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

● Действие – указано действие, при попытке выполнения которого произошел отказ в доступе;

● Данные – содержит информацию о полях регистрации (если настроено).

Примечание. При считывании данных во временную таблицу поле Данные.Данные события журнала регистрации не заполняется.

Рассмотрим настройки параметров на конкретном примере:

Копировать в буфер обмена

НастройкаСправочника = Новый ОписаниеИспользованияСобытияОтказВДоступеЖурналаРегистрации(); // Укажем объект, доступ к которому будет регистрироваться НастройкаСправочника.Объект = "Справочник.ФизическиеЛица"; // Укажем поля регистрации НастройкаСправочника.ПоляРегистрации.Добавить("ПаспортныеДанные"); НастройкаСправочника.ПоляРегистрации.Добавить("Дети.ИмяРебенка"); АльтернативыПолей = Новый Массив(); АльтернативыПолей.Добавить("Фамилия"); АльтернативыПолей.Добавить("Имя"); НастройкаСправочника.ПоляРегистрации.Добавить(АльтернативыПолей);

При нарушении доступа к данным в операции Чтение будет происходить регистрация события Отказ в доступе и выполняться запись поля регистрации по правилам, описанным для полей регистрации события Доступ. Для других действий (Изменение, Удаление, Добавление) событие регистрируется, но запись данных не происходит.

22.4. Получение записей журнала регистрации

В процессе эксплуатации прикладного решения могут возникать ситуации, которые требуют программного анализа журнала регистрации, в том числе и получение событий журнала регистрации по некоторым критериям (отбору). Для программного получения записей журнала регистрации необходимо воспользоваться методом глобального контекста ВыгрузитьЖурналРегистрации(). Программно получать можно как записи журнала регистрации информационной базы, где выполняется код на встроенном языке, так и другой информационной базы (даже если с этой базой работают другие экземпляры «1С:Предприятия»), если у метода ВыгрузитьЖурналРегистрации() указан параметр ИмяВходногоФайла. Следует помнить, что такое чтение рекомендуется выполнять только в том случае, если файлы журнала регистрации другой информационной базы доступны локально для экземпляра «1С:Предприятия», выполняющего чтение журнала. Если такого доступа нет, то необходимо разрабатывать другие способы получения журнала регистрации.

Для задания условий отбора выборки необходимо воспользоваться параметром Фильтр метода ВыгрузитьЖурналРегистрации(). Данный параметр может содержать либо одиночное значение отбора, заданное с помощью объекта Структура особого формата (формат структуры подробно описан в синтакс-помощнике: Глобальный контекст – Процедуры и функции работы с журналом регистрации – ВыгрузитьЖурналРегистрации), либо массив таких структур.

При этом если отбор задан одним элементом типа Структура, то в результирующую выборку попадут все записи, которые удовлетворяют всем условиям, заданным в структуре (условие сочетаются «по И»). Если отбор задан массивом, то в результирующую выборку попадут записи, которые удовлетворяют хотя бы одному условию, перечисленному в элементах массива (условия сочетаются «по ИЛИ»).

Обратим особое внимание на возможность задания отбора по полю Данные записи журнала регистрации. В качестве отбора по этому полю могут выступать значения типа Строка, Число, Дата, Ссылка, Структура (для событий Доступ, Отказ в доступе, Аутентификация, Ошибка аутентификации, Добавление пользователя, Изменение пользователя и Удаление пользователя), а также массив структур.

Значением элемента структуры, переданной в параметр Фильтр, может выступать конкретное значение, Структура или Массив. Проверка соответствия данных записи журнала на соответствие параметрам фильтра выполняется следующим образом:

● Если передано конкретное значение, то производится сравнение значений в данных записи и в значении фильтра.

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

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

Рассмотрим это подробнее.

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

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

3. В поле Данные записи журнала регистрации находится значение типа Структура, Массив или ТаблицаЗначений, в поле Данные фильтра указан массив. В этом случае запись будет удовлетворять условию, если в данных записи журнала будет найдено хотя бы одно значение из массива, переданного в качестве значения фильтра.

4. В поле Данные записи журнала регистрации находится какое-либо значение (не структура, не массив и не таблица значений), в поле Данные фильтра указан массив. В этом случае запись будет удовлетворять условию, если значение из записи журнала равно хотя бы одному значению из переданного массива.

5. В поле Данные записи журнала находится элемент со значением типа ТаблицаЗначений, в поле Данные фильтра находится элемент со значением типом Массив, при этом ключи элементов совпадают. В этом случае запись журнала регистрации будет удовлетворять условию, если хотя бы одна ячейка таблицы значений равна хотя бы одному значению из переданного массива.

6. В элементе поля Данные записи журнала находится значение типа Структура, Массив или ТаблицаЗначений, в поле Данные фильтра находится значение типа Структура или Массив. Запись журнала будет удовлетворять условию, если во вложенных данных будет обнаружена запись, удовлетворяющая условию по пунктам 1 и 5. Однако если в фильтре задана структура, то поиск элементов в структуре или колонках таблицы значений записи журнала регистрации, соответствующих элементам этой структуры, будет выполняться только на конкретном уровне вложенности, соответствующем уровню вложенности в фильтре. Таким образом, отдельные значения и значения из массивов в фильтре ищутся на всю глубину, а элементы структуры фильтра только на конкретном уровне.

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

Покажем это на примере. Допустим, прикладное решение содержит запрос, который возвращает таблицу со следующими колонками:

● СправочникСсылка.Товары,

● СправочникСсылка.Товары,

● Строка.

При формировании записи журнала регистрации будет выполнено следующее преобразование:

● Первые две колонки будут объединены в одну.

● Для каждой строки, в которой значения Товары.Ссылка и Номенклатура.Ссылка не равны, будет создана еще одна строка.

● Строки будут отличаться значением объединенной колонки, где будут располагаться значения ссылок. Остальные значения колонок будут одинаковыми.

Исходная таблица

Ссылка

Ссылка

Артикул

Сосиски

Перец

16-АВ-1675

Результирующая таблица

Ссылка

Артикул

Сосиски

16-АВ-1675

Перец

16-АВ-1675

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

Пример 1:

● значение поля Данные записи журнала регистрации для события Аутентификация:

● тип: Структура:

● ключ: ПользовательОС, значение: Ivanov;

● значение поля Данные фильтра метода ВыгрузитьЖурналРегистрации():

● тип: Структура:

● ключ: ПользовательОС, значение: Ivanov;

● результат: запись соответствует.

Пример 2:

● значение поля Данные записи журнала регистрации для события Доступ:

● тип: Структура:

● ключ: Данные, значение: ТаблицаЗначений:

Фамилия

Город

Телефон

Петров

Тула

111-22-33

Иванов

Москва

222-33-44

● значение поля Данные фильтра метода ВыгрузитьЖурналРегистрации():

● тип: Массив:

● элемент 1: тип Структура:

● ключ: ПользовательОС, значение: Ivanov;

● элемент 2: тип Структура:

● ключ: Данные, значение: Структура;

● ключ: Фамилия, значение: Иванов;

● ключ: Город, значение: Москва;

● результат: запись соответствует отбору, т. к. при сравнении элемента 2 массива отбора найдено соответствие с данными записи (строка 2). В записи журнала регистрации есть таблица значений, у которой существуют колонки Имя и Город и оба значения в колонках равны соответствующим значениям в структуре отбора.

Пример 3:

● значение поля Данные записи журнала регистрации для события Добавление пользователя:

● тип: Структура:

● ключ: Роли, значение: Массив:

● значение 1: Роли.Администратор;

● значение 2: Роли.Кладовщик;

● значение 3: Роли.Продавец;

● значение поля Данные фильтра метода ВыгрузитьЖурналРегистрации():

● тип: Структура:

● ключ: Роли, значение: Роли.Кладовщик;

● результат: запись соответствует отбору, т. к. в поле Данные существует элемент Роли, а среди значений элемента есть значение Роли.Кладовщик.

Пример 4:

● значение поля Данные записи журнала регистрации для события Добавление пользователя:

● тип: Структура:

● ключ: Роли, значение: Массив:

● значение 1: Роли.Администратор;

● значение 2: Роли.Кладовщик;

● значение 3: Роли.Продавец;

● значение поля Данные фильтра метода ВыгрузитьЖурналРегистрации():

● тип: Структура:

● ключ: Роли, значение: Массив:

● значение 1: Роли.Менеджер;

● значение 2: Роли.Продавец;

● результат: запись соответствует отбору, т. к. в поле Данные существует элемент Роли, а среди значений элемента есть значение, перечисленное в массиве отбора (значение Роли.Продавец).

Пример 5:

● значение поля Данные записи журнала регистрации для события Доступ:

● тип: Структура:

● ключ: Данные, значение: ТаблицаЗначений:

Фамилия

Город

Петров

Тула

Иванов

Москва

● значение поля Данные фильтра метода ВыгрузитьЖурналРегистрации():

● тип: Массив:

● тип Структура:

● ключ: Данные, значение: Тула;

● результат: запись соответствует отбору, т. к. искомое значение (Тула) найдено в одной из ячеек таблицы значений, находящейся в свойстве Данные поля Данные записи журнала регистрации.

Для поля Метаданные записи журнала регистрации, у которого в событии хранится массив метаданных, запись соответствует отбору, если хотя бы один элемент массива из поля Метаданные отбора равен хотя бы одному элементу массива записи журнала.

22.5. Дополнительные методы

Для облегчения интерактивного формирования отборов журнала регистрации полезно использовать метод ПолучитьЗначенияОтбораЖурналаРегистрации(). С помощью данного метода можно получать доступные значения отборов для следующих параметров отбора: Пользователь, Компьютер, ИмяПриложения, Событие, Метаданные, РабочийСервер, ОсновнойIPПорт, ВспомогательныйIPПорт. Так, при необходимости установить отбор по событию журнала регистрации можно вначале получить список событий, которые реально присутствуют в данном журнале, а затем выбрать из полученного списка.

Для формирования представлений событий журнала регистрации на языке интерфейса платформы служит метод ПредставлениеСобытияЖурналаРегистрации().

В том случае, если необходимо выполнить копирование фрагмента журнала регистрации с определенным фильтром, следует использовать метод СкопироватьЖурналРегистрации(). При необходимости выполнить удаление некоторого набора записей, отвечающих заданному фильтру (включая полную очистку журнала регистрации), следует использовать метод ОчиститьЖурналРегистрации(). Следует помнить, что очистка журнала регистрации поддерживается только для журнала регистрации, который работает в формате .lgd.