Логирования объектов ИБ через журнал регистрации

В любой организации чаще всего возникает проблема манипуляции с документами и  справочниками, целью которого чаще становиться покрыть рабочие косяки или по неосторожности. Но последствия таких действии приводят к разным серьезным проблемам от некорректных остатков до разбирательств на суде и в таких случаях обычно стандартные записи журнала регистрации не показывают детальные изменении. Чтобы в данном случае не усердствовать как Шерлок Холмс, предлагаю свой механизм логирования.  Логирование сохраняет все данные объекта и можно легко вытащить для просмотра
 

Процедуру логирования сделал только для справочников и документов:

Процедура СоздатьЛогНажатие()

Мета=Ссылка.Метаданные();

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

КонецЕсли;
КонецЦикла;

Для Каждого ТЧ  Из Мета.ТабличныеЧасти Цикл
Если  Табл.Колонки.Найти(ТЧ.Имя)=Неопределено Тогда
Табл.Колонки.Добавить(ТЧ.Имя);

КонецЕсли;
КонецЦикла;

НоваяСтрока=Табл.Добавить();

Для Каждого Реквизит  Из Мета.Реквизиты Цикл


НоваяСтрока[Реквизит.Имя]= Ссылка[Реквизит.Имя];


КонецЦикла;


Для Каждого ТЧ  Из Мета.ТабличныеЧасти Цикл

НоваяСтрока[ТЧ.Имя]= Ссылка[ТЧ.Имя].Выгрузить();
КонецЦикла;

СтрДанные=ЗначениеВСтрокуВнутр(Табл);

Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
ИмяОб="Справочники."+Мета.Имя+"."+Строка(Ссылка.УникальныйИдентификатор());
Иначе
ИмяОб="Документы."+Мета.Имя+"."+Строка(Ссылка.УникальныйИдентификатор());
КонецЕсли;

//ЗаписьЖурналаРегистрации("Лог изменении",,Мета,СтрДанные);
ЗаписьЖурналаРегистрации("ЗаписьЛогов",УровеньЖурналаРегистрации.Информация,Мета,СтрДанные,ИмяОб);
КонецПроцедуры





Когда нам нужно будет прочитать эти логи нужно использовать:

Процедура ПрочитатьЛог()


Мета=Ссылка.Метаданные(); //Ссылка это конкретный значение по которому надо прочитать лог

Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) Тогда
ИмяОб="Справочники."+Мета.Имя+"."+Строка(Ссылка.УникальныйИдентификатор());
Иначе
ИмяОб="Документы."+Мета.Имя+"."+Строка(Ссылка.УникальныйИдентификатор());
КонецЕсли;

ТЗ=Новый ТаблицаЗначений;


//сперва выгржаем ЖР в таб.значения с фильтром по периодам, по событиям "ЗаписьЛогов"
ВыгрузитьЖурналРегистрации(ТЗ,Новый Структура("ДатаНачала,ДатаОкончания,Пользователь,Событие",НачалоМесяца(НачПериода),КонецМесяца(КонПериода),ПользователиИнформационнойБазы.НайтиПоИмени("administrator"),"ЗаписьЛогов"),"Дата,ИмяПользователя,Компьютер,Данные,Комментарий");

ТаблицаЛогов=ТЗ.Скопировать(Новый Структура("Комментарий",ИмяОб));
для Каждого стрДанные Из ТаблицаЛогов  Цикл

Попытка
ТЗДанных=ЗначениеИзСтрокиВнутр(стрДанные.Данные);
стрДанные.Данные=ТЗДанных;
Исключение
КонецПопытки;

КонецЦикла;

ЭлементыФормы.ТаблицаЛогов.СоздатьКолонки(); //з
КонецПроцедуры



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

ОчиститьЖурналРегистрации(Новый Структура("ДатаНачала,ДатаОкончания,Пользователь,Событие",НачалоМесяца(НачПериода),КонецМесяца(КонПериода),ПользователиИнформационнойБазы.НайтиПоИмени("administrator"),"ЗаписьЛогов"));

 

Если логи надо хранить на продолжительный период и ЖР не увеличивал базу, можно хранить данные в файл или в отдельную базу данных например на mssql или в базе 1с. Но это дело необходимости!

 

Спасибо за внимания!

 

4 Comments

  1. AlX0id

    Сохранять данные объектов в ЖР и

    главное ЖР вовремя очищать

    Что-то как-то противоречат друг другу ) Может проще уж сразу в отдельный текстовый файл феячить эти писульки и не трогать ЖР? Раз уж он вам не нужен — проще отключить вовсе, нежели бодягу с регламентниками устраивать..

    Reply ↓
  2. slazzy

    Чем система версионирования не угодила? Даже если сама как таковая не угодила, почему не сделать по её принципу через сериализацию?

    Reply ↓
  3. AllexSoft

    По поводу версионирования… для тех у кого пухнет регистр ВерсииОбъектов, есть неплохой выход сократить объемы базы..

    можно зайти в регистр, там есть реквизит Комментарий Тип строка 1024. фиксированная.. этот реквизит не используется. Поэтому берем и задаем ему тип Строка,100, переменная. Заходим в конфигуратор — Администрирование — ТИИ — Сжатие базы.. радуемся )

    ПС: удалять дубли версионирования тоже полезно..

    ПС2: по поводу сей поделки автору надо бы посмотреть в сторону сериализации, ибо то что он написал делается 3мя строками кода ..

    Reply ↓
  4. ojiojiowka

    Может автор расскажет чем этот способ лучше типового (есть отчёты и возможность отката)? Может это размер получаемых логов или скорость записи? Что то мне кажется проигрыш будет и там и там, осталось тестами определить во сколько раз.

    Reply ↓

Leave a Comment

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