Свертка базы данных в 1С:Управление торговлей 11 — это процедура, которая часто преподносится как панацея от «тормозов» системы. Однако на практике администраторы сталкиваются с серьезной проблемой: после формирования документов ввода остатков в базе остается огромное количество помеченных на удаление объектов. Когда счет идет на сотни тысяч (в нашем случае — 600 000 объектов), штатная обработка «Удаление помеченных объектов» может работать сутками, создавая колоссальную нагрузку на сервер и блокируя работу пользователей. Рассмотрим, почему это происходит и как эффективно очистить базу.
Разберем основные причины низкой производительности штатных механизмов. Главная проблема заключается в контроле ссылочной целостности. Перед удалением каждого объекта система обязана проверить всю базу данных на наличие ссылок на этот объект. Если вы удаляете 600 тысяч документов, 1С выполняет миллиарды поисковых запросов в таблицах базы.
Проанализируем ситуацию: часто из 100 000 обработанных объектов удается удалить лишь 20%. Остальные блокируются «невидимыми» ссылками. Выясним причины, по которым объекты «не уходят»:
ВерсииОбъектов. Пока эти записи существуют, документ не будет удален.Прежде чем приступать к массовому удалению, необходимо подготовить техническую инфраструктуру, иначе вы рискуете переполнить лог транзакций или «подвесить» всю систему. Рассмотрим необходимые шаги:
Перевод модели восстановления в Simple: Если ваша база работает на MS SQL Server, на время удаления обязательно переключите модель восстановления (Recovery Model) базы данных в состояние Simple. Это предотвратит бесконтрольный рост файла лога транзакций (.LDF), который может занять все свободное место на диске при обработке сотен тысяч записей.
Отключение полнотекстового поиска: Проанализируем нагрузку: 1С пытается обновлять индекс полнотекстового поиска при каждом удалении. Перед процедурой его следует отключить в разделе Администрирование — Поддержка и обслуживание — Управление полнотекстовым поиском. После завершения всех работ индекс нужно будет перестроить заново.
Стандартная обработка часто пытается выполнить слишком много работы в рамках одной транзакции. Разберем альтернативные подходы:
Использование сторонних инструментов (ИР): Посмотрим на «Инструменты разработчика» (ИР) Сергея Старых. Это мощнейший комплекс, который позволяет визуализировать дерево ссылок. Вы сможете увидеть, какой именно регистр или документ мешает удалению целой пачки объектов, и прямо там же «разорвать» связь (очистить реквизит или удалить запись регистра).
Программное удаление порциями: Напишем простую обработку, которая будет выбирать помеченные на удаление объекты и удалять их пачками по 1000 штук. Это позволит избежать длительных блокировок. Пример логики кода для удаления:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
Объект = Выборка.ПолучитьОбъект();
Попытка
Объект.Удалить(); // Прямое удаление без контроля ссылок (ОПАСНО!)
Счетчик = Счетчик + 1;
Исключение
ЗаписьЖурналаРегистрации("Ошибка удаления",,,, ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если Счетчик % 1000 = 0 Тогда
// Здесь можно зафиксировать транзакцию или просто сделать паузу
КонецЕсли;
КонецЦикла;
Важное предостережение: Метод Объект.Удалить() физически стирает запись. Если на объект были ссылки, вы получите ошибку «Объект не найден» в интерфейсе. Пользуйтесь этим методом только в том случае, если вы уверены, что все движения по регистрам уже очищены сверткой.
Иногда проще «сжечь и построить заново», чем чистить старое. Рассмотрим по шагам метод создания чистой базы с остатками:
Этот метод позволяет получить базу, в которой физически нет старого «мусора», а справочники содержат только актуальные элементы. Весь неиспользуемый архив останется в старой базе, к которой можно обращаться при необходимости.
Нужно понимать, что удаление 600 000 строк из таблиц не уменьшает размер файла базы автоматически. После завершения очистки выполним следующие регламентные операции:
Для SQL-баз: Выполним процедуру Shrink (сжатие) базы данных средствами SQL Server Management Studio. Также крайне важно выполнить Rebuild или Reorganize индексов, так как массовое удаление приводит к их сильной фрагментации, что может замедлить работу системы сильнее, чем наличие лишних данных.
Для файловых баз: Обязательно запустим Тестирование и исправление с установленной галочкой «Сжатие таблиц информационной базы». Это единственный способ физически вернуть место на диске.
Итоговая рекомендация: Если база критически важна и «битые ссылки» недопустимы — используйте порционное удаление через стандартные механизмы БСП (режим «Удалять порциями»). Если же база требует немедленного ускорения и старые данные не представляют ценности — перенос остатков в новую ИБ будет самым быстрым и чистым решением.