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

02.05.17

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Сокращение размера регистра "Версии объектов" в УПП 1.3. :
.erf 44,22Kb ver:1.0
6
6 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

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

См. также

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    17105    120    59    

121

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

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

9600 руб.

22.02.2013    139388    265    144    

436

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

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

3582 руб.

16.03.2015    199535    218    82    

252

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

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

3350 руб.

28.11.2019    26567    64    17    

79

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

Если вы начали работать в программном продукте Управление Торговлей, редакция 11 или Комплексная Автоматизация редакция 2 и включили механизм учёта серий, то перейти обратно в учёт без серий будет не так-то просто. Сложность заключается в том, что нужно очистить серии в табличной части документа, например, Реализация Товаров и услуг. Предлагаем алгоритм перехода на учет без серий для программного продукта УТ11. (Очистка серий.)

2400 руб.

09.04.2019    29442    44    15    

46

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

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

1 стартмани

25.10.2023    5695    5    SerVer1C    26    

24

Чистка данных Программист Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Бесплатно (free)

ВАЖНО!!! Очистку регистров накопления и регистров сведений рекомендуется делать пользователям со знанием дела и с осознанием последствий! Обработка поможет быстро очистить выбранный регистр. Делаю данную обработку в первую очередь для себя, т.к. были случаи, когда нужно было очищать регистры, а делать красиво и удобно времени не было.

06.02.2023    22508    1546    Neiron_1C    22    

17

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

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

4 стартмани

07.11.2022    10553    62    sapervodichka    73    

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