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