новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Внутреннее устройство версионирования объектов УПП 1.3. Хранение версий объектов в базе данных

  • Добавить свою публикацию
  • для этого требуется регистрация

Поехали!

В предыдущей статье мы рассмотрели настройки механизма версионирования объектов в УПП 1.3, их реализацию и использование. Сегодня мы рассмотрим способ хранения версий объектов в базе данных, а также примеры работы с версиями.

Хранение в базе данных

Ранее мы рассматривали алгоритм обработчика подписки "ВерсионированиеОбъектов_ПриЗаписиОбъекта", в которой, в зависимости от настроек версионирования, выполняется запись версии объекта в базу данных. Еще раз проведем листинг процедуры обработчика:

Процедура МеханизмВерсионированияОбъектов_ПриЗаписиОбъекта(Источник, Отказ) Экспорт
	
	Перем ЧислоВерсийОбъекта; // Переменная хранит число версий объекта
	// Проверяем настройки объекта - необходимо ли записать его версию
	// в базу данных
	Если ОбъектВерсионируется(Источник, ЧислоВерсийОбъекта) Тогда		
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
		// Серилизуем объект в XML
		ЗаписьXML = Новый ЗаписьXML;
		ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла); 
		ЗаписьXML.ЗаписатьОбъявлениеXML();
		ЗаписатьXML(ЗаписьXML, Источник, НазначениеТипаXML.Явное);
		ЗаписьXML.Закрыть();
		// Двоичные данные Файла с результатом серилизации преобразуем в значение типа 
		// "Хранилище данных"
		ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
		ХранилищеДанных = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));		
		УдалитьФайлы(ИмяВременногоФайла);
		// !!! Записываем версию объекта в базу данных
		ВерсионированиеОбъектовПривилегированный.ЗаписатьВерсиюОбъекта(Источник.Ссылка, 
																	   ЧислоВерсийОбъекта, 
																	   ХранилищеДанных);
		
	КонецЕсли;	
КонецПроцедуры 

Теперь в обработчике нас интересует процедура "ЗаписатьВерсиюОбъекта" общего модуля "ВерсионированиеОбъектовПривилегированный". Но перед этим рассмотрим пример генерируемого XML для объекта документа "Поступление товаров и услуг". Вот так выглядит пример содержимого XML (некоторые поля убрал, чтобы уменьшить размер изображения):

Изображение

 Прежде чем перейдем к рассмотрению записи версии объекта в базу, рассмотрим функцию подсчета версий объекта. Там все довольно просто: запросом определяем количество версий объектов, которые содержатся в базе. Запрос выполняется к регистру сведений "ВерсииОбъектов":

 // Возвращает количество версий объекта переданного по ссылке
Функция ПолучитьКоличествоВерсийОбъекта(Ссылка) Экспорт	
	Запрос = Новый Запрос;
	Запрос.Текст = "
	| ВЫБРАТЬ ЕСТЬNULL(МАКСИМУМ(НомерВерсии), 0) КАК НомерВерсии
	| ИЗ РегистрСведений.ВерсииОбъектов
	| ГДЕ Объект = &Ссылка";
	Запрос.УстановитьПараметр("Ссылка", Ссылка);	
	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();	
	НомерВерсии = Выборка.НомерВерсии;	
	Возврат НомерВерсии;	
КонецФункции

 Структура метаданных регистра имеет следующий вид:

Изображение

Измерение "Объект" содержит ссылку на объект базы данных, которому принадлежит версия объекта. "НомерВерсии" - это число, в котором определен номер версии объекта на момент записи. В ресурсе "Версия Объекта" с типом "ХранилищеЗначений" сохранены двоичные данные файла XML с содержимым сериализуемого объекта. Реквизиты "АвторВерсии" и "ДатаВерсии" содержат информацию о пользователе и дате записи версии объекта. 

На следующем листинге мы видим процедуру записи версии объекта в регистр сведений "ВерсииОбъектов":

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

Как мы видим, создается запись регистра сведений "ВерсииОбъектов". В качестве даты версии устанавливается текущая дата, а автора версии - текущий пользователь. В ресурс "ВерсияОбъекта" записываются двоичные данные файла XML-описания объекта, сформированные в обработчике подписки, которую мы рассмотрели в начале статьи.

Перейдем к рассмотрению способов работы с сохраненными в базе версиями объектов.

Просмотр и сравнение версий

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

Изображение

Рассмотрим общий принцип работы отчета. Вывод осуществляется в соответствии с макетом:

Изображение

Получив XML-описание сохраненного объекта отдельно получаются коллекция реквизитов и коллекция табличных частей (процедура модуля объекта отчета "РазборПредставленияОбъектаXML") с соответствующими их значениями. На основе этих данных и заполняется отчет.

Полностью рассматривать алгоритм сравнения версий не будем, отмечу лишь основные моменты. Для сравнения выбираются две версии.

Изображение

На скриншоте выше показано сравнение версии №1 и версии №5. Принцип работы алгоритма сравнения достаточно прост:

  1. Получаем значения реквизитов и табличные части сравниваемых версий объектов.
  2. Выполняем сравнения каждого из реквизитов версий (включая реквизиты таб. частей).
  3. Найденные изменения выводим в отчет.
Используя отчет можно получить историю изменения объекта и ответственных за эти изменения.

Вместо заключения

Механизм версионирования дает большие возможности для контроля изменения документов и элементов справочников. Единственный минус - это значительно влияние на производительность прикладного решения, причем не в лучшую сторону.

 
0
Еще от автора
≡ к списку статей