В процессе разработки часто возникает задача аудита данных: необходимо понимать, кто, когда и какие изменения внес в независимый РегистрСведений. Учитывая, что данные могут поступать как от пользователей, так и из фоновых заданий или механизмов синхронизации, мы разберем наиболее надежные способы реализации такого функционала.
Одним из классических способов является использование модуля набора записей конкретного регистра. Этот метод позволяет выполнять логику непосредственно в момент записи данных.
РегистрСведений.ПриЗаписи вы можете реализовать запись истории в другой вспомогательный регистр или справочник.Преимущество этого метода заключается в прямом доступе к данным. Вы можете получить ЭтотОбъект, содержащий как записываемые данные, так и отбор. Важно: использование этого метода требует изменения метаданных для каждого регистра, который вы планируете логировать, чтобы обеспечить контроль изменения объектов.
Пример простой реализации в модуле набора записей:
Процедура ПриЗаписи(Отказ, Замещение)
// Получаем текущего пользователя и время
Автор = Пользователи.ТекущийПользователь();
ДатаИзменения = ТекущаяДатаСеанса();
// Здесь можно добавить логику записи в таблицу истории
// ЗаписьВЛог(Автор, ДатаИзменения, ЭтотОбъект);
КонецПроцедуры
Более гибкий и унифицированный подход — использование подписок на события. Это позволит вам настроить логирование для множества регистров без необходимости модифицировать каждый из них по отдельности.
Разберем по шагам, как реализовать запись в ЖурналРегистрации с помощью подписки:
ПодпискуНаСобытие.ПриЗаписи.ЖурналРегистрации.Рассмотрим пример кода для обработчика подписки:
Процедура ЛогированиеРС_ПриЗаписи(Источник, Отказ, Замещение) Экспорт
// Проверяем, что это набор записей регистра сведений
Если ТипЗнч(Источник) = Тип("РегистрСведенийНаборЗаписей.ВашРегистр") Тогда
МассивОтбора = Новый Массив;
Для Каждого ЭлементОтбора Из Источник.Отбор Цикл
МассивОтбора.Добавить(СтрШаблон("%1=%2", ЭлементОтбора.ПутьКДанным, ЭлементОтбора.Значение));
КонецЦикла;
Комментарий = СтрСоединить(МассивОтбора, "; ");
ЗаписьЖурналаРегистрации("ИзмененияРС",
УровеньЖурналаРегистрации.Информация,
Метаданные.РегистрыСведений.ВашРегистр,
Источник.Отбор.ОсновноеИзмерение.Значение,
Комментарий);
КонецЕсли;
КонецПроцедуры
Часто возникает вопрос: кто будет указан автором при изменении данных фоновым заданием? В платформе 1С при выполнении фоновых заданий ТекущийПользователь() будет соответствовать пользователю, от имени которого запущено задание (обычно это системная учетная запись). Чтобы получить более детализированную информацию, рекомендуем добавлять в структуру записи регистра дополнительные измерения, такие как Автор или ИдентификаторСеанса, и заполнять их в момент записи.
Проанализируем возможные риски: запись истории в отдельный регистр при каждой операции может замедлить работу системы, особенно если записи происходят часто. Если объем данных огромен, используйте ЗаписьЖурналаРегистрации — этот механизм оптимизирован для быстрой записи событий и не нагружает базу данных так сильно, как транзакционная запись в регистр сведений. Если же вам необходима глубокая аналитика (например, сравнение «было/стало»), тогда отдельный регистр сведений с версионированием — ваш выбор (поможет подсистема версионирования и аудита изменений в 1С), но учитывайте необходимость регулярной очистки старых данных.
Подводя итог, выбор между подписками и прямым изменением модулей зависит от масштаба вашей задачи. Для унификации системы выбирайте подписки на события, для точечного контроля — модули набора записей.