gifts2017

Версионирование объектов. Отсеивание дублирующихся версий в процессе возникновения (УПП 1.3). Часть 2.

Опубликовал Елена -- (el-le) в раздел Программирование - Практика программирования

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

  Большинство решений данного вопроса на Инфостарте представлены в виде различных обработок, удаляющих записи регистра сведений «Версии объектов», в том числе и дублирующиеся.

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

  В общем модуле «ВерсионированиеОбъектов» в экспортной процедуре МеханизмВерсионированияОбъектов_ПриЗаписиОбъекта(Источник, Отказ) необходимо добавить проверку на изменение объектов:

  В функции ПроверкаИзмененияОбъекта(Источник, ИмяВременногоФайла, ЧислоВерсийОбъекта)  выполняется определение номера последней хранящейся версии объекта и ее получение из регистра «ВерсииОбъектов» по номеру. Здесь же происходит вызов функции для  сравнения двух версий – текущей и последней хранящейся в регистре «ВерсииОбъектов».  Если версии совпадают, то запись новой версии в регистр не требуется.

  В функции СравнитьВерсии(Версия1, Версия2)  происходит Сравнение двух версий произвольного объекта. В функцию  могут быть переданы как пути к файлам,  содержащим версии, так и непосредственно версии в виде двоичных данных.  Возвращаемое значение - признак равенства версий объекта.

  Функция ПолучитьXMLПредставлениеВерсии( Знач Версия) выполняет получение представления версии в виде XML-строки. В функцию может быть передан как путь к файлу,  содержащему версию, так и версия в виде двоичных данных.  Возвращаемое значение: строка - представление версии в виде XML-строки.

 

Версионирование объектов. Механизм временной блокировки версионирования (УПП 1.3). Часть 1:

http://infostart.ru/public/326075/

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Алексей Рожнятовский (spetzpozh) 12.02.15 10:10
Буквально позавчера занимался этим вопросом - у нас до сих пор БП 2.0, из КА перенес туда механизм версионирования, он 1 в 1 как в УПП, думаю. Огромное Вам спасибо!
P.S. а код текстом можно? Перебивать с картинки не хочется :)
2. Валерий Максимов (theshadowco) 12.02.15 10:13
У себя мы реализовали несколько иначе - храним хэш данных объекта в РС с версиями и перед записью версии просто сравниваем хэш текущий с последним зафиксированным.
Это работает в разы быстрее предложенного ТС варианта
ojiojiowka; +1 Ответить 1
3. Сергей (scompany) 12.02.15 10:29
Извлечение в файлы и сравнение больших текстовых полей, не самое производительное решение.
В добавок данное действие происходит в транзакции, что для систем с количеством пользователей от 100 пользователей и более, должно приводить к блокировкам.
Для сравнения версий предпочтительней использовать HASH ключи:
1. В регистр добавить реквизит: Ключ = HASH ключ версии
2. Перед записью вычислять данный ключ для версии и записывать в регистр
3. При последующией записи получать предыдущий ключ и сравнивать с новым.
Да кстати, в последних релизах платформы появилась встроенная поддержка работы с HASH ключами:
Объект: Хеширование

nihfalck; ojiojiowka; w-divin; +3 Ответить
4. Алексей Рожнятовский (spetzpozh) 12.02.15 10:42
Коллеги, можете привести код вычесление хэш? Речь не о встроенном языке?
5. Алексей Рожнятовский (spetzpozh) 12.02.15 10:48
(2) theshadowco, http://infostart.ru/public/96713/ - 23 комментарий ваш с нужной функцией?
ojiojiowka; +1 Ответить 1
6. Валерий Максимов (theshadowco) 12.02.15 11:23
(5) до 8.3 использую его, в 8.3 использую платформенные возможности.
7. Алексей Рожнятовский (spetzpozh) 12.02.15 12:10
В итоге добавил строковый реквизит в регистр с версиями, в общий модуль добавил код подсчета хэша и в в проедуре МеханизмВерсионированияОбъекта_ПриЗаписи - проверка

////////////////////////////////////////////////////////////­////////////////////
// Механизм подсчета хэша представления объекта и сравнения с предыдущим записанным значением

ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяВременногоФайла, КодировкаТекста.UTF8);
СтрокаXML = ТекстовыйДокумент.ПолучитьТекст();
ХэшНовойВерсии = оп_ВерсионированиеОбъектовПривилегированный.Хэширование(СтрокаXML);

// Получим хэш предыдущей версии объекта
Если ЧислоВерсийОбъекта > 0 Тогда
ХэшПредыдущей = оп_ВерсионированиеОбъектовПривилегированный.ПолучитьХэшПоВерсии(Источник.Ссылка, ЧислоВерсийОбъекта);
Если ХэшНовойВерсии = ХэшПредыдущей Тогда
Возврат;
КонецЕсли;
КонецЕсли;
8. Maxim Goncharov (maxx) 12.02.15 14:24
Освещал подобную проблему в БСП больше года наза http://infostart.ru/public/237921/
Через полгода моей статье разработчики БСП внедрили подобный механизм по сравнению версий.
ojiojiowka; +1 Ответить
9. Алексей Рожнятовский (spetzpozh) 12.02.15 15:05
В БСП эта проверка есть, я ее видел. Но у нас отраслевка на поддержке, в ней функции БСП переписаны авторами конфы, ломать их желания нет, а внедрять подсистему из БСП свою и параллельно той что уже есть - желания еще меньше. Оказалось проще взять несколько объектов из КА и добавить контроль версий.
10. friend0 16.02.15 17:52
Странно, что в БСП все никак не сделают опцию хранения версий не в базе, а в файлах на диске (точнее слив из базы в файлы по ночам). Делается элементарно ж, зато и база не пухнет и бэкапы базы не пухнут. А файлы бэкапить тоже много места не надо - старые не меняются, только новые знай добавляй.
А читать версии ИМХО нужно весьма редко и быстродействие не критично.

Я так свою базу на 3/4 "сократил" - удалять жалко, да и пользователи такие, что обязательно ткнуть носом надо кто именно и когда накосячил.