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

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

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

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

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

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

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

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

Версия 1.1:

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

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

Версия 1.2:

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

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

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

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

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

См. также

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

По теме: всегда отключаем на внедрениях этот объект, т.к. на нормальных объема это все валится в полную ху-ла-лу. И если действительно есть потребность в каком-то логировании, то лучше смотреть в сторону сторонних решений, умеющих работать с скульными базами напрямую. Собственно и туда все логировать, коли нужно.
2. Андрей Комар (akomar) 377 03.09.12 18:38 Сейчас в теме
Версии зло. При каждом новом обновлении базы приходится полностью удалять. Думаю грамотная настройка прав пользователей решает проблему необходимости использования версий. А за обработку + :)
3. Евгений worker (worker1c) 108 04.09.12 06:10 Сейчас в теме
(2) akomar, Не понимаю, почему при каждом обновлении приходится удалять версии? Сколько обновлялись, ещё ни разу не очищали регистр.
Версионирование помогает разруливать ситуации, в котором к одному документу имеют доступ несколько человек: Оператор набивает, комплектовщик проверяет и корректирует, а кладовщик проводит и отгружает. В этой ситуации сложно понять на каком этапе кто накосячил, если все клянутся что никто - ничего не менял! :)
Ещё пару раз версионирование спасало в таких ситуациях: После кучи модификаций в документе после изменения какого-то реквизита, стали очищаться или меняться другие реквизиты. После просмотра изменений легко найти закономерность.
4. Андрей Комар (akomar) 377 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) 108 05.09.12 14:53 Сейчас в теме
(6) Aleksey-29, 2 = 2 сек. Я проверял на трех серверах работу обработки, каждый объект обрабатывается за время в интервале от 1 сек - 3 сек. Для оценки примерного времени выполнения я взял среднее. Согласен, что алгоритм оценки неидеальный и только примерный, и что надо было подробнее написать об этом в описании. Алгоритм более точной оценки времени я не придумал, а пользовался этой кнопкой следующим образом:
Запускаю обработку с количеством копий больше 1, программа мне выдает время 24 часа - я понимаю, что ждать столько не хочу, и ставлю количество копий больше 2 и т.д. пока не получу оптимальное для меня время. В следующей версии я или позволю пользователю самому выставлять среднее время обработки или сделаю другой функционал для кнопки Анализ.

(5) Aleksey-29, Согласен. Я обязательно учту пожелания в следующей версии.
8. Александр Медведев (anig99) 2480 06.09.12 16:58 Сейчас в теме
У самого лежит недописанная конфа и обработки к ней - выгрузка регистра версий во внешнюю базу (и загрузка из неё по необходимости) и уже в этой базе - удаление дублей. Надо собраться и выложить
9. Андрей Комар (akomar) 377 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) 108 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) 108 19.09.12 14:07 Сейчас в теме
15. Дмитрий Глеков (glek) 111 19.09.12 16:51 Сейчас в теме
(14) worker1c, Спасибо. Почему то прошло мимо
16. юрий гулидов (gull22) 80 26.09.12 09:53 Сейчас в теме
Запустил в Комплексной автоматизации 1.1.24.2. Выдало ошибку
{Форма.Форма.Форма(1450)}: Поле объекта не обнаружено (КоличествоДней)
ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки];
Будете править обработку?
17. Евгений worker (worker1c) 108 26.09.12 12:54 Сейчас в теме
(16) gull22, Очень странно, потому что этот модуль полностью типовой, без доработок. Скажите, для каких объектов у вас включено версионирование и работает ли сравнение этих объектов с помощью типового отчета?
18. юрий гулидов (gull22) 80 26.09.12 13:37 Сейчас в теме
Справочники все = Не версионировать . У части справочников поле Вариант версионирования = пусто. Это у новых элементов появившихся в процессе совершенствования программы с 2010 года.
Документы часть = Версионировать, часть = Версионировать при проведении.
У части документов поле Вариант версионирования = пусто. Честно не знаю как это воспринимается программой.
В основном прибегаю к проверке версий по докуменатм поступления ТМЦ и их списания. Штатный механизм работает по ним.
19. Евгений worker (worker1c) 108 26.09.12 14:20 Сейчас в теме
(18) gull22, Попробуйте выполнить следующий запрос, так мы поймем какие объекты у вас версионируются. Внимание! Запрос может выполняться долго

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

Ну, а потом один раз для каждого из типа объекта запустите сравнение с помощью типового отчета. Если ничего не вылетит, будем думать дальше. Но что-то мне подсказывает что на каком-то из объектов и типовой механизм даст сбой.
20. юрий гулидов (gull22) 80 26.09.12 15:29 Сейчас в теме
Список сформировал, начал проверку. Первое на чем пока споткнулся - это документ "Документ расчетов с контрагентом (ручной учет)". При выборе этого типа документа в штатной обработке открывается сам документ от 30.09.2012, а не таблица с перечнем документов (как обычно).
21. юрий гулидов (gull22) 80 26.09.12 16:09 Сейчас в теме
То же самое при выборе Документа "Регламентированный отчет", но разницу показывает
22. юрий гулидов (gull22) 80 26.09.12 16:29 Сейчас в теме
Еще один не стандартное представлеие: документ "элекьронное письмо". Версия видна в штатной обработке.
23. юрий гулидов (gull22) 80 26.09.12 16:45 Сейчас в теме
Список объектов получил на 128 прозиций, прогнал все через штатную обработку, работает по всем документам. Вот только отличается представление Журналов отдельных документов, о чем писал ранее.
Попробовал в штатной демо-версии версионировать документ "Документ расчетов с контрагентом (ручной учет)". Версии создаются, Ваша обработка их видит и обрабатывает.
24. Евгений worker (worker1c) 108 26.09.12 16:55 Сейчас в теме
(23) gull22, Спасибо за ваш труд. Переделаю обработку и вышлю вам. Будет показывать объекты которые обрабатывает. Может так хотя бы найдем объект на котором стопорится процесс. Выложу её позже.
25. Евгений worker (worker1c) 108 27.09.12 10:50 Сейчас в теме
(23) gull22, Изменил обработку. Работает в разы дольше. Осторожнее.
Прикрепленные файлы:
УдалениеОдинаковыхВерсийОтображение.epf
26. юрий гулидов (gull22) 80 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) 108 27.12.12 10:26 Сейчас в теме
(28) unoDosTres, (26) gull22, Перезалил обработку с исправлением типового механизма. Попробуйте с помощью новой обработки произвести поиск и удаление одинаковых версий.
30. Татьяна Катцына (K_Tanusik) 21.03.13 09:13 Сейчас в теме
Огромное спасибо за обработку. Она позволила уменьшить базу более чем ан 10 гигов. Это почти на 40%
31. Александр Крынецкий (echo77) 684 18.06.13 13:20 Сейчас в теме
Вот эта штука выполняет "Срез версий", т.е. удаляет все записи, кроме последней http://infostart.ru/public/191128/
32. Sergey Anisimov (Sean1s) 6 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) 22 06.08.15 08:27 Сейчас в теме
надо идти дальше - вырубить в конфе создание одинаковых версий