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

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

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

Назначение

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

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

Изображение

Как мы видим, в двух версиях документа отличаются только дата. Далее внутреннее устройство универсального механизма версионирования объектов.

Внутреннее устройство

Выполним краткое описание механизмы версионирования. Рассматриваемые объекты входят в подсистему "Версионирование объектов".

Изображение

Начнем с настроек и закончим таблицой хранения версий.

Настройки

Все настройки выполняются с помощью следующих объектов:

  1. Константа "Использовать версионирование объектов"
  2. Рег. сведений "Настройка версионирования объектов"
  3. Перечисление "Варианты версионирования объектов"

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

Изображение

Измерение "Тип объекта" имеет строковый тип, в котором хранится имя объекта метаданных, для которого устанавливается вариант версионирования.

В режиме 1С:Предприятие настройки версионирования объектов включаются через формы редактирования настроек программы:

Изображение

Нажав на кнопку "Настройка версионирования объектов" вы попадете в форму редактирования регистра сведений для установки параметров для каждого отдельного объекта:

Изображение

Все вышеописанные объекты и составляют основу для настройки версионирования объектов в УПП 1.3. Рассмотрим как эти настройки используются в дальнейшем.

Использование настроек

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

Сейчас обратим внимание на подписку на события "ВерсионированиеОбъектов_ПриЗаписиОбъекта". Событие подписки выполняется для любых объектов справочников и документов. Обработчик подписки содержит следующий алгоритм:

 

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

 

 Нас интересует лишь функция "ОбъектВерсионируется", определяющая необходимость записии версии для записываемого объекта. Вот листинг этой функции:

 

// Проверяет настройки версионирования по переданному объекту и
// и возвращает вариант версионирования. Если по объекту не настроено
// версионирование, то он версионируется в соответствии с правилами
// версионирования "по умолчанию".
//
Функция ОбъектВерсионируется(знач Источник, ЧислоВерсийОбъекта)	
	// Проверяем, что подсистема версионирования включена
	Если глЗначениеПеременной("ИспользоватьВерсионированиеОбъектов") Тогда		
		ВариантВерсионирования = ПолучитьВариантВерсионирования(Источник);		
		ЧислоВерсийОбъекта = ВерсионированиеОбъектовПривилегированный.
				ПолучитьКоличествоВерсийОбъекта(Источник.Ссылка)	
		ВерсионироватьОбъект = Истина;		
		Если ВариантВерсионирования 
			= Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать Тогда
			ВерсионироватьОбъект = Ложь;
		// Если версионирование проводится при проведении, то для непроведенных документов
		// или нулевой версии объекта записать варианта не выполняется
		ИначеЕсли ВариантВерсионирования 
			= Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении Тогда
			Если ЧислоВерсийОбъекта = 0 И НЕ Источник.Проведен Тогда
				ВерсионироватьОбъект = Ложь;
			КонецЕсли;
		КонецЕсли;		
	Иначе
		ВерсионироватьОбъект = Ложь;
	КонецЕсли;	
	Возврат ВерсионироватьОбъект;	
КонецФункции

 

 Сначала проверяется включена ли константа использования версионирования объектов. После этого получаем вариант версионирования для текущего объекта, который мы настраивали в регистре сведений "Настройка версионирования объектов". Листинг этой функции:

Функция ПолучитьВариантВерсионирования(Источник)
	// Получаем имя объекта в метаданых
	ИмяОбъекта = Источник.Метаданные().Имя;
	
	// Получаем запись для текущего объекта по его имени
	НастройкаВерсионирования 
		= РегистрыСведений.НастройкаВерсионированияОбъектов.СоздатьМенеджерЗаписи();
	НастройкаВерсионирования.ТипОбъекта = ИмяОбъекта;
	НастройкаВерсионирования.Прочитать();
	// Если вариант настроен - возвращаем его
	Если ЗначениеЗаполнено(НастройкаВерсионирования.Вариант) Тогда
		Возврат НастройкаВерсионирования.Вариант;
	Иначе
		// Если нет настройки и это справочник, то возвращаем вариант "Не версионировать"
		Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник.Ссылка)) Тогда
			Возврат Перечисления.ВариантыВерсионированияОбъектов.НеВерсионировать;
		Иначе
			// Если это документ и для него не установлен вариант версионирования,
			// то если документ проводится возвращаем вариант "Версионировать при проведении"
			// иначе "Версионировать всегда"
			Возврат ?(ДокументПроводится(Источник.Метаданные().Имя),
			          Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьПриПроведении,
			          Перечисления.ВариантыВерсионированияОбъектов.ВерсионироватьВсегда);
		КонецЕсли;
	КонецЕсли;
	
КонецФункции

В комментариях описан принцип работы функции. Заметьте, что если для документа не установлена настройка варианта версионирования, то он будет версиронировать все равно (при проведении или всегда).

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

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

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