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

Опубликовал Евгений worker (worker1c) в раздел Администрирование - Чистка базы

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

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

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

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

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

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

Версия 1.1:

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

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

Версия 1.2:

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

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

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

Скачать файлы

Наименование Файл Версия Размер
УдалениеОдинаковыхВерсий.epf
.epf 21,92Kb
27.12.12
238
.epf 21,92Kb 238 Скачать

См. также

Комментарии
1. Игорь Хитров (Новенький_2209) 03.09.12 16:58 Сейчас в теме
Не пойму за что поставили минус публикации. Уж если ставишь минус - надо объяснять. Просто так - выглядит нелепо :)

По теме: всегда отключаем на внедрениях этот объект, т.к. на нормальных объема это все валится в полную ху-ла-лу. И если действительно есть потребность в каком-то логировании, то лучше смотреть в сторону сторонних решений, умеющих работать с скульными базами напрямую. Собственно и туда все логировать, коли нужно.
2. Андрей Комар (akomar) 383 03.09.12 18:38 Сейчас в теме
Версии зло. При каждом новом обновлении базы приходится полностью удалять. Думаю грамотная настройка прав пользователей решает проблему необходимости использования версий. А за обработку + :)
3. Евгений worker (worker1c) 109 04.09.12 06:10 Сейчас в теме
(2) akomar, Не понимаю, почему при каждом обновлении приходится удалять версии? Сколько обновлялись, ещё ни разу не очищали регистр.
Версионирование помогает разруливать ситуации, в котором к одному документу имеют доступ несколько человек: Оператор набивает, комплектовщик проверяет и корректирует, а кладовщик проводит и отгружает. В этой ситуации сложно понять на каком этапе кто накосячил, если все клянутся что никто - ничего не менял! :)
Ещё пару раз версионирование спасало в таких ситуациях: После кучи модификаций в документе после изменения какого-то реквизита, стали очищаться или меняться другие реквизиты. После просмотра изменений легко найти закономерность.
4. Андрей Комар (akomar) 383 04.09.12 21:36 Сейчас в теме
Из базы на 15 Гб - 5 Гб занимают версии объектов. После их удаления база начала шустрей работать.
5. Алексей Фурманов (Aleksey-29) 05.09.12 10:42 Сейчас в теме
Предлагаю вместо флага "Удалять версии" добавить 2 кнопки на панель: "Найти" - поиск одинаковых версий объекта и "Найти и удалить" - название говорит само за себя. А так, обработка отличная!
6. Алексей Фурманов (Aleksey-29) 05.09.12 13:57 Сейчас в теме
Интересненько:
Сообщить("Время выполнения: "+ (КоличествоОбъектов*2) +" сек");

Почему время исполнения - это количество объектов помноженное на 2?
7. Евгений worker (worker1c) 109 05.09.12 14:53 Сейчас в теме
(6) Aleksey-29, 2 = 2 сек. Я проверял на трех серверах работу обработки, каждый объект обрабатывается за время в интервале от 1 сек - 3 сек. Для оценки примерного времени выполнения я взял среднее. Согласен, что алгоритм оценки неидеальный и только примерный, и что надо было подробнее написать об этом в описании. Алгоритм более точной оценки времени я не придумал, а пользовался этой кнопкой следующим образом:
Запускаю обработку с количеством копий больше 1, программа мне выдает время 24 часа - я понимаю, что ждать столько не хочу, и ставлю количество копий больше 2 и т.д. пока не получу оптимальное для меня время. В следующей версии я или позволю пользователю самому выставлять среднее время обработки или сделаю другой функционал для кнопки Анализ.

