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

161

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

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

9600 руб.

22.02.2013    140137    270    146    

440

Чистка данных Системный администратор Программист Платформа 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    215373    223    82    

258

Чистка данных Программист Пользователь Платформа 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    27024    71    18    

85

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

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

2400 руб.

09.04.2019    29673    47    15    

48

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

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

3960 руб.

27.06.2018    19536    12    3    

17

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

Универсальный инструмент для очистки базы. Работает как на конфигурациях на основе БСП, так и самописных. Позволяет выбрать данные, отобразить форму списка, увидеть структуру метаданных, очистить базу применяя при необходимости условия. Удаление производится по выбранным элементам в таблице значений. Наложение условий позволяет удалить документы по выбранной организации.

1 стартмани

25.12.2023    9413    208    WeterSoft    5    

15

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

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

1 стартмани

25.10.2023    5927    6    SerVer1C    27    

25
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 205 02.05.17 10:20 Сейчас в теме
На уровне SQL Версии уже сжаты, но на уровне выгрузки в DT это беда-печаль. У себя решили путем переноса содержимого Регистра в базу-архив, где регистр имеет аналогичную рабочей базе конфигурацию
6. fxmike 80 02.05.17 10:28 Сейчас в теме
(3) тоже хорошее решение, как обращаетесь из рабочей базы в базу архив?
8. Infector 205 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 Ответить
Оставьте свое сообщение