Работа с большими объемами данных в файловом варианте 1С:Предприятие 8 часто сопряжена с деградацией производительности. Когда количество записей в одной таблице превышает критическую отметку (в нашем случае — 500-700 тысяч документов), простые запросы начинают выполняться недопустимо долго. Ситуация осложняется, если база работает в режиме 24/7 и технологическое окно для обслуживания составляет не более часа. Рассмотрим эффективные стратегии решения этой задачи, проанализируем их плюсы и риски.
Если документ является «простым», то есть не имеет движений по регистрам и на него не ссылаются другие объекты (или ссылки не критичны), самым быстрым способом будет физическое уничтожение таблицы документа платформой. Разберем этот процесс по шагам:
F7) платформа физически удалит соответствующие таблицы в файле 1Cv8.1CD. Это происходит практически мгновенно..cf и сравнить/объединить). Снова обновляем базу.Преимущество: Это единственный метод, гарантирующий очистку места и пересчет индексов за минимальное время, так как 1С не «перебирает» записи, а просто удаляет файл/таблицу на уровне операционной системы.
Если у вас есть возможность кратковременно остановить базу, можно воспользоваться мощью SQL-запросов. Выясним причину, почему это быстрее: в файловом варианте удаление каждой записи сопровождается блокировками и обновлением индексов, тогда как в SQL существует команда TRUNCATE.
Рассмотрим алгоритм действий:
.dt._Document150).
TRUNCATE TABLE _Document150;
TRUNCATE TABLE _Document150_VT_TabPart1; -- если есть табличные части
DELETE FROM ... WHERE .....dt обратно в файловый вариант.Проанализируем ситуацию: этот метод требует наличия установленного сервера SQL, но позволяет выполнить операцию очистки за считанные минуты, не тратя часы на перебор объектов через встроенный язык 1С.
Если вы решили использовать стандартные средства 1С, необходимо максимально ускорить код. Посмотрим на пример оптимизированного кода удаления:
Выборка = Документы.ПростойДокумент.Выбрать(ДатаНачала, ДатаОкончания);
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
Объект.ОбменДанными.Загрузка = Истина; // Отключаем проверки и подписки
Объект.Удалить(); // Используем непосредственное удаление
КонецЦикла;
Важные моменты для оптимизации:
Удалить(), а не УстановитьПометкуУдаления(). Пометка удаления лишь меняет статус записи, но не уменьшает размер базы.Если работа в киоске или магазине не может быть прервана даже на 40 минут, используем стратегию «поедания слона по кусочкам». Мы можем настроить регламентное задание, которое будет работать в «волчий час» (минимальная активность).
Разберем логику фонового процесса:
ОчередьНаУдаление, куда помещаем ссылки на 500 000 старых документов.Удалить().Такой подход позволяет полностью избежать блокировок основной работы пользователей. Процесс займет несколько дней, но база будет очищаться «незаметно» для персонала.
Просто удалить записи недостаточно. В файловой базе 1С место в файле .1CD не освобождается автоматически после удаления объектов — оно просто помечается как свободное для будущих записей. Чтобы получить реальное ускорение и уменьшить размер файла, выполним следующие действия:
chdbfl.exe (в папке bin платформы) с установленным флагом исправления ошибок. Она часто работает быстрее штатного ТиИ.Итоговая рекомендация: Для быстрого результата (в пределах 60 минут) оптимально использовать комбинацию выгрузки нужных данных в .xml, удаления объекта метаданных и последующей обратной загрузки. Это гарантированно «обнулит» физические таблицы и перестроит структуру базы самым быстрым из возможных способов.