(5) Aleksey-29, Согласен. Я обязательно учту пожелания в следующей версии.
8. Александр Медведев (anig99) 2513 06.09.12 16:58 Сейчас в теме
У самого лежит недописанная конфа и обработки к ней - выгрузка регистра версий во внешнюю базу (и загрузка из неё по необходимости) и уже в этой базе - удаление дублей. Надо собраться и выложить
9. Андрей Комар (akomar) 383 06.09.12 17:01 Сейчас в теме
Конечно выкладывай, от меня (+) гарантирован).
10. Андрей Казанцев (ander_) 08.09.12 12:12 Сейчас в теме
Несомненно полезная вещь, если нужда заставляет пользоваться версионированием. А не подскажет ли уважаемый ALL, как бы так писать только изменения. Н.р. изменился один реквизит, только его и пишем. Я ведь правильно понимаю, что стандартный механизм сериализует весь объект целиком?
11. Борис Соколов (Boog) 49 17.09.12 11:36 Сейчас в теме
Маленькое уточнение:
Пусть в регистре есть 4 версии документа: (01.07); (05.07); (04.08); (06.08).
Первые 3 из них - одинаковые.
Т.е. после работы обработки в регистре останется 2 записи (04.08) и (06.08), и получится, что документ создан 04.08 и изменен 06.08. Так? Если так, то это не правильно - информация о моменте создания потеряна!
12. Евгений worker (worker1c) 109 17.09.12 14:59 Сейчас в теме
(11) Boog, Конечно же нет. В описании написано что первая версия - всегда эталон, а эталон меняется только при наличии изменений. После работы обработки останутся версии 01.07 и 06.08. Так как сначала будут сравниваться версии 01.07 и 05.07, при этом будет выяснено что версии идентичны и 05.07 будет удалена, а версия 01.07 будет сравниваться с версией 04.08 и т.д.
13. Дмитрий Глеков (glek) 111 19.09.12 12:11 Сейчас в теме
Хорошая идея. Давно витала в воздухе. Теперь надо будет еще подправить типовый механизм, чтобы записывал только изменения.
14. Евгений worker (worker1c) 109 19.09.12 14:07 Сейчас в теме
15. Дмитрий Глеков (glek) 111 19.09.12 16:51 Сейчас в теме
(14) worker1c, Спасибо. Почему то прошло мимо
16. юрий гулидов (gull22) 81 26.09.12 09:53 Сейчас в теме
Запустил в Комплексной автоматизации 1.1.24.2. Выдало ошибку
{Форма.Форма.Форма(1450)}: Поле объекта не обнаружено (КоличествоДней)
ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки];
Будете править обработку?
17. Евгений worker (worker1c) 109 26.09.12 12:54 Сейчас в теме
(16) gull22, Очень странно, потому что этот модуль полностью типовой, без доработок. Скажите, для каких объектов у вас включено версионирование и работает ли сравнение этих объектов с помощью типового отчета?
18. юрий гулидов (gull22) 81 26.09.12 13:37 Сейчас в теме
Справочники все = Не версионировать . У части справочников поле Вариант версионирования = пусто. Это у новых элементов появившихся в процессе совершенствования программы с 2010 года.
Документы часть = Версионировать, часть = Версионировать при проведении.
У части документов поле Вариант версионирования = пусто. Честно не знаю как это воспринимается программой.
В основном прибегаю к проверке версий по докуменатм поступления ТМЦ и их списания. Штатный механизм работает по ним.
19. Евгений worker (worker1c) 109 26.09.12 14:20 Сейчас в теме
(18) gull22, Попробуйте выполнить следующий запрос, так мы поймем какие объекты у вас версионируются. Внимание! Запрос может выполняться долго

ВЫБРАТЬ РАЗЛИЧНЫЕ
ТИПЗНАЧЕНИЯ(ВерсииОбъектов.Объект) КАК ТипОбъекта
ИЗ
РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов

Ну, а потом один раз для каждого из типа объекта запустите сравнение с помощью типового отчета. Если ничего не вылетит, будем думать дальше. Но что-то мне подсказывает что на каком-то из объектов и типовой механизм даст сбой.
20. юрий гулидов (gull22) 81 26.09.12 15:29 Сейчас в теме
Список сформировал, начал проверку. Первое на чем пока споткнулся - это документ "Документ расчетов с контрагентом (ручной учет)". При выборе этого типа документа в штатной обработке открывается сам документ от 30.09.2012, а не таблица с перечнем документов (как обычно).
21. юрий гулидов (gull22) 81 26.09.12 16:09 Сейчас в теме
То же самое при выборе Документа "Регламентированный отчет", но разницу показывает
22. юрий гулидов (gull22) 81 26.09.12 16:29 Сейчас в теме
Еще один не стандартное представлеие: документ "элекьронное письмо". Версия видна в штатной обработке.
23. юрий гулидов (gull22) 81 26.09.12 16:45 Сейчас в теме
Список объектов получил на 128 прозиций, прогнал все через штатную обработку, работает по всем документам. Вот только отличается представление Журналов отдельных документов, о чем писал ранее.
Попробовал в штатной демо-версии версионировать документ "Документ расчетов с контрагентом (ручной учет)". Версии создаются, Ваша обработка их видит и обрабатывает.
24. Евгений worker (worker1c) 109 26.09.12 16:55 Сейчас в теме
(23) gull22, Спасибо за ваш труд. Переделаю обработку и вышлю вам. Будет показывать объекты которые обрабатывает. Может так хотя бы найдем объект на котором стопорится процесс. Выложу её позже.
25. Евгений worker (worker1c) 109 27.09.12 10:50 Сейчас в теме
(23) gull22, Изменил обработку. Работает в разы дольше. Осторожнее.
Прикрепленные файлы:
УдалениеОдинаковыхВерсийОтображение.epf
26. юрий гулидов (gull22) 81 27.09.12 13:18 Сейчас в теме
Спасибо за отзывчивость. Запустил. При выборе количества версий 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 дня позже чем он был создан
27. Марина Гинко (_qqq) 41 27.09.12 16:51 Сейчас в теме
Ошибка (16) появляется при работе функции

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

