После включения режима версионирования документов(справочников) регистр Версии объектов начинает очень быстро расти и становится одним из самых больших регистров сведений в базе. Учитывая что в этом регистре хранятся версии объектов, физический объем базы данных начинает расти пропорционально количеству записей.
Поискав на Инфостарте, я нашел только обработки которые удаляют записи регистра, но вместе с этими записи теряется история изменений объекта.
Рост регистра Версии объектов происходит не только после изменений документов, но и после массового проведения документов администратором, а так же если пользователь открыл документ и нажал на кнопку «ОК» (перепровел документ). Исходя из этого, следует что регистр хранит не только полезную информацию, но и кучу бесполезной — версии объектов, которым ничем не отличаются от предыдущих версий.
Предлагаю вашему вниманию обработку, которая анализирует версии объектов в этом регистре и удаляет версии в которых нет отличия от более старшей версии.
Работа обработки основана на типовом механизме сравнения двух объектов (с маленькой модификацией). Первая версия считается эталоном. Эталон сравнивается со следующей версии. Если в следующей версии есть изменения, то эта версия считается эталоном и сравнивается со следующей версией. Если в более младшей версии нет изменений по отношению к предыдущей, то эта версия удаляется.
Версия 1.1:
Добавил кнопки «Найти» и «Найти и удалить»
По кнопке «Анализ» теперь происходит расширенный анализ записей регистра сведений.
Версия 1.2:
Расширен функционал по поиску версий.
Добавил более информативное описание выбранного метода поиска.
Исправлены ошибки (типового механизма) при которых, в случае изменения метаданных, сравнение объектов заканчивалась неудачей.
Не пойму за что поставили минус публикации. Уж если ставишь минус — надо объяснять. Просто так — выглядит нелепо 🙂
По теме: всегда отключаем на внедрениях этот объект, т.к. на нормальных объема это все валится в полную ху-ла-лу. И если действительно есть потребность в каком-то логировании, то лучше смотреть в сторону сторонних решений, умеющих работать с скульными базами напрямую. Собственно и туда все логировать, коли нужно.
Версии зло. При каждом новом обновлении базы приходится полностью удалять. Думаю грамотная настройка прав пользователей решает проблему необходимости использования версий. А за обработку + 🙂
(2) akomar, Не понимаю, почему при каждом обновлении приходится удалять версии? Сколько обновлялись, ещё ни разу не очищали регистр.
Версионирование помогает разруливать ситуации, в котором к одному документу имеют доступ несколько человек: Оператор набивает, комплектовщик проверяет и корректирует, а кладовщик проводит и отгружает. В этой ситуации сложно понять на каком этапе кто накосячил, если все клянутся что никто — ничего не менял! 🙂
Ещё пару раз версионирование спасало в таких ситуациях: После кучи модификаций в документе после изменения какого-то реквизита, стали очищаться или меняться другие реквизиты. После просмотра изменений легко найти закономерность.
Из базы на 15 Гб — 5 Гб занимают версии объектов. После их удаления база начала шустрей работать.
Предлагаю вместо флага «Удалять версии» добавить 2 кнопки на панель: «Найти» — поиск одинаковых версий объекта и «Найти и удалить» — название говорит само за себя. А так, обработка отличная!
Интересненько:
Почему время исполнения — это количество объектов помноженное на 2?
(6) Aleksey-29, 2 = 2 сек. Я проверял на трех серверах работу обработки, каждый объект обрабатывается за время в интервале от 1 сек — 3 сек. Для оценки примерного времени выполнения я взял среднее. Согласен, что алгоритм оценки неидеальный и только примерный, и что надо было подробнее написать об этом в описании. Алгоритм более точной оценки времени я не придумал, а пользовался этой кнопкой следующим образом:
Запускаю обработку с количеством копий больше 1, программа мне выдает время 24 часа — я понимаю, что ждать столько не хочу, и ставлю количество копий больше 2 и т.д. пока не получу оптимальное для меня время. В следующей версии я или позволю пользователю самому выставлять среднее время обработки или сделаю другой функционал для кнопки Анализ.
(5) Aleksey-29, Согласен. Я обязательно учту пожелания в следующей версии.
У самого лежит недописанная конфа и обработки к ней — выгрузка регистра версий во внешнюю базу (и загрузка из неё по необходимости) и уже в этой базе — удаление дублей. Надо собраться и выложить
Конечно выкладывай, от меня (+) гарантирован).
Несомненно полезная вещь, если нужда заставляет пользоваться версионированием. А не подскажет ли уважаемый ALL, как бы так писать только изменения. Н.р. изменился один реквизит, только его и пишем. Я ведь правильно понимаю, что стандартный механизм сериализует весь объект целиком?
Маленькое уточнение:
Пусть в регистре есть 4 версии документа: (01.07); (05.07); (04.08); (06.08).
Первые 3 из них — одинаковые.
Т.е. после работы обработки в регистре останется 2 записи (04.08) и (06.08), и получится, что документ создан 04.08 и изменен 06.08. Так? Если так, то это не правильно — информация о моменте создания потеряна!
(11) Boog, Конечно же нет. В описании написано что первая версия — всегда эталон, а эталон меняется только при наличии изменений. После работы обработки останутся версии 01.07 и 06.08. Так как сначала будут сравниваться версии 01.07 и 05.07, при этом будет выяснено что версии идентичны и 05.07 будет удалена, а версия 01.07 будет сравниваться с версией 04.08 и т.д.
Хорошая идея. Давно витала в воздухе. Теперь надо будет еще подправить типовый механизм, чтобы записывал только изменения.
(13) glek,http://infostart.ru/public/137383/
(14) Спасибо. Почему то прошло мимо
Запустил в Комплексной автоматизации 1.1.24.2. Выдало ошибку
{Форма.Форма.Форма(1450)}: Поле объекта не обнаружено (КоличествоДней)
ЗначениеИзТЧ2 = СтрокаТЧ2[ИмяКолонки];
Будете править обработку?
(16) gull22, Очень странно, потому что этот модуль полностью типовой, без доработок. Скажите, для каких объектов у вас включено версионирование и работает ли сравнение этих объектов с помощью типового отчета?
Справочники все = Не версионировать . У части справочников поле Вариант версионирования = пусто. Это у новых элементов появившихся в процессе совершенствования программы с 2010 года.
Документы часть = Версионировать, часть = Версионировать при проведении.
У части документов поле Вариант версионирования = пусто. Честно не знаю как это воспринимается программой.
В основном прибегаю к проверке версий по докуменатм поступления ТМЦ и их списания. Штатный механизм работает по ним.
(18) gull22, Попробуйте выполнить следующий запрос, так мы поймем какие объекты у вас версионируются. Внимание! Запрос может выполняться долго
ВЫБРАТЬ РАЗЛИЧНЫЕ
ТИПЗНАЧЕНИЯ(ВерсииОбъектов.Объект) КАК ТипОбъекта
ИЗ
РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
Ну, а потом один раз для каждого из типа объекта запустите сравнение с помощью типового отчета. Если ничего не вылетит, будем думать дальше. Но что-то мне подсказывает что на каком-то из объектов и типовой механизм даст сбой.
Список сформировал, начал проверку. Первое на чем пока споткнулся — это документ «Документ расчетов с контрагентом (ручной учет)». При выборе этого типа документа в штатной обработке открывается сам документ от 30.09.2012, а не таблица с перечнем документов (как обычно).
То же самое при выборе Документа «Регламентированный отчет», но разницу показывает
Еще один не стандартное представлеие: документ «элекьронное письмо». Версия видна в штатной обработке.
Список объектов получил на 128 прозиций, прогнал все через штатную обработку, работает по всем документам. Вот только отличается представление Журналов отдельных документов, о чем писал ранее.
Попробовал в штатной демо-версии версионировать документ «Документ расчетов с контрагентом (ручной учет)». Версии создаются, Ваша обработка их видит и обрабатывает.
(23) gull22, Спасибо за ваш труд. Переделаю обработку и вышлю вам. Будет показывать объекты которые обрабатывает. Может так хотя бы найдем объект на котором стопорится процесс. Выложу её позже.
(23) 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 дня позже чем он был создан
Ошибка (16) появляется при работе функции
Показать
А при всех ли вызовах этой функции есть уверенность, что
?
Может быть так подстраховаться:
механизм не является универсальным, как уже отмечалось выше, если объект в процессе использования конфы был изменен, добавлен новый реквизит допустим в ТЧ, тогда просто мы не сможем воспользоваться этой обработкой, а исключение не решает проблемы, если это изменение было введено допустим относительно недавно, а версионирование в базе ведется давно, и захотелось воспользоваться обработкой, то ничего хорошего отобработки ожидать не следуют, ибо основная часть кода взята из типового отчета ИсторияИзмененияОбъектов поэтому пичаль :(, ее можно допилить ограничив радиус проверки по дате изменений конфы, тогда она будет актуальна, но даты изменения надо знать — а их может быть много, или ограничить проверку определенными объектами, структура которых в процессе не менялись) короче бида ) но плюсик конечно лови
(28) unoDosTres, (26) gull22, Перезалил обработку с исправлением типового механизма. Попробуйте с помощью новой обработки произвести поиск и удаление одинаковых версий.
Огромное спасибо за обработку. Она позволила уменьшить базу более чем ан 10 гигов. Это почти на 40%
Вот эта штука выполняет «Срез версий», т.е. удаляет все записи, кроме последнейhttp://infostart.ru/public/191128/
ТаблицаЗначений.Колонки.Добавить(«Вер» + МассивНомеровВерсий[Индекс-1]);
по причине:
Неверное имя колонки
И тем не менее, за обработку однозначный «+».
Добавлено
Ага, всё понятно. Проблема в преобразовании числа больше 3х разрядов в текст: вставляется разделитель разрядов.
Т.е. обработка будет корректно работать при количестве версий до 999 или при нестандартных региональных настройках.
Решение
В строках 133 и 138 обработки нужно заменить «Выборка.НомерВерсии» на «Формат(Выборка.НомерВерсии,»ЧГ=0″)».
ЗЫ. Возможно у (16) именно в этом было дело.
ЗЗЫ. У меня тоже комплексная. Платформа 8.3.3.641. Серверная.
(32) Sean1s, ниже ещё есть строчка «Выборка.НомерВерсии», которую нужно поменять
надо идти дальше — вырубить в конфе создание одинаковых версий
(34) Сейчас они создаются (дубли), но по факту пустые, т.е. ХранилищеЗначений имеет тип Неопределено.
(35)в моей публикации предложен способ отключения создания одинаковых версий