Как реализовать логирование изменений в независимом регистре сведений?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Использование модуля набора записей

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

  1. Откройте конфигуратор и найдите нужный РегистрСведений.
  2. Перейдите в модуль набора записей (кнопка «Модуль набора записей»).
  3. В обработчике события ПриЗаписи вы можете реализовать запись истории в другой вспомогательный регистр или справочник.

Преимущество этого метода заключается в прямом доступе к данным. Вы можете получить ЭтотОбъект, содержащий как записываемые данные, так и отбор. Важно: использование этого метода требует изменения метаданных для каждого регистра, который вы планируете логировать, чтобы обеспечить контроль изменения объектов.

Пример простой реализации в модуле набора записей:


Процедура ПриЗаписи(Отказ, Замещение)
    // Получаем текущего пользователя и время
    Автор = Пользователи.ТекущийПользователь();
    ДатаИзменения = ТекущаяДатаСеанса();
    
    // Здесь можно добавить логику записи в таблицу истории
    // ЗаписьВЛог(Автор, ДатаИзменения, ЭтотОбъект);
КонецПроцедуры

Использование подписки на событие

Более гибкий и унифицированный подход — использование подписок на события. Это позволит вам настроить логирование для множества регистров без необходимости модифицировать каждый из них по отдельности.

Разберем по шагам, как реализовать запись в ЖурналРегистрации с помощью подписки:

  1. В дереве конфигурации создайте новую ПодпискуНаСобытие.
  2. Установите событие: ПриЗаписи.
  3. В качестве источника выберите наборы записей ваших регистров сведений.
  4. В обработчике события напишите код, который будет формировать запись в ЖурналРегистрации.

Рассмотрим пример кода для обработчика подписки:


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

Особенности логирования фоновых заданий

Часто возникает вопрос: кто будет указан автором при изменении данных фоновым заданием? В платформе 1С при выполнении фоновых заданий ТекущийПользователь() будет соответствовать пользователю, от имени которого запущено задание (обычно это системная учетная запись). Чтобы получить более детализированную информацию, рекомендуем добавлять в структуру записи регистра дополнительные измерения, такие как Автор или ИдентификаторСеанса, и заполнять их в момент записи.

Рекомендации по производительности

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

Подводя итог, выбор между подписками и прямым изменением модулей зависит от масштаба вашей задачи. Для унификации системы выбирайте подписки на события, для точечного контроля — модули набора записей.

← На главную