Хранение версий объектов осуществляется в БД ObjectVersion, расположенной на сервере, желательно (но не обязательно) на том-же, где расположена основная БД.
Строка подключения :
Provider=SQLNCLI11;Server=lpc:(local)\MyINSTANCE;Database=ObjectVersion;Uid=1Cv8Log2;Pwd=Pa$$w0rd;
!Внимание. В исходных текстах модулей, приводимых в статье строка подключения загружается из регистра сведений ВС_ПредопределенныеЭлементы. Такое поведение можно скорректировать следующим образом.
//пСтрока_Подключения = РегистрыСведений.ВС_ПредопределенныеЭлементы.ПолучитьЗначениеПоИмени("ObjVersion.ConnectionString");
пСтрока_Подключения = Константы.СтрокаПодключенияКСУБДХраненияВерсииОбъекта.Получить();
В конфигурацию 1С встраивается три модуля и подписка на событие хх_ПриЗаписиОбъектаДляВерсионирования.ПриЗаписи. Источником события подписки является СправочникОбъект, ДокументОбъект. Обработчик расположен в модуле xx_УправлениеВерсионированиемОбъектовСервер.
Процедура ЗафиксироватьВерсиюОбъекта(хОбъект,хСсылка) ЭКСПОРТ
Перем рез;
УстановитьПривилегированныйРежим(Истина);
Попытка
пСтрока_Подключения = РегистрыСведений.ВС_ПредопределенныеЭлементы.ПолучитьЗначениеПоИмени("ObjVersion.ConnectionString");
Если НЕ ЗначениеЗаполнено(пСтрока_Подключения) ТОгда
Возврат;
КонецЕсли;
соединение = ВС_УправлениеВерсионированиемОбъектовПовтИсп.м_ADO_Подключить(пСтрока_Подключения);
Если (соединение <> Неопределено) И (соединение.State = 1) Тогда
xmlобъект = СтрЗаменить(хОбъект,"'","''");
xmlссылка = хСсылка;
пользователь = ПараметрыСеанса.ТекущийПользователь;
пк = ПолучитьТекущийСеансИнформационнойБазы().ИмяКомпьютера;
бд = ПолучитьИдентификаторБД();
бдUUID = бд.ХешСумма;
бдNAME = бд.СтрокаСоединения;
комманда = "
|DECLARE @dbuuid varchar(36);
|DECLARE @dbname varchar(50);
|DECLARE @username nvarchar(50);
|DECLARE @hostname nvarchar(50);
|DECLARE @ref xml;
|DECLARE @curobj xml;
|
|SELECT
|@dbuuid='"+бдUUID+"',
|@dbname='"+бдNAME+"',
|@username='"+пользователь+"',
|@hostname='"+пк+"',
|@ref='"+xmlссылка+"',
|@curobj='"+xmlобъект+"'
|;
|
|EXECUTE [DWHSchema].[addObjVersion]
| @dbuuid
| ,@dbname
| ,@username
| ,@ref
| ,@curobj
| ,@hostname
|";
м_ADO_Запрос_Выполнить(соединение,комманда,рез);
КонецЕсли;
Исключение
ВыполнитьЗаписьСобытияВЖурналРегистрации(ОписаниеОшибки(),,,пСтрока_Подключения);
КонецПопытки;
КонецПроцедуры
Как видно из кода, для записи осуществляется вызов хранимой процедуры [DWHSchema].[addObjVersion], расположенной в одной из схем базы данных [ObjectVersion].
База данных представляет из себя хранилище, состоящее из трех файловых групп которые оптимизируются под хранение данных, хранение BLOB и хранения временных данных для предварительной обработки. В таблицу [DWHSchema].[Versions] попадают первичные данные. С периодичностью настроенной в расписании задания ObjectVersionDiffCalculate (например 1 час) на шаге 1 вызывается хранимая процедура [DWHSchema].[DoBulkDifferent].
Эта хранимая процедура осуществляет окончательную обработку данных которая включает сохранение версии объекта в таблицах
[DWHSchema].[VersionsObjectStorage] и [DWHSchema].[VersionsCompress].
А так же происходит выделение отличий объекта от его предыдущий версии. Эта информация сохраняется в таблице [DWHSchema].[Differents].
Общение с БД ObjectVersion осуществляется через набор встроенных функций и процедур.
[DWHSchema].[addObjVersion] |
Процедура, регистрирующая версию объекта. Вызывается из подписки 1С ПриЗаписи. |
|
|
[DWHSchema].[GetObjVersions] |
Функция возвращает список версий объекта. Ей необходимо передать GUID объекта в качестве параметра. Например: USE [ObjectVersion] GO DECLARE @r nvarchar(36) ='e3488ea5-ce4f-11e9-80c4-a4bf01016d51'; SELECT * FROM [DWHSchema].[GetObjVersions] ( @r ,'') |
[DWHSchema].[GetObjectDifferents] |
Функция возвращает список различий между версиями объекта. Различия рассчитываются по расписанию задания ObjectVersionDiffCalculate. DECLARE @r nvarchar(36) ='e3488ea5-ce4f-11e9-80c4-a4bf01016d51'; SELECT * FROM [DWHSchema].[GetObjectDifferents] ( @r) |
[DWHSchema].[GetDiffObjOnLine] |
Функция возвращает различия между двумя версиями одного объекта. Различия рассчитываются налету. В качестве параметров необходимо передать ID версий объекта. Сначала младшую, затем старшую. SELECT * FROM [DWHSchema].[GetDiffObjOnLine] (12854,32354) |
Вызовы процедур и функций встроены в конфигурацию в модуле xx_УправлениеВерсионированиемОбъектовСервер. (ЗафиксироватьВерсиюОбъекта, ПолучитьИсториюИзмененийПоССылке, ПолучитьСписокИзмененийТекущейВерсии, ПолучитьСписокИзмененийТекущейВерсииРасчетная).
Для повышения селективности регистрации событий в БД ObjectVersion находится таблица [DWHSchema].[BlackObjectList] и [DWHSchema].[DBCodes]. В таблице [DWHSchema].[BlackObjectList] содержатся записи об объектах 1С, которые необходимо исключить из трассы версий (поле [dont_save_version] = 1).
В таблице [DWHSchema].[DBCodes] перечислены все варианты подключения к 1С. Регистрируются изменения клиентов, у которых строка подключения записана в таблицу и поле [enable] = 0x01. Заполнение таблицы [DWHSchema].[DBCodes] осуществляется автоматически.
Изучить историю изменения объекта можно с помощью внешней обработки. Обработка получает данные из выше перечисленных функций модуля и выводит их на форму как показано на рисунке.
В настоящий момент система контроля версий используется в конфигурациях 1С:УПП 1.4, 1С:КА 2.3, 1С:Бух 3.0 (Платформа 1C 8.3.10 и выше). MS SQL 2016 Standart.