Сокращение размера регистра "Версии объектов" в УПП 1.3.

02.05.17

База данных - Чистка данных

Сделал хранение данных в регистре более оптимальным. Промаркировал все версии объекта с помощью хеш функции, одинаковые хеши - одинаковые версии. Почистил поле ВерсияОбъекта для всех одинаковых версий, кроме первой. Если нужно вытянуть почищенные данные, то находим первую версию объекта с таким же хешем. Использовал поля, которые уже есть в конфигурации.

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

Наименование Файл Версия Размер
Сокращение размера регистра "Версии объектов" в УПП 1.3. :
.erf 44,22Kb
6
.erf 1.0 44,22Kb 6 Скачать

Возможно о надоевшем, так как с версиями объектов как только не боролись. Нашел неплохой способ использовать реквизиты, которые в регистре были не задействованы. 

В общем, как и многие, в один прекрасный день столкнулся с тем, что регистр сведений "Версии объектов" разросся так сильно, что стал занимать очень много места на SQL. Порядка 4 миллионов записей, половина из которых - дубли. Одно из решений - обработка по удалению одинаковых версий объектов. Решение логичное, но есть одно но - с моей точки зрения, для документов использовать нельзя, так как при перепроведении документа, его движения могут кардинально измениться, из-за изменений настроек программы, учетной политики и т.п. Пройдемся обработкой - даже не узнаем о том, что кто-то что-то перепроводил и не найдем проблему. То есть для данной ситуации важна сама запись в регистре, без данных о версии объекта.
Возникла следующая идея - писать в поле регистра хеш версии объекта, если версии совпадают - хеш одинаковый. Удалять информацию о версии объекта из всех записей с одинаковым хешем, кроме первой. А хеш использовать как ключ поиска. Этим мы решим проблему дублирования и будем видеть все обращения к объектам. Придется переделать отчет истории изменения объектов, чтобы он искал нужную версию объекта по хешу, но это пустяки.
На практике - регистр уже огромный, добавление или изменение его реквизитов приведет к долгой и ненужной реструктуризации. Но оказалось что в регистре уже есть все нужные реквизиты, они просто не используются: УдалитьСжато, Комментарий, ВерсияПроигнорирована.
Решил использовать эти реквизиты для своей задачи: УдалитьСжато - флаг того что запись содержит данные версии (система ставит в истину по умолчанию), Комментарий - строка хеша версии объекта, ВерсияПроигнорирована - запись регистра обработана.

Чтобы не увеличить время записи объектов в системе, обработку регистра вынес в регламентное задание. Регламентное задание разбито на две части - первая проставляет хеши (используется CRC32 как более быстрый) для записей с пустыми хешами. Вторая - чистит версии объектов у записей с одинаковым хешем. Снимает флаг СодержитДанные если версия очищена, и ставит флаг ЗаписьОтработана в любом случае, чтобы не отрабатывать ее в дальнейшем. 

Поставил регламентное задание, оно отрабатывало наверно недели две по ночам. Но результат хороший. Делал давно, поэтома сравнивая с данными по проществии года.

Результаты. Было следующее соотношение: количество записей 3,8 млн записей - объем с индексами 14 гигабайт. Сейчас, спустя год 25,3 млн записей, объем с индексами - 31 гигабайт. То есть было примерно 3,5 гигабайта на миллион записей, сейчас - чуть более гигабайта. 

Текст процедуры регламентного задания:

