Сокращение размера регистра "Версии объектов" в УПП 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    136470    249    144    

418

Универсальное выборочное удаление данных из базы 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    24555    49    16    

62

SALE! 10%

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

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

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

3980 3582 руб.

16.03.2015    114261    183    77    

219

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

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

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

3600 руб.

04.08.2015    41315    89    70    

50

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

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

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

2400 руб.

23.08.2021    9332    15    3    

20

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

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

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

1200 руб.

21.01.2022    7210    5    6    

9

Удаление проводок удаленного документа

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

Такое бывает? Удалили документ, а проводки (движения) остались? Эта простая обработка решает данную проблему.. почему по проводкам? да потому что обычно такие вещи замечают именно бухгалтера.на самом же деле данная обработка при нахождении документа удаленного или помеченного на удаление и имеющего движения очищает все движения без исключений.

1200 руб.

06.02.2012    35738    361    30    

30

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

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

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

1 стартмани

25.10.2023    4689    4    SerVer1C    26    

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