Как быстро очистить огромный регистр Версии объектов в файловой базе 1С

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

Регистр сведений ВерсииОбъектов часто становится самым «тяжелым» местом в базе данных 1С. При активной работе пользователей количество записей в нем может исчисляться миллионами, а объем — гигабайтами. В файловых базах это создает критическую проблему: при достижении размера одной таблицы в 4 ГБ работа системы может полностью заблокироваться. При этом стандартные способы удаления или простые запросы часто приводят к зависанию конфигурации из-за нехватки оперативной памяти или долгого перестроения индексов.

В этой статье мы разберем, как оперативно и безопасно очистить этот регистр до определенной даты, сохранив работоспособность системы.

Почему обычное удаление не работает

Проанализируем ситуацию: когда регистр «раздут», попытка выполнить запрос ВЫБРАТЬ * или просто посчитать количество записей через КОЛИЧЕСТВО(*) с использованием ссылок на объекты заставляет платформу считывать огромный объем данных в память. В файловом варианте .1CD это приводит к «смерти» процесса 1С.

Также важно понимать структуру регистра: данные самих версий (сжатые XML-копии) часто хранятся отдельно, и простое «затирание» записей может быть недостаточно эффективным без учета ссылочной целостности. Однако для быстрой очистки «хвостов» истории за прошлые годы наиболее действенным является метод порционного удаления через МенеджерЗаписи.

Шаг 1. Безопасный подсчет записей

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


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|   КОЛИЧЕСТВО(*) КАК Кол
|ИЗ
|   РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
|ГДЕ
|   ВерсииОбъектов.ДатаВерсии <= &НачПериода";

Запрос.УстановитьПараметр("НачПериода", НачалоДня(ДатаОчистки));
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
    Сообщить("Записей к удалению: " + РезультатЗапроса.Кол);
КонецЕсли;

Шаг 2. Алгоритм быстрого удаления порциями

Для оперативного удаления (например, 1 миллион записей за 50–60 минут) лучше всего использовать цикл с ограничением выборки. Мы будем выбирать первые 10 000 записей, удалять их по одной через менеджер записи и повторять процесс, пока данные не закончатся. Это позволяет не перегружать оперативную память и не блокировать базу намертво.

Разберем программный код для этой задачи:


ЕстьЗаписи = Истина;
НомерЦикла = 0;

Пока ЕстьЗаписи Цикл
    НомерЦикла = НомерЦикла + 1;
    Сообщить("Начало цикла № " + НомерЦикла + " в " + ТекущаяДата());
    
    Запрос = Новый Запрос;
    // Используем ПЕРВЫЕ 10000 для порционной обработки
    Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 10000 
    |   ВерсииОбъектов.Объект КАК Объект,
    |   ВерсииОбъектов.НомерВерсии КАК НомерВерсии
    |ИЗ
    |   РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    |   ВерсииОбъектов.ДатаВерсии < &НачПериода";
    
    Запрос.УстановитьПараметр("НачПериода", НачалоДня(ДатаОчистки));
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Количество() = 0 Тогда
        ЕстьЗаписи = Ложь;
    Иначе
        Пока Выборка.Следующий() Цикл
            // Используем МенеджерЗаписи для удаления конкретной записи
            МЗ = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
            ЗаполнитьЗначенияСвойств(МЗ, Выборка);
            МЗ.Удалить();
        КонецЦикла;
    КонецЕсли;
    
    Сообщить("Конец цикла № " + НомерЦикла + " в " + ТекущаяДата());
КонецЦикла;

Важное замечание: использование МЗ.Удалить() в цикле является наиболее безопасным методом для файловой базы, так как каждая операция выполняется быстро и не вызывает разрастания лога транзакций до критических размеров.

Шаг 3. Обязательные действия после удаления

Особенности файловых баз 1С заключаются в том, что после удаления данных физический размер файла .1CD не уменьшается автоматически. В нем остаются «пустоты», которые платформа будет использовать для новых записей, но место на диске не освободится.

Чтобы реально уменьшить размер базы и ускорить ее работу после массовой чистки, необходимо выполнить Сжатие таблиц. Для этого:

  1. Запустите информационную базу в режиме Конфигуратор.
  2. Перейдите в меню Администрирование — Тестирование и исправление...
  3. Выберите пункт Сжатие таблиц информационной базы.
  4. Нажмите «Выполнить».

Это перестроит индексы и физически удалит помеченные на удаление записи из файла базы данных.

Как предотвратить проблему в будущем

Чтобы регистр снова не раздулся до гигантских размеров, проанализируем настройки версионирования. В типовых конфигурациях (КА, БП, УПП) можно настроить регламентное задание по очистке версий. Посмотрим на основные рекомендации:

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

← На главную