Задача полной очистки базы данных от документов при сохранении справочников часто возникает при подготовке базы к новому финансовому году, свертке или исправлении критических ошибок учета. Стандартные методы могут работать крайне медленно, особенно если документов сотни тысяч или миллионы. В этой статье мы подробно разберем, как ускорить этот процесс, какие программные механизмы задействовать и каких ошибок следует избегать.
Прежде чем перейти к коду, давайте проанализируем ситуацию и выясним, почему стандартное удаление занимает так много времени. Каждый раз, когда мы вызываем метод Удалить() или УстановитьПометкуУдаления(), платформа 1С выполняет целый ряд действий:
Когда документов много, эти операции создают колоссальную нагрузку на дисковую подсистему и процессор. Наша цель — минимизировать эти накладные расходы.
Это самый гибкий способ, позволяющий очистить базу без создания новой. Основной секрет скорости здесь заключается в свойстве ОбменДанными.Загрузка = Истина. Этот флаг отключает большинство проверок и обработчиков событий, прописанных в конфигурации.
Рассмотрим правильный алгоритм удаления. Обратите внимание на цикл: мы начинаем с индекса 0, чтобы не пропустить первый вид документа в метаданных.
Для Инд = 0 по Метаданные.Документы.Количество() - 1 Цикл
ДокМетаданные = Метаданные.Документы.Получить(Инд);
ИмяДокумента = ДокМетаданные.Имя;
ВсегоУдалено = 0;
НачатьТранзакцию();
Счетчик = 0;
Выборка = Документы[ИмяДокумента].Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
// Устанавливаем режим загрузки для ускорения
Объект.ОбменДанными.Загрузка = Истина;
// Выбираем действие: непосредственное удаление или пометка
// Для полной очистки лучше Удалить(), так как не нужно потом чистить корзину
Объект.Удалить();
ВсегоУдалено = ВсегоУдалено + 1;
Счетчик = Счетчик + 1;
// Фиксируем транзакцию порциями, чтобы не переполнить лог
Если Счетчик >= 1000 Тогда
ЗафиксироватьТранзакцию();
Состояние("Удаление: " + ИмяДокумента + " (" + ВсегоУдалено + ")");
НачатьТранзакцию();
Счетчик = 0;
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Если ВсегоУдалено > 0 Тогда
Сообщить("Удалено документов '" + ИмяДокумента + "': " + ВсегоУдалено);
КонецЕсли;
КонецЦикла;
Проанализируем еще один важный момент: пересчет итогов. Если вы удаляете документы за несколько лет, 1С будет постоянно пытаться актуализировать остатки на конец каждого месяца. Чтобы этого избежать, перед запуском процесса удаления рекомендуется выполнить следующие шаги:
Ложь. Это предотвратит их обновление при удалении записей.ПолнотекстовыйПоиск.УстановитьИспользованиеПоиска(Ложь).Если документов слишком много (миллионы), иногда быстрее будет не удалять их, а перенести всё остальное в новую базу. Рассмотрим этот процесс по шагам:
.cf файла (конфигурации).Важно: Этот метод требует внимательности к настройкам прав доступа и торгового оборудования, которые могут храниться вне справочников (например, в реестре или специальных файлах).
Рассмотрим продвинутый метод, который предложили опытные специалисты на форуме. Если база файловая или вы имеете полный доступ к разработке, можно пойти на хитрость:
.cf обратно.Если ваша база работает на MS SQL Server или PostgreSQL, обратите внимание на настройки СУБД:
Модель восстановления: Перед массовым удалением переведите базу данных в модель восстановления Simple. В модели Full файл лога транзакций (.ldf) мгновенно вырастет до огромных размеров, что может привести к остановке сервера из-за нехватки места.
Сжатие базы (Shrink): После удаления миллионов записей физический размер файлов базы не уменьшится автоматически. Вам потребуется выполнить команду SHRINKDATABASE в консоли SQL или запустить процедуру сжатия таблиц через конфигуратор (Тестирование и исправление).
Мы проанализировали различные подходы к очистке базы данных. Для небольших баз идеально подходит программный скрипт с использованием ОбменДанными.Загрузка = Истина и транзакциями. Для огромных баз эффективнее будет либо метод переноса данных в чистую базу, либо временное отключение движений в конфигураторе. Помните, что любые манипуляции с массовым удалением данных должны начинаться с создания архивной копии!