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

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

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

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

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

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

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

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

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

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

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


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


КонецЦикла;


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

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

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

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

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





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

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


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

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

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


//сперва выгржаем ЖР в таб.значения с фильтром по периодам, по событиям "ЗаписьЛогов"
ВыгрузитьЖурналРегистрации(ТЗ,Новый Структура("ДатаНачала,ДатаОкончания,Пользователь,Событие",НачалоМесяца(НачПериода),КонецМесяца(КонПериода),ПользователиИнформационнойБазы.НайтиПоИмени("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 не будет опубликован. Обязательные поля помечены *