gifts2017

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

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

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

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

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

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

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

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

Версия 1.1:

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

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

Версия 1.2:

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

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

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

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