А при всех ли вызовах этой функции есть уверенность, что
структура метаданных табличных частей эквивалентна
?
Может быть так подстраховаться:
Попытка
ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки];
Исключение
Возврат Ложь;
КонецПопытки;
...Показать Скрыть
28. uno dos (unoDosTres) 07.12.12 16:30 Сейчас в теме
механизм не является универсальным, как уже отмечалось выше, если объект в процессе использования конфы был изменен, добавлен новый реквизит допустим в ТЧ, тогда просто мы не сможем воспользоваться этой обработкой, а исключение не решает проблемы, если это изменение было введено допустим относительно недавно, а версионирование в базе ведется давно, и захотелось воспользоваться обработкой, то ничего хорошего отобработки ожидать не следуют, ибо основная часть кода взята из типового отчета ИсторияИзмененияОбъектов поэтому пичаль :(, ее можно допилить ограничив радиус проверки по дате изменений конфы, тогда она будет актуальна, но даты изменения надо знать - а их может быть много, или ограничить проверку определенными объектами, структура которых в процессе не менялись) короче бида ) но плюсик конечно лови
29. Евгений worker (worker1c) 109 27.12.12 10:26 Сейчас в теме
(28) unoDosTres, (26) gull22, Перезалил обработку с исправлением типового механизма. Попробуйте с помощью новой обработки произвести поиск и удаление одинаковых версий.
30. Татьяна Катцына (K_Tanusik) 21.03.13 09:13 Сейчас в теме
Огромное спасибо за обработку. Она позволила уменьшить базу более чем ан 10 гигов. Это почти на 40%
31. Александр Крынецкий (echo77) 718 18.06.13 13:20 Сейчас в теме
Вот эта штука выполняет "Срез версий", т.е. удаляет все записи, кроме последней http://infostart.ru/public/191128/
32. Sergey Anisimov (Sean1s) 7 17.07.13 06:45 Сейчас в теме
{Форма.Форма.Форма(583)}: Ошибка при вызове метода контекста (Добавить)
ТаблицаЗначений.Колонки.Добавить("Вер" + МассивНомеровВерсий[Индекс-1]);
по причине:
Неверное имя колонки
И тем не менее, за обработку однозначный "+".

Добавлено
Ага, всё понятно. Проблема в преобразовании числа больше 3х разрядов в текст: вставляется разделитель разрядов.
Т.е. обработка будет корректно работать при количестве версий до 999 или при нестандартных региональных настройках.
Решение
В строках 133 и 138 обработки нужно заменить "Выборка.НомерВерсии" на "Формат(Выборка.НомерВерсии,"ЧГ=0")".

ЗЫ. Возможно у (16) именно в этом было дело.
ЗЗЫ. У меня тоже комплексная. Платформа 8.3.3.641. Серверная.
link_l; strop; +2 Ответить 1
33. Алексей Александрович (strop) 11.11.14 13:45 Сейчас в теме
(32) Sean1s, ниже ещё есть строчка "Выборка.НомерВерсии", которую нужно поменять
34. Владимир Рютин (VovkaPutin) 25 06.08.15 08:27 Сейчас в теме
надо идти дальше - вырубить в конфе создание одинаковых версий
Оставьте свое сообщение