Процедура УдалитьДублиВерсийОбъектов()    Экспорт
    // Используемые поля регистра ВерсииОбъектов:
    // Комментарий - хеш версии объекта (ключ для поиска версии)
    // ВерсияПроигнорирована - используется наоборот, как флаг того что запись регистра полностью отработана - проставлен хеш, и проверена на дубли
    // УдалитьСжато - признак того что запись содержит данные о версии объекта, если Ложь - то данные стерты, и нужны искать запись объекта с таким же хешем и с флагом.
    // ищем не проставленные хеши объектов
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 100
    |    ВерсииОбъектов.Объект
    |ПОМЕСТИТЬ ОбъектыБезХеша
    |ИЗ
    |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    |    ВерсииОбъектов.Комментарий = """"
    |    И ВерсииОбъектов.Объект <> НЕОПРЕДЕЛЕНО
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВерсииОбъектов.Объект,
    |    ВерсииОбъектов.НомерВерсии
    |ИЗ
    |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОбъектыБезХеша КАК ОбъектыБезХеша
    |        ПО ВерсииОбъектов.Объект = ОбъектыБезХеша.Объект
    |ГДЕ
    |    ВерсииОбъектов.Комментарий = """"";
    
    // проставляем хеши. CRC32 - самый простой и быстрый.
    
    Результат = Запрос.Выполнить();
    Если Не Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Пока Выборка.Следующий() Цикл
            Запись = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
            ЗаполнитьЗначенияСвойств(Запись, Выборка);
            Запись.Прочитать();
            Если Запись.Выбран() Тогда
                ХешМастер = Новый ХешированиеДанных(ХешФункция.CRC32);
                ХешМастер.Добавить(Запись.ВерсияОбъекта.Получить());
                Запись.Комментарий = Формат(ХешМастер.ХешСумма,"ЧГ=");
            КонецЕсли;
            Запись.Записать();     
        КонецЦикла; 
    КонецЕсли; 
    
    // удаляем дубли версий
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 100
    |    ВерсииОбъектов.Объект
    |ПОМЕСТИТЬ НеОбработанныеОбъекты
    |ИЗ
    |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    |    ВерсииОбъектов.ВерсияПроигнорирована = ЛОЖЬ
    |    И ВерсииОбъектов.Комментарий <> """"
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВерсииОбъектов.Объект,
    |    ВерсииОбъектов.НомерВерсии,
    |    ВерсииОбъектов.Комментарий КАК Хеш
    |ПОМЕСТИТЬ НеОбработанныеЗаписи
    |ИЗ
    |    РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ НеОбработанныеОбъекты КАК НеОбработанныеОбъекты
    |        ПО ВерсииОбъектов.Объект = НеОбработанныеОбъекты.Объект
    |ГДЕ
    |    ВерсииОбъектов.ВерсияПроигнорирована = ЛОЖЬ
    |    И ВерсииОбъектов.Комментарий <> """"
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    НеОбработанныеЗаписи.Объект КАК Объект,
    |    НеОбработанныеЗаписи.НомерВерсии,
    |    НеОбработанныеЗаписи.Хеш,
    |    МИНИМУМ(ЕСТЬNULL(ВерсииОбъектов.НомерВерсии, 0)) КАК НомерВерсииЭталон
    |ИЗ
    |    НеОбработанныеЗаписи КАК НеОбработанныеЗаписи
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |        ПО НеОбработанныеЗаписи.Объект = ВерсииОбъектов.Объект
    |            И НеОбработанныеЗаписи.Хеш = ВерсииОбъектов.Комментарий
    |            И НеОбработанныеЗаписи.НомерВерсии > ВерсииОбъектов.НомерВерсии
    |
    |СГРУППИРОВАТЬ ПО
    |    НеОбработанныеЗаписи.Объект,
    |    НеОбработанныеЗаписи.НомерВерсии,
    |    НеОбработанныеЗаписи.Хеш";
    
    Результат = Запрос.Выполнить();
    
    Если Не Результат.Пустой() Тогда
        
        Выборка = Результат.Выбрать();
        
        Пока Выборка.Следующий() Цикл
        
            Запись = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
            ЗаполнитьЗначенияСвойств(Запись, Выборка);
            Запись.Прочитать();
            Если Запись.Выбран() Тогда
                Если Выборка.НомерВерсииЭталон <> 0 Тогда
                    Запись.ВерсияОбъекта = Новый ХранилищеЗначения("");
                    Запись.УдалитьСжато = Ложь;
                КонецЕсли;
                Запись.ВерсияПроигнорирована = Истина;
            КонецЕсли;
            Запись.Записать(); 
            
        КонецЦикла;
        
    КонецЕсли; 
    
КонецПроцедуры

Отчет по версиям объектов можете допилить сами, если лень, то в приложении отчет готовый, с возможностью выбора нескольких объектов и с поиском ссылок.

Может кому-то пригодиться.

Версии объектов УПП Хеш CRC32.

См. также

Удаление данных с отбором и построением дерева ссылок в базах 1С 8.1-8.3 УТ 10.3./11, БП 2/3, ЗУП 2.5/3, КА 1.1/2, УНФ 1.6/3.0

Чистка данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 10 1С:Управление торговлей 11 Платные (руб)

Данные обработки помогут Вам легко и, главное быстро, выполнить удаление любых данных в Ваших базах 1С на платформах 8.1-8.3. Обработки помогут легко просмотреть связи ссылок в виде дерева, выбрать что удалять, а что нет, используя любые отборы. Это позволит уменьшить объем лишней и не нужной информации в справочниках и документах, планах видов характеристик и др. объектах и облегчит работу с данными пользователям и Вам. Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. (Обновление от 04.10.2023, версия 4.2)

9600 руб.

22.02.2013    135763    248    144    

418

SALE! 10%

Выборочное удаление организаций из баз (управляемые формы), с удалением всех ссылающихся на эти организации данных

Чистка данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Позволяет удалить организации из любых программ на управляемых формах (БП 3.0, УТ 11, КА 2, ERP 2, ЗУП 3.0, УНФ, Розница 2.0 и пр.). Главное требование - программа должна содержать справочник "Организации". Реализован самый быстрый алгоритм непосредственного удаления объектов. Работает даже на базах большого размера. Для ускорения работы алгоритма не запускается проверка контроля ссылочной целостности. Проверку учета можно запустить отдельно с помощью дополнительной обработки. Необходимо перед удалением самостоятельно проверить базу на наличие перекрестных ссылок разных организаций в одном документе. Эту дополнительную обработку проверки перекрестных ссылок по запросу предоставляем бесплатно нашим покупателям.

3980 3582 руб.

16.03.2015    113536    182    75    

217

Универсальное выборочное удаление данных из базы 1С (любые конфигурации на упр.формах: БП 3.0, УТ 11, КА 2, ERP, УНФ, ЗУП 3, Розница и т.д.)

Чистка данных Платформа 1С v8.3 Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Обработка позволяет удобно выборочно удалить данные из базы 1С. Это могут быть как неиспользуемые элементы справочников, так и неактуальные организации. При этом есть возможность провести анализ пересечений документов с другими организациями и таким образом уберечься от того, что при удалении обороты по другой организации изменятся.

3350 руб.

28.11.2019    24245    45    16    

58

Замена Номенклатуры+Характеристики

Чистка данных Логистика, склад и ТМЦ Платформа 1С v8.3 План видов характеристик 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Настраиваемая обработка, позволяющая заменить пару: Номенклатура+Характеристика в документах, их движениях и независимых регистрах сведений. Без перепроведения. Поможет, если вы по каким-то причинам решили отказаться от характеристик

3600 руб.

04.08.2015    41066    88    70    

49

Очистка дублей в синхронизированных базах (УТ, БП, РТ, УНФ)

Чистка данных Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Решение по удалению дублей позволяет определить связанные элементы в двух синхронизированных базах в качестве оригиналов и избежать необходимости ручного сравнения объектов в базах перед синхронизацией.

3960 руб.

27.06.2018    18782    10    3    

15

Удаление битых ссылок 1С в базе без монопольного режима

Чистка данных Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если в вашей информационной базе крутится очень много данных, или база должна быть доступна 24/7 (как в моем случае), или же вы боитесь запускать тестирование и исправление, НО существует потребность удалить битые ссылки, тогда эта обработка сможет Вам помочь. Обработка выявляет битые ссылки как в самих объектах метаданных, так и в их табличных частях(!), а так же может их удалить.

2400 руб.

23.08.2021    9225    15    3    

20

Очистка регистров сведений от записей по помеченным на удаление элементам

Чистка данных Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

1200 руб.

21.01.2022    7095    5    6    

9

Очистка кэша 1С. Исполнитель

Чистка данных Инструментарий разработчика Платформа 1С v8.3 Абонемент ($m)

Очередная вариативная очистка кэша 1С с помощью Исполнителя 3.0.2.2.

1 стартмани

25.10.2023    4498    4    SerVer1C    25    

22
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ice-net 19 02.05.17 10:07 Сейчас в теме
Почему бы просто не удалить записи с одинаковыми версиями? Зачем оставлять запись без данных?
4. fxmike 69 02.05.17 10:24 Сейчас в теме
(1) я написал выше, что для документов мне важен факт перезаписи. Если пользователь перепровел документ, то движения документа могут измениться даже если пользователь не внес никаких изменений, так как изменилась учетная политика или настройки программы. Мне нужна запись о том когда это было сделано.
2. ice-net 19 02.05.17 10:08 Сейчас в теме
и перед записью новой версии проверять изменился объект или нет.
5. fxmike 69 02.05.17 10:26 Сейчас в теме
(2) Если перезаписывать тысячу объектов, то мы получаем накладные расходы на тысячу сравнений с прошлыми версиями. Я не хочу падения производительности на записи. Пусть отрабатывает регламент тогда, когда это никто не видит.
3. Infector 199 02.05.17 10:20 Сейчас в теме
На уровне SQL Версии уже сжаты, но на уровне выгрузки в DT это беда-печаль. У себя решили путем переноса содержимого Регистра в базу-архив, где регистр имеет аналогичную рабочей базе конфигурацию
6. fxmike 69 02.05.17 10:28 Сейчас в теме
(3) тоже хорошее решение, как обращаетесь из рабочей базы в базу архив?
8. Infector 199 02.05.17 11:15 Сейчас в теме
(6)COM-Соединение. Сбором - переносом версий заведует регламентное задание в базе-архиве. А из основной в случае необходимости можно подключиться для просмотра в отчете/восстановления
7. fxmike 69 02.05.17 10:43 Сейчас в теме
(3) Как вариант, можно сделать отдельную базу с простой структурой регистра, в которой вместо ссылочного поля будет строка идентификатора объекта (чтобы не зависеть от структуры основной конфигурации). Вытягивать информацию можно веб-сервисом. Записывать тоже,регламентным заданием.
9. Константин С. 664 02.05.17 11:36 Сейчас в теме
Самое первое что надо сделать: Определить актуальность данных, глубина хранения данных. В большей части прошлогодние данные уже не нужны, вот их удалять)
10. lrs 27 11.05.17 13:09 Сейчас в теме
Реквизиты с наименованием УдалитьЧтоТо разработчик подготавливает к физическому удалению. Надо быть готовым, что реквизит УдалитьСжато в одной из очередных редакций может исчезнуть...
sstas007; +1 Ответить
Оставьте свое сообщение