Свертка базы данных — это процедура, к которой прибегают для уменьшения объема информационной базы и повышения скорости ее работы. Однако на практике многие специалисты сталкиваются с тем, что после завершения этапа формирования остатков наступает этап удаления старых документов, который может длиться днями или вовсе завершаться аварийно. В этой статье мы подробно разберем, почему стандартные средства 1С не справляются с большими объемами данных и какими методами можно эффективно очистить базу от «мусора».
Прежде чем приступать к радикальным мерам, давайте проанализируем, почему стандартная обработка УдалениеПомеченныхОбъектов в 1С:Бухгалтерия 3.0 работает медленно. Основная нагрузка ложится не на само физическое удаление записи из таблицы, а на контроль ссылочной целостности. Платформа должна проверить каждый объект, который вы хотите удалить, на наличие ссылок в других таблицах базы данных. Если вы удаляете 200 000 документов, 1С выполняет миллионы запросов к различным регистрам и справочникам.
Вторым фактором является рост лога транзакций SQL. При массовом удалении в одной транзакции файл LDF может разрастись до критических размеров, что приведет к переполнению диска и остановке работы сервера. Также не стоит забывать про полнотекстовый поиск: если он включен, каждое удаление инициирует обновление поискового индекса, что колоссально замедляет процесс.
Если документов слишком много, стандартная обработка может «вылететь» по нехватке памяти. В этом случае мы рекомендуем использовать методику удаления данных малыми порциями. Рассмотрим, как это реализовать программно или с помощью ручных настроек.
Разберем алгоритм работы собственной обработки для порционного удаления. Основная идея заключается в том, чтобы удалять объекты не все сразу, а пачками по 500–1000 штук, фиксируя транзакцию после каждой порции. Посмотрим на пример кода:
// Пример упрощенного алгоритма порционного удаления
Процедура УдалитьОбъектыПорциями(МассивОбъектов)
Порция = Новый Массив;
Счетчик = 0;
Для Каждого Ссылка Из МассивОбъектов Цикл
Порция.Добавить(Ссылка);
Счетчик = Счетчик + 1;
// Каждые 500 объектов фиксируем результат
Если Счетчик % 500 = 0 Тогда
УдалитьОбъекты(Порция, Истина); // Истина - включаем проверку ссылок
Порция.Очистить();
КонецЕсли;
КонецЦикла;
// Удаляем остаток
Если Порция.Количество() > 0 Тогда
УдалитьОбъекты(Порция, Истина);
КонецЕсли;
КонецПроцедуры
Важный нюанс: при таком подходе в первую очередь следует удалять подчиненные документы и документы-основания, а затем переходить к более «тяжелым» объектам. В 1С:Бухгалтерия 3.0 рекомендуется сначала настроить отбор в стандартном окне удаления (через Администрирование — Обслуживание — Удаление помеченных объектов) по конкретным видам документов, например, начать с «Реализаций» или «Счетов», а не запускать удаление всего массива сразу.
Профессиональное сообщество часто использует сторонние инструменты, такие как «Инструментальные разработки» (ИР). Эта библиотека содержит продвинутую обработку Удаление объектов, которая работает значительно быстрее штатной. Рассмотрим основные преимущества этого метода:
Проанализируем ситуацию: если база 15 ГБ «висит» более 3-х дней при попытке удаления, это часто свидетельствует о наличии огромного количества «хвостов» и битых связей. В таких случаях специалисты рекомендуют альтернативный путь — не удалять старое, а перенести нужное в чистое место.
Рассмотрим шаги этого процесса:
ВыгрузкаЗагрузкаДанныхXML.epf (с диска ИТС) или стандартный механизм обмена в формате EnterpriseData.Почему это лучше? В новую базу не попадет ни одна лишняя запись из прошлого. Вам не придется тратить недели на удаление объектов, контроль ссылок и сжатие таблиц SQL. Размер новой базы будет в разы меньше, а работать она будет значительно быстрее.
Если вы все же решили удалять объекты в текущей базе, выполните следующие предварительные действия, чтобы ускорить процесс:
УправлениеИтогами. Это избавит систему от необходимости пересчитывать итоги при каждом удалении регистратора.СведенияОВерсияхОбъектов. Часто он занимает до 50% объема всей базы. Удаление версий старых объектов само по себе значительно уменьшит базу.Simple. Это предотвратит бесконечный рост лога транзакций во время массовой очистки.Выясним причину, по которой возникло желание сделать свертку. Объем 15 ГБ для современной 1С:Бухгалтерии 3.0 на платформе 8.3 считается небольшим. Если цель свертки — только ускорение работы, то, возможно, стоит рассмотреть другие варианты:
Помните, что свертка «убивает» возможность автоматического формирования сопоставимых данных в бухгалтерском балансе за предыдущие периоды (три колонки в отчетности), и эти данные бухгалтерам придется вносить вручную. Поэтому проводите свертку только тогда, когда это действительно методологически необходимо.
Резюмируя: если вы столкнулись с невозможностью удаления объектов штатными средствами, не пытайтесь «продавить» систему. Используйте либо порционное удаление через скрипты, либо профессиональные инструменты разработчика. Но самым надежным и быстрым способом получить чистую и легкую базу остается перенос остатков в новую пустую конфигурацию.