Запись в журнал регистрации изменений дополнительных сведений


Небольшая доработка программы «Управление торговлей 11» для записи информации в журнал регистрации изменений дополнительных сведений (регистр сведений) по объектам. Должна работать на всех релизах.

Периодически от пользователей появлялись вопросы типа: «как найти, кто поставил галочку в документе»? Версионирование объектов включено, есть журнал регистрации, да вот незадача — галочка эта находится не в реквизитах документа, а в Дополнительных свойствах, привязанных к этому документу. В журнале регистрации запись такая, конечно же фиксируется, но информации по ней — практически ноль, только то, что Метаданные = РегистрСведений.ДополнительныеСведения, а хотелось бы видеть сам объект, свойство и новое значение. Причем по объекту желательно сделать возможность поиска (=отбора).

Повозившись немного, реализовал-таки этот механизм, получилось по-моему довольно удобно. Чтобы другим не изобретать велосипед, поделюсь своим решением.
Итак, во-первых, создаем Подписку на событие «ПередЗаписью» источника «РегистрСведенийНаборЗаписей.ДополнительныеСведения»:
______________________________________________________________________________________________________________________
____________________________________________________________________________________________
указываем место расположение обработчика, код обработчика со вспомогательной процедурой следующий:
_____________________________________________________________________________________________
Процедура ПриЗаписиДополнительныхСведенийПередЗаписью(Источник, Отказ, Замещение) Экспорт

Объект = Источник.Отбор.Объект.Значение;

НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Объект);
НаборЗаписей.Прочитать();

СтарыеЗначения = НаборЗаписей.Выгрузить();
МассивОбработанныхСвойств = Новый Массив;

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

Если СделатьЗапись Тогда
СделатьЗаписьЖурналаРегистрацииОбИзмененииДопСведения(Объект, Запись.Свойство, Запись.Значение);
КонецЕсли;
МассивОбработанныхСвойств.Добавить(Запись.Свойство);
КонецЦикла;

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

КонецПроцедуры

Процедура СделатьЗаписьЖурналаРегистрацииОбИзмененииДопСведения(Объект, Свойство, Значение)

ЗаписьЖурналаРегистрации("Данные.Изменение",
УровеньЖурналаРегистрации.Информация,
Метаданные.РегистрыСведений.ДополнительныеСведения,
Объект,
"У свойства: """ + Свойство + """ установлено новое значение: """ + Значение + """");

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

3 Comments

  1. necropunk

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

    Reply
  2. Mortiferus

    (1) Согласен, с журналом бывает такое… В данном случае хотелось по-быстрому, не создавая лишних регистров.

    Reply
  3. v.l.

    (1) Это решено на платформе начиная с релиза 8.3.5. Там ЖР представлен в базе SQLite.

    Reply

Leave a Comment

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