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

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

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

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

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

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

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

Версия 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 не будет опубликован. Обязательные поля помечены *