Как ускорить удаление огромного количества объектов после свертки базы 1С

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

Свертка базы данных в 1С:Управление торговлей 11 — это процедура, которая часто преподносится как панацея от «тормозов» системы. Однако на практике администраторы сталкиваются с серьезной проблемой: после формирования документов ввода остатков в базе остается огромное количество помеченных на удаление объектов. Когда счет идет на сотни тысяч (в нашем случае — 600 000 объектов), штатная обработка «Удаление помеченных объектов» может работать сутками, создавая колоссальную нагрузку на сервер и блокируя работу пользователей. Рассмотрим, почему это происходит и как эффективно очистить базу.

Почему стандартное удаление работает так медленно?

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

Проанализируем ситуацию: часто из 100 000 обработанных объектов удается удалить лишь 20%. Остальные блокируются «невидимыми» ссылками. Выясним причины, по которым объекты «не уходят»:

  1. Версионирование объектов: Если в базе включена история изменений, ссылки на старые документы хранятся в регистре сведений ВерсииОбъектов. Пока эти записи существуют, документ не будет удален.
  2. Присоединенные файлы: Скан-копии, макеты и другие файлы, привязанные к документам, сами являются объектами. Их нужно помечать на удаление вместе с «родителями».
  3. Связи в актах сверки и взаиморасчетах: Часто в табличных частях документов (например, Актах сверки) хранятся ссылки на первичные документы. Даже если период закрыт, ссылка удерживает объект.
  4. Независимые регистры сведений: Ссылки могут «застревать» в регистрах соответствия при обменах или в задачах бизнес-процессов.

Стратегия 1: Оптимизация процесса на стороне сервера (SQL)

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

Перевод модели восстановления в Simple: Если ваша база работает на MS SQL Server, на время удаления обязательно переключите модель восстановления (Recovery Model) базы данных в состояние Simple. Это предотвратит бесконтрольный рост файла лога транзакций (.LDF), который может занять все свободное место на диске при обработке сотен тысяч записей.

Отключение полнотекстового поиска: Проанализируем нагрузку: 1С пытается обновлять индекс полнотекстового поиска при каждом удалении. Перед процедурой его следует отключить в разделе Администрирование — Поддержка и обслуживание — Управление полнотекстовым поиском. После завершения всех работ индекс нужно будет перестроить заново.

Стратегия 2: Порционное удаление и использование «Инструментов разработчика»

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

Использование сторонних инструментов (ИР): Посмотрим на «Инструменты разработчика» (ИР) Сергея Старых. Это мощнейший комплекс, который позволяет визуализировать дерево ссылок. Вы сможете увидеть, какой именно регистр или документ мешает удалению целой пачки объектов, и прямо там же «разорвать» связь (очистить реквизит или удалить запись регистра).

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


Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
    Если Выборка.ПометкаУдаления Тогда
        Объект = Выборка.ПолучитьОбъект();
        Попытка
            Объект.Удалить(); // Прямое удаление без контроля ссылок (ОПАСНО!)
            Счетчик = Счетчик + 1;
        Исключение
            ЗаписьЖурналаРегистрации("Ошибка удаления",,,, ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Если Счетчик % 1000 = 0 Тогда
        // Здесь можно зафиксировать транзакцию или просто сделать паузу
    КонецЕсли;
КонецЦикла;

Важное предостережение: Метод Объект.Удалить() физически стирает запись. Если на объект были ссылки, вы получите ошибку «Объект не найден» в интерфейсе. Пользуйтесь этим методом только в том случае, если вы уверены, что все движения по регистрам уже очищены сверткой.

Стратегия 3: Радикальный метод — перенос в новую базу

Иногда проще «сжечь и построить заново», чем чистить старое. Рассмотрим по шагам метод создания чистой базы с остатками:

  1. Создадим пустую информационную базу той же конфигурации.
  2. Воспользуемся обработкой «Выгрузка и загрузка данных XML» (она входит в состав инструментов разработчика от 1С).
  3. Выгрузим из старой базы: все константы, все справочники и только документы ввода остатков, созданные сверткой.
  4. При выгрузке установим флаг «Выгружать объекты по ссылкам». Система сама подтянет только ту номенклатуру и тех контрагентов, которые реально фигурируют в остатках.

Этот метод позволяет получить базу, в которой физически нет старого «мусора», а справочники содержат только актуальные элементы. Весь неиспользуемый архив останется в старой базе, к которой можно обращаться при необходимости.

Действия после удаления объектов

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

Для SQL-баз: Выполним процедуру Shrink (сжатие) базы данных средствами SQL Server Management Studio. Также крайне важно выполнить Rebuild или Reorganize индексов, так как массовое удаление приводит к их сильной фрагментации, что может замедлить работу системы сильнее, чем наличие лишних данных.

Для файловых баз: Обязательно запустим Тестирование и исправление с установленной галочкой «Сжатие таблиц информационной базы». Это единственный способ физически вернуть место на диске.

Итоговая рекомендация: Если база критически важна и «битые ссылки» недопустимы — используйте порционное удаление через стандартные механизмы БСП (режим «Удалять порциями»). Если же база требует немедленного ускорения и старые данные не представляют ценности — перенос остатков в новую ИБ будет самым быстрым и чистым решением.

← На главную