При работе с крупными базами данных 1С, особенно когда в одной конфигурации 1С:Бухгалтерия 3.0 ведется учет по нескольким организациям за много лет, часто возникает задача «выкусить» одну фирму и передать ее на аудит или перенести в отдельную базу. Если объем данных превышает 10-12 Гб, стандартные механизмы удаления помеченных объектов могут работать крайне медленно или вызывать зависание системы. Разберем по шагам, как решить эту задачу эффективно, используя возможности платформы и настройки MS SQL Server.
Самый быстрый и надежный способ оставить в базе только одну организацию — это использование механизма Распределенных Информационных Баз (РИБ) с фильтрацией по организации. Вместо того чтобы удалять 75% данных из существующей базы, мы создадим новую «чистую» базу, куда переедут данные только по одному юридическому лицу. Проанализируем этот процесс подробнее:
ПоОрганизации. Нам необходимо создать новый узел этого плана обмена и в настройках фильтра указать именно ту организацию, которую мы хотим оставить.ПланыОбмена.УстановитьГлавныйУзел(Неопределено).Важный момент: При использовании РИБ справочники (например, Номенклатура или Контрагенты), которые не имеют реквизита «Организация», могут переехать целиком. Их придется очищать позже поиском неиспользуемых ссылок, но это значительно быстрее, чем удалять миллионы документов.
Если вы все же решили удалять данные непосредственно в рабочей базе, необходимо подготовить СУБД к колоссальной нагрузке на логи транзакций. Проанализируем настройки SQL, которые помогут избежать «зависаний»:
1. Модель восстановления (Recovery Model): Перед началом удаления обязательно установите модель восстановления базы данных в состояние Simple (Простая). В противном случае файл лога транзакций (.ldf) мгновенно разрастется до размеров, превышающих саму базу, и компьютер зависнет из-за отсутствия места на диске.
2. Отключение итогов: Посмотрим на причину тормозов со стороны платформы 1С. При удалении каждого документа система пытается пересчитать итоги в регистрах бухгалтерии и накопления. Чтобы ускорить процесс в десятки раз, необходимо программно отключить использование итогов для всех регистров:
// Пример отключения итогов для регистра бухгалтерии
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);
// Аналогично для всех крупных регистров накопления
3. Полнотекстовый поиск: Обязательно отключите полнотекстовый поиск данных в администрировании. 1С тратит огромные ресурсы на обновление индексов поиска при удалении каждой записи.
После того как лишние организации удалены (или вы работаете в базе с одной фирмой), часто требуется выполнить свертку, например, оставить только данные с 2018 года. Рассмотрим последовательность действий:
Используйте стандартную обработку Свертка информационной базы. Она создаст документы ВводОстатков на начало выбранного периода и пометит старые документы на удаление. Однако помните, что пометка на удаление — это только половина дела. Самая тяжелая операция — физическое удаление (Zapping).
Никогда не запускайте удаление всех помеченных объектов сразу, если их больше 100 000. Система будет пытаться проверить ссылочную целостность в рамках одной транзакции, что приведет к блокировке таблиц и переполнению памяти. Выясним, как правильно организовать этот процесс:
ОбменДанными.Загрузка = Истина. Это позволит удалять объекты без запуска лишних проверок в подписках на события.
// Фрагмент кода для быстрого удаления без проверок
Объект = СсылкаНаОбъект.ПолучитьОбъект();
Объект.ОбменДанными.Загрузка = Истина;
Попытка
Объект.Удалить();
Исключение
Сообщить("Не удалось удалить: " + ОписаниеОшибки());
КонецПопытки;
Посмотрим на ситуацию, описанную многими пользователями: документы ОперацияБух (ручные проводки) часто не удаляются стандартными средствами. Это происходит из-за того, что они имеют прямые записи в регистре бухгалтерии Хозрасчетный. Перед их удалением рекомендуется сначала очистить движения этих документов программно, а уже затем удалять сами заголовки документов.
После того как все лишние данные удалены, база на диске (в SQL) не уменьшится автоматически. SQL просто пометит место внутри файла .mdf как свободное. Чтобы вернуть место операционной системе, необходимо выполнить операцию Shrink Database (Сжатие базы) в SQL Management Studio. Также крайне желательно выполнить Тестирование и исправление (ТиИ) с реиндексацией таблиц и обновлением статистики, так как после массового удаления индексы будут сильно фрагментированы.
Подведем итог: для базы в 12 Гб оптимальным путем будет создание РИБ по организации, последующая типовая свертка периода в новой базе и финальное сжатие (Shrink) на уровне SQL Server. Весь процесс при правильном подходе займет около 10–15 часов работы сервера, вместо бесконечных «зависаний» при попытке штатного удаления.