В процессе разработки конфигураций на платформе «1С:Предприятие 8» часто возникает задача отслеживания изменений в документах. Пользователям важно знать, кто, когда и какие именно данные изменил. В этой статье мы подробно разберем, как реализовать механизм логирования изменений, используя как ручные методы создания регистров, так и стандартные возможности платформы. Мы проанализируем различные подходы — от простого регистра сведений до сложных систем версионирования.
Рассмотрим ситуацию, когда нам необходимо создать собственный «Журнал логов». Это может быть полезно, если стандартные механизмы по какой-то причине не подходят или требуется специфическая структура хранения данных. Для начала создадим Регистр сведений (например, ЖурналЛоговЗаявки) со следующей структурой:
Пользователи.Ведущее для этого измерения.Проанализируем, почему свойство Ведущее является ключевым. Установка этого флага решает сразу две задачи: во-первых, в панели навигации формы документа автоматически появится ссылка на записи этого регистра, отфильтрованные по текущему документу. Во-вторых, при удалении документа система автоматически очистит связанные с ним записи в регистре, поддерживая чистоту базы данных.
Для того чтобы данные попадали в регистр, нам необходимо написать код. Разберем пример заполнения МенеджераЗаписи, который можно разместить в модуле документа или в подписке на событие:
МенеджерЗаписи = РегистрыСведений.ЖурналЛоговЗаявки.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Пользователь = Пользователи.АвторизованныйПользователь();
МенеджерЗаписи.Документ = Ссылка;
МенеджерЗаписи.СведенияДО = СтрокаДо; // Предварительно подготовленные данные
МенеджерЗаписи.СведенияПосле = СтрокаПосле; // Актуальные данные
МенеджерЗаписи.Записать();
Выясним причину, по которой запись лучше всего разделять на этапы. Чтобы корректно заполнить поле СведенияДО, нам нужно прочитать данные из базы в процедуре ПередЗаписью, так как в этот момент объект в памяти уже содержит новые значения, а в базе еще лежат старые. Для получения «чистых» данных используем обращение по ссылке: Ссылка.Объект.
Вместо того чтобы заставлять пользователя нажимать на отдельную кнопку или переходить в панель навигации, мы можем интегрировать историю изменений прямо в интерфейс формы документа. Рассмотрим, как это сделать с помощью Динамического списка.
ДинамическийСписок.
ВЫБРАТЬ
Регистр.Период,
Регистр.Пользователь,
Регистр.СведенияДО,
Регистр.СведенияПосле
ИЗ
РегистрСведений.ЖурналЛоговЗаявки КАК Регистр
ГДЕ
Регистр.Документ = &ДокументСсылка
ДокументСсылка, передавая туда Объект.Ссылка.Теперь при открытии документа пользователь сразу увидит таблицу со всей историей изменений. Это гораздо удобнее, чем формировать отдельный отчет.
Если ваша конфигурация работает на платформе версии 8.3.11 и выше, мы можем воспользоваться встроенным механизмом «История данных». Это современный и эффективный способ, который не требует написания кода для хранения логов.
Разберем по шагам включение этого механизма:
История данных и выберем значение Использовать.Платформа сама создаст необходимые таблицы в базе данных и обеспечит интерфейс для сравнения версий. Пользователь сможет нажать на стандартную кнопку «История» и увидеть детальный отчет о том, какие поля были изменены, с подсветкой различий. Это избавляет разработчика от необходимости вручную формировать строки «До» и «После».
В типовых решениях (УТ 11, ERP, КА, БП 3.0), построенных на базе Библиотеки стандартных подсистем (БСП), уже существует мощная подсистема «Версионирование объектов». Рассмотрим преимущества этого подхода:
Подсистема хранит версии объектов в виде сжатых XML-снимков. Это позволяет не только смотреть историю, но и при необходимости откатывать состояние документа к одной из предыдущих версий. Чтобы включить этот функционал, достаточно зайти в пользовательский режим (Администрирование — Общие настройки — История изменений) и выбрать нужные типы документов для логирования.
Для вывода этой информации на форму в БСП предусмотрена общая команда ИсторияИзменений. Мы можем просто добавить её в командную панель нашей формы, и система сама откроет стандартный отчет со списком всех версий документа.
Проанализируем важный аспект: хранение логов может существенно увеличить объем базы данных. Если мы записываем изменения в текстовом виде, рекомендуем придерживаться следующих правил:
ХранилищеЗначения со сжатием для больших объемов данных.ЭтотОбъект[ИмяРеквизита] и Ссылка[ИмяРеквизита]).Подводя итог, выбор метода зависит от ваших задач. Если нужна простая визуализация в специфическом виде — используйте свой регистр сведений с ведущим измерением. Если требуется полнофункциональное сравнение версий — используйте Историю данных платформы или Версионирование БСП. Сочетание этих методов позволит создать надежную систему аудита действий пользователей в программе.