Как быстро удалить 500 000 документов в файловой базе 1С?

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

Работа с большими объемами данных в файловом варианте 1С:Предприятие 8 часто сопряжена с деградацией производительности. Когда количество записей в одной таблице превышает критическую отметку (в нашем случае — 500-700 тысяч документов), простые запросы начинают выполняться недопустимо долго. Ситуация осложняется, если база работает в режиме 24/7 и технологическое окно для обслуживания составляет не более часа. Рассмотрим эффективные стратегии решения этой задачи, проанализируем их плюсы и риски.

Метод 1. Манипуляция с метаданными (самый быстрый способ)

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

  1. Создание резервной копии. Это обязательный этап перед любыми массовыми операциями.
  2. Выгрузка нужных данных. Используем обработку «Выгрузка загрузка данных XML» или «Универсальный обмен данными». Выгружаем те 50 000 документов, которые необходимо оставить в базе.
  3. Удаление объекта из конфигурации. В Конфигураторе находим нужный документ и удаляем его из дерева метаданных. При обновлении конфигурации базы данных (клавиша F7) платформа физически удалит соответствующие таблицы в файле 1Cv8.1CD. Это происходит практически мгновенно.
  4. Возврат объекта. Снова создаем документ с тем же именем и структурой реквизитов (лучше заранее сохранить копию конфигурации в файл .cf и сравнить/объединить). Снова обновляем базу.
  5. Загрузка данных. Загружаем ранее выгруженные 50 000 документов.

Преимущество: Это единственный метод, гарантирующий очистку места и пересчет индексов за минимальное время, так как 1С не «перебирает» записи, а просто удаляет файл/таблицу на уровне операционной системы.

Метод 2. Использование MS SQL или PostgreSQL в качестве промежуточного звена

Если у вас есть возможность кратковременно остановить базу, можно воспользоваться мощью SQL-запросов. Выясним причину, почему это быстрее: в файловом варианте удаление каждой записи сопровождается блокировками и обновлением индексов, тогда как в SQL существует команда TRUNCATE.

Рассмотрим алгоритм действий:

  1. Выгружаем файловую базу в формат .dt.
  2. Разворачиваем базу на сервере (MS SQL или PostgreSQL).
  3. Используем консоль управления СУБД для очистки нужных таблиц. Для этого нужно определить имя таблицы документа (например, _Document150).
  4. Выполняем команду:
    
    TRUNCATE TABLE _Document150;
    TRUNCATE TABLE _Document150_VT_TabPart1; -- если есть табличные части
    
  5. После очистки выгружаем нужные документы обратно (если мы их сохранили) или удаляем записи избирательно через DELETE FROM ... WHERE ....
  6. Загружаем .dt обратно в файловый вариант.

Проанализируем ситуацию: этот метод требует наличия установленного сервера SQL, но позволяет выполнить операцию очистки за считанные минуты, не тратя часы на перебор объектов через встроенный язык 1С.

Метод 3. Программное удаление с оптимизацией (без контроля ссылок)

Если вы решили использовать стандартные средства 1С, необходимо максимально ускорить код. Посмотрим на пример оптимизированного кода удаления:


Выборка = Документы.ПростойДокумент.Выбрать(ДатаНачала, ДатаОкончания);
Пока Выборка.Следующий() Цикл
    Объект = Выборка.ПолучитьОбъект();
    Объект.ОбменДанными.Загрузка = Истина; // Отключаем проверки и подписки
    Объект.Удалить(); // Используем непосредственное удаление
КонецЦикла;

Важные моменты для оптимизации:

Метод 4. Фоновое удаление частями (без остановки системы)

Если работа в киоске или магазине не может быть прервана даже на 40 минут, используем стратегию «поедания слона по кусочкам». Мы можем настроить регламентное задание, которое будет работать в «волчий час» (минимальная активность).

Разберем логику фонового процесса:

  1. Создаем регистр сведений ОчередьНаУдаление, куда помещаем ссылки на 500 000 старых документов.
  2. Настраиваем фоновое задание, которое каждые 10 минут выбирает 100-200 ссылок из регистра и удаляет их методом Удалить().
  3. После удаления ссылка убирается из регистра.

Такой подход позволяет полностью избежать блокировок основной работы пользователей. Процесс займет несколько дней, но база будет очищаться «незаметно» для персонала.

Технические нюансы обслуживания после удаления

Просто удалить записи недостаточно. В файловой базе 1С место в файле .1CD не освобождается автоматически после удаления объектов — оно просто помечается как свободное для будущих записей. Чтобы получить реальное ускорение и уменьшить размер файла, выполним следующие действия:

  1. Сжатие таблиц: После удаления запустите «Тестирование и исправление» с флагом «Сжатие таблиц». Если времени мало, используйте утилиту chdbfl.exe (в папке bin платформы) с установленным флагом исправления ошибок. Она часто работает быстрее штатного ТиИ.
  2. Пересчет индексов: Удаление 80% данных делает текущие индексы фрагментированными. Обязательно выполните реиндексацию таблиц для восстановления скорости поиска.
  3. Регистры накопления: Проанализируйте ситуацию с регистрами. Если ваш документ делает движения, их нужно очистить в первую очередь, отключив итоги. В вашем случае документ «простой», поэтому этот шаг можно пропустить.

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

← На главную