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