Очистка регистра Версии Объектов от одинаковых версий

Очистка регистра Версии Объектов от одинаковых версий

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

Поискав на Инфостарте, я нашел только обработки которые удаляют записи регистра, но вместе с этими записи теряется история изменений объекта.

Рост регистра Версии объектов происходит не только после изменений документов, но и после массового проведения документов администратором, а так же если пользователь открыл документ и нажал на кнопку «ОК» (перепровел документ). Исходя из этого, следует что регистр хранит не только полезную информацию, но и кучу бесполезной — версии объектов, которым ничем не отличаются от предыдущих версий.

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

Работа обработки основана на типовом механизме сравнения двух объектов (с маленькой модификацией). Первая версия считается эталоном. Эталон сравнивается со следующей версии. Если в следующей версии есть изменения, то эта версия считается эталоном и сравнивается со следующей версией. Если в более младшей версии нет изменений по отношению к предыдущей, то эта версия удаляется.

Версия 1.1:

Добавил кнопки «Найти» и «Найти и удалить»

По кнопке «Анализ» теперь происходит расширенный анализ записей регистра сведений.

Версия 1.2:

Расширен функционал по поиску версий.

Добавил более информативное описание выбранного метода поиска.

Исправлены ошибки (типового механизма) при которых, в случае изменения метаданных, сравнение объектов заканчивалась неудачей.

36 Comments

  1. Новенький_2209

    Не пойму за что поставили минус публикации. Уж если ставишь минус — надо объяснять. Просто так — выглядит нелепо 🙂

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

    Reply ↓
  2. akomar

    Версии зло. При каждом новом обновлении базы приходится полностью удалять. Думаю грамотная настройка прав пользователей решает проблему необходимости использования версий. А за обработку + 🙂

    Reply ↓
  3. worker1c

    (2) akomar, Не понимаю, почему при каждом обновлении приходится удалять версии? Сколько обновлялись, ещё ни разу не очищали регистр.

    Версионирование помогает разруливать ситуации, в котором к одному документу имеют доступ несколько человек: Оператор набивает, комплектовщик проверяет и корректирует, а кладовщик проводит и отгружает. В этой ситуации сложно понять на каком этапе кто накосячил, если все клянутся что никто — ничего не менял! 🙂

    Ещё пару раз версионирование спасало в таких ситуациях: После кучи модификаций в документе после изменения какого-то реквизита, стали очищаться или меняться другие реквизиты. После просмотра изменений легко найти закономерность.

    Reply ↓
  4. akomar

    Из базы на 15 Гб — 5 Гб занимают версии объектов. После их удаления база начала шустрей работать.

    Reply ↓
  5. Aleksey-29

    Предлагаю вместо флага «Удалять версии» добавить 2 кнопки на панель: «Найти» — поиск одинаковых версий объекта и «Найти и удалить» — название говорит само за себя. А так, обработка отличная!

    Reply ↓
  6. Aleksey-29

    Интересненько:

    Сообщить(«Время выполнения: «+ (КоличествоОбъектов*2) +» сек»);

    Почему время исполнения — это количество объектов помноженное на 2?

    Reply ↓
  7. worker1c

    (6) Aleksey-29, 2 = 2 сек. Я проверял на трех серверах работу обработки, каждый объект обрабатывается за время в интервале от 1 сек — 3 сек. Для оценки примерного времени выполнения я взял среднее. Согласен, что алгоритм оценки неидеальный и только примерный, и что надо было подробнее написать об этом в описании. Алгоритм более точной оценки времени я не придумал, а пользовался этой кнопкой следующим образом:

    Запускаю обработку с количеством копий больше 1, программа мне выдает время 24 часа — я понимаю, что ждать столько не хочу, и ставлю количество копий больше 2 и т.д. пока не получу оптимальное для меня время. В следующей версии я или позволю пользователю самому выставлять среднее время обработки или сделаю другой функционал для кнопки Анализ.

    (5) Aleksey-29, Согласен. Я обязательно учту пожелания в следующей версии.

    Reply ↓
  8. anig99

    У самого лежит недописанная конфа и обработки к ней — выгрузка регистра версий во внешнюю базу (и загрузка из неё по необходимости) и уже в этой базе — удаление дублей. Надо собраться и выложить

    Reply ↓
  9. akomar

    Конечно выкладывай, от меня (+) гарантирован).

    Reply ↓
  10. ander_

    Несомненно полезная вещь, если нужда заставляет пользоваться версионированием. А не подскажет ли уважаемый ALL, как бы так писать только изменения. Н.р. изменился один реквизит, только его и пишем. Я ведь правильно понимаю, что стандартный механизм сериализует весь объект целиком?

    Reply ↓
  11. Boog

    Маленькое уточнение:

    Пусть в регистре есть 4 версии документа: (01.07); (05.07); (04.08); (06.08).

    Первые 3 из них — одинаковые.

    Т.е. после работы обработки в регистре останется 2 записи (04.08) и (06.08), и получится, что документ создан 04.08 и изменен 06.08. Так? Если так, то это не правильно — информация о моменте создания потеряна!

    Reply ↓
  12. worker1c

    (11) Boog, Конечно же нет. В описании написано что первая версия — всегда эталон, а эталон меняется только при наличии изменений. После работы обработки останутся версии 01.07 и 06.08. Так как сначала будут сравниваться версии 01.07 и 05.07, при этом будет выяснено что версии идентичны и 05.07 будет удалена, а версия 01.07 будет сравниваться с версией 04.08 и т.д.

    Reply ↓
  13. glek

    Хорошая идея. Давно витала в воздухе. Теперь надо будет еще подправить типовый механизм, чтобы записывал только изменения.

    Reply ↓
  14. worker1c
  15. glek

    (14) Спасибо. Почему то прошло мимо

    Reply ↓
  16. gull22

    Запустил в Комплексной автоматизации 1.1.24.2. Выдало ошибку

    {Форма.Форма.Форма(1450)}: Поле объекта не обнаружено (КоличествоДней)

    ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки];

    Будете править обработку?

    Reply ↓
  17. worker1c

    (16) gull22, Очень странно, потому что этот модуль полностью типовой, без доработок. Скажите, для каких объектов у вас включено версионирование и работает ли сравнение этих объектов с помощью типового отчета?

    Reply ↓
  18. gull22

    Справочники все = Не версионировать . У части справочников поле Вариант версионирования = пусто. Это у новых элементов появившихся в процессе совершенствования программы с 2010 года.

    Документы часть = Версионировать, часть = Версионировать при проведении.

    У части документов поле Вариант версионирования = пусто. Честно не знаю как это воспринимается программой.

    В основном прибегаю к проверке версий по докуменатм поступления ТМЦ и их списания. Штатный механизм работает по ним.

    Reply ↓
  19. worker1c

    (18) gull22, Попробуйте выполнить следующий запрос, так мы поймем какие объекты у вас версионируются. Внимание! Запрос может выполняться долго

    ВЫБРАТЬ РАЗЛИЧНЫЕ

    ТИПЗНАЧЕНИЯ(ВерсииОбъектов.Объект) КАК ТипОбъекта

    ИЗ

    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов

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

    Reply ↓
  20. gull22

    Список сформировал, начал проверку. Первое на чем пока споткнулся — это документ «Документ расчетов с контрагентом (ручной учет)». При выборе этого типа документа в штатной обработке открывается сам документ от 30.09.2012, а не таблица с перечнем документов (как обычно).

    Reply ↓
  21. gull22

    То же самое при выборе Документа «Регламентированный отчет», но разницу показывает

    Reply ↓
  22. gull22

    Еще один не стандартное представлеие: документ «элекьронное письмо». Версия видна в штатной обработке.

    Reply ↓
  23. gull22

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

    Попробовал в штатной демо-версии версионировать документ «Документ расчетов с контрагентом (ручной учет)». Версии создаются, Ваша обработка их видит и обрабатывает.

    Reply ↓
  24. worker1c

    (23) gull22, Спасибо за ваш труд. Переделаю обработку и вышлю вам. Будет показывать объекты которые обрабатывает. Может так хотя бы найдем объект на котором стопорится процесс. Выложу её позже.

    Reply ↓
  25. worker1c

    (23) gull22, Изменил обработку. Работает в разы дольше. Осторожнее.

    Reply ↓
  26. gull22

    Спасибо за отзывчивость. Запустил. При выборе количества версий 1, все равно выдала ошибку.

    {Форма.Форма.Форма(1453)}: Поле объекта не обнаружено (КоличествоДней)

    ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки];

    на документе «Отпуска организаций» (указала документ у которого 3 версии).Дата создания 01.03.2010 (перенесено из 1с7, при переходе на 1с8)

    Увеличил количество версий до 2. Опять ошибка, опять на «Отпуска организаций», но уже более поздний — 08.10.2010 (количество версий у этого документа — тоже 3)(перенесено из 1с7, при переходе на 1с8)

    Увеличил количество до 3. Опять ошибка, новый документ. Дата — 27.04.2011. Версий — 4.

    Единственной что их объяединяет, это то что последний пользователь = Администратор. Как я понимаю возник он в результате обновлений релизов, когда поменялись объекты программы. Дата 31.10.2011. Предпоследние пользователя меняли документ от силы на 2 дня позже чем он был создан

    Reply ↓
  27. _qqq

    Ошибка (16) появляется при работе функции

    // Функция сравнивает значения двух строк (по значению) и возвращает
    // Истина, в случае если строки равны, иначе возвращает Ложь
    // Предполагается что структура метаданных табличных частей  эквивалентна.
    //
    Функция СтрокиТЧРавны(СтрокаТЧ1, СтрокаТЧ2, Колонки)
    
    Для Каждого Колонка Из Колонки Цикл
    ИмяКолонки = Колонка.Имя;
    ЗначениеИзТЧ1 = СтрокаТЧ1[ИмяКолонки];
    ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки];
    Если ЗначениеИзТЧ1 <> ЗначениеИзТЧ2 Тогда
    Возврат Ложь;
    КонецЕсли;
    КонецЦикла;
    Возврат Истина;
    
    КонецФункции

    Показать

    А при всех ли вызовах этой функции есть уверенность, что

    структура метаданных табличных частей эквивалентна

    ?

    Может быть так подстраховаться:

    Попытка
    ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки];
    Исключение
    Возврат Ложь;
    КонецПопытки;
    Reply ↓
  28. unoDosTres

    механизм не является универсальным, как уже отмечалось выше, если объект в процессе использования конфы был изменен, добавлен новый реквизит допустим в ТЧ, тогда просто мы не сможем воспользоваться этой обработкой, а исключение не решает проблемы, если это изменение было введено допустим относительно недавно, а версионирование в базе ведется давно, и захотелось воспользоваться обработкой, то ничего хорошего отобработки ожидать не следуют, ибо основная часть кода взята из типового отчета ИсторияИзмененияОбъектов поэтому пичаль :(, ее можно допилить ограничив радиус проверки по дате изменений конфы, тогда она будет актуальна, но даты изменения надо знать — а их может быть много, или ограничить проверку определенными объектами, структура которых в процессе не менялись) короче бида ) но плюсик конечно лови

    Reply ↓
  29. worker1c

    (28) unoDosTres, (26) gull22, Перезалил обработку с исправлением типового механизма. Попробуйте с помощью новой обработки произвести поиск и удаление одинаковых версий.

    Reply ↓
  30. K_Tanusik

    Огромное спасибо за обработку. Она позволила уменьшить базу более чем ан 10 гигов. Это почти на 40%

    Reply ↓
  31. echo77

    Вот эта штука выполняет «Срез версий», т.е. удаляет все записи, кроме последней http://infostart.ru/public/191128/

    Reply ↓
  32. Sean1s
    {Форма.Форма.Форма(583)}: Ошибка при вызове метода контекста (Добавить)

    ТаблицаЗначений.Колонки.Добавить(«Вер» + МассивНомеровВерсий[Индекс-1]);

    по причине:

    Неверное имя колонки

    И тем не менее, за обработку однозначный «+».

    Добавлено

    Ага, всё понятно. Проблема в преобразовании числа больше 3х разрядов в текст: вставляется разделитель разрядов.

    Т.е. обработка будет корректно работать при количестве версий до 999 или при нестандартных региональных настройках.

    Решение

    В строках 133 и 138 обработки нужно заменить «Выборка.НомерВерсии» на «Формат(Выборка.НомерВерсии,»ЧГ=0″)».

    ЗЫ. Возможно у (16) именно в этом было дело.

    ЗЗЫ. У меня тоже комплексная. Платформа 8.3.3.641. Серверная.

    Reply ↓
  33. strop

    (32) Sean1s, ниже ещё есть строчка «Выборка.НомерВерсии», которую нужно поменять

    Reply ↓
  34. VovkaPutin

    надо идти дальше — вырубить в конфе создание одинаковых версий

    Reply ↓
  35. geron4

    (34) Сейчас они создаются (дубли), но по факту пустые, т.е. ХранилищеЗначений имеет тип Неопределено.

    Reply ↓
  36. VovkaPutin

    (35)в моей публикации предложен способ отключения создания одинаковых версий

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *