Как в 1С 8 быстро удалить все документы: эффективные методы и программные решения

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

Задача полной очистки базы данных от документов при сохранении справочников часто возникает при подготовке базы к новому финансовому году, свертке или исправлении критических ошибок учета. Стандартные методы могут работать крайне медленно, особенно если документов сотни тысяч или миллионы. В этой статье мы подробно разберем, как ускорить этот процесс, какие программные механизмы задействовать и каких ошибок следует избегать.

Причина низкой скорости удаления

Прежде чем перейти к коду, давайте проанализируем ситуацию и выясним, почему стандартное удаление занимает так много времени. Каждый раз, когда мы вызываем метод Удалить() или УстановитьПометкуУдаления(), платформа 1С выполняет целый ряд действий:

  1. Проверка ссылочной целостности (не ссылается ли кто-то на этот документ).
  2. Запуск подписок на события (перед удалением, при удалении).
  3. Очистка движений во всех связанных регистрах (накопления, сведения, бухгалтерии).
  4. Пересчет итогов регистров.
  5. Обновление индексов полнотекстового поиска.

Когда документов много, эти операции создают колоссальную нагрузку на дисковую подсистему и процессор. Наша цель — минимизировать эти накладные расходы.

Способ 1. Программный перебор с использованием режима обмена данными

Это самый гибкий способ, позволяющий очистить базу без создания новой. Основной секрет скорости здесь заключается в свойстве ОбменДанными.Загрузка = Истина. Этот флаг отключает большинство проверок и обработчиков событий, прописанных в конфигурации.

Рассмотрим правильный алгоритм удаления. Обратите внимание на цикл: мы начинаем с индекса 0, чтобы не пропустить первый вид документа в метаданных.


Для Инд = 0 по Метаданные.Документы.Количество() - 1 Цикл
    ДокМетаданные = Метаданные.Документы.Получить(Инд);
    ИмяДокумента = ДокМетаданные.Имя;
    ВсегоУдалено = 0;
    
    НачатьТранзакцию();
    Счетчик = 0;
    
    Выборка = Документы[ИмяДокумента].Выбрать();
    Пока Выборка.Следующий() Цикл
        Объект = Выборка.ПолучитьОбъект();
        
        // Устанавливаем режим загрузки для ускорения
        Объект.ОбменДанными.Загрузка = Истина;
        
        // Выбираем действие: непосредственное удаление или пометка
        // Для полной очистки лучше Удалить(), так как не нужно потом чистить корзину
        Объект.Удалить(); 
        
        ВсегоУдалено = ВсегоУдалено + 1;
        Счетчик = Счетчик + 1;
        
        // Фиксируем транзакцию порциями, чтобы не переполнить лог
        Если Счетчик >= 1000 Тогда
            ЗафиксироватьТранзакцию();
            Состояние("Удаление: " + ИмяДокумента + " (" + ВсегоУдалено + ")");
            НачатьТранзакцию();
            Счетчик = 0;
        КонецЕсли;
    КонецЦикла;
    
    ЗафиксироватьТранзакцию();
    Если ВсегоУдалено > 0 Тогда
        Сообщить("Удалено документов '" + ИмяДокумента + "': " + ВсегоУдалено);
    КонецЕсли;
КонецЦикла;

Способ 2. Оптимизация работы с итогами и индексами

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

  1. Отключить итоги: Для всех регистров накопления и бухгалтерии программно установите использование итогов в Ложь. Это предотвратит их обновление при удалении записей.
  2. Перенос периода рассчитанных итогов: Если полное отключение невозможно, перенесите период рассчитанных итогов на дату самого раннего документа.
  3. Отключение полнотекстового поиска: Это существенно снизит нагрузку на диски. Используйте метод ПолнотекстовыйПоиск.УстановитьИспользованиеПоиска(Ложь).

Способ 3. Перенос данных в чистую базу (Метод "Чистый лист")

Если документов слишком много (миллионы), иногда быстрее будет не удалять их, а перенести всё остальное в новую базу. Рассмотрим этот процесс по шагам:

  1. Создаем чистую информационную базу из того же .cf файла (конфигурации).
  2. Используем типовую обработку "Выгрузка и загрузка данных XML" (она обычно находится на диске ИТС).
  3. При выгрузке выбираем все справочники, константы, планы видов характеристик, настройки пользователей и регистры сведений (если в них нет данных, привязанных к документам).
  4. Загружаем данные в новую базу.

Важно: Этот метод требует внимательности к настройкам прав доступа и торгового оборудования, которые могут храниться вне справочников (например, в реестре или специальных файлах).

Способ 4. "Хакерский" метод через временное изменение метаданных

Рассмотрим продвинутый метод, который предложили опытные специалисты на форуме. Если база файловая или вы имеете полный доступ к разработке, можно пойти на хитрость:

  1. Сделайте резервную копию (обязательно!).
  2. Зайдите в конфигуратор и у всех видов документов на вкладке "Движения" снимите галочки со всех регистров.
  3. Примените изменения (динамическое обновление здесь не подойдет, нужно монопольно).
  4. После этого запустите программное удаление (Способ 1). Поскольку у документов теперь "нет движений" в базе, 1С удалит ссылки мгновенно, не пытаясь чистить таблицы регистров (которые останутся "висеть" отдельно).
  5. После удаления верните конфигурацию из .cf обратно.
  6. Выполните Тестирование и исправление с установленной галочкой "Очистка таблиц" для удаления ставших ненужными записей в регистрах.

Важные рекомендации для SQL-версий

Если ваша база работает на MS SQL Server или PostgreSQL, обратите внимание на настройки СУБД:

Модель восстановления: Перед массовым удалением переведите базу данных в модель восстановления Simple. В модели Full файл лога транзакций (.ldf) мгновенно вырастет до огромных размеров, что может привести к остановке сервера из-за нехватки места.

Сжатие базы (Shrink): После удаления миллионов записей физический размер файлов базы не уменьшится автоматически. Вам потребуется выполнить команду SHRINKDATABASE в консоли SQL или запустить процедуру сжатия таблиц через конфигуратор (Тестирование и исправление).

Заключение

Мы проанализировали различные подходы к очистке базы данных. Для небольших баз идеально подходит программный скрипт с использованием ОбменДанными.Загрузка = Истина и транзакциями. Для огромных баз эффективнее будет либо метод переноса данных в чистую базу, либо временное отключение движений в конфигураторе. Помните, что любые манипуляции с массовым удалением данных должны начинаться с создания архивной копии!

← На главную