Как быстро удалить все документы и движения регистров в большой базе 1С?

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

При подготовке тестовых сред, разделении учета или создании чистой рабочей базы на основе существующей часто возникает задача: полностью очистить базу от оперативных данных (всех документов и движений регистров), сохранив при этом справочники, настройки и классификаторы. На базах объемом от 100–300 Гб стандартная выгрузка и загрузка через XML может занимать несколько суток. Разберем наиболее быстрые и надежные способы решения этой задачи.

Подготовка инфраструктуры перед очисткой

Прежде чем выполнять любые массовые операции удаления, выполним подготовительные действия на сервере:

  1. Создание полной резервной копии базы данных. Это обязательное условие перед любыми прямыми манипуляциями с таблицами или метаданными.
  2. Блокировка регламентных и фоновых заданий. В консоли администрирования кластера серверов 1С или через свойства информационной базы установим блокировку регламентных заданий, чтобы фоновые процессы не мешали монопольной работе и не создавали лишних блокировок.
  3. Перевод базы в простую модель восстановления (Simple Recovery Model). На стороне MS SQL Server переключим модель восстановления базы данных на Simple, чтобы журнал транзакций (LDF) не разрастался до сотен гигабайт при массовом удалении записей.

Способ 1. Быстрое усечение таблиц на уровне СУБД (TRUNCATE TABLE)

Самый быстрый способ очистки физических таблиц в реляционной СУБД — выполнение команды TRUNCATE TABLE. В отличие от обычной инструкции DELETE, усечение освобождает страницы памяти мгновенно и практически не нагружает журнал транзакций. Однако в 1С имена таблиц СУБД формируются динамически (например, _Document123, _InfoReg456).

Рассмотрим, как сгенерировать точный список таблиц для очистки прямо из 1С с помощью штатной функции ПолучитьСтруктуруХраненияБД():


ТаблицыБД = ПолучитьСтруктуруХраненияБД();
СкриптSQL = "";

Для Каждого Стр Из ТаблицыБД Цикл
    ИмяМетаданных = Стр.ИмяМетаданных;
    ИмяТаблицыБД = Стр.ИмяТаблицыХранения;
    
    // Проверяем принадлежность к документам, журналам, последовательностям и регистрам
    Если СтрНайти(ИмяМетаданных, "Документ.") = 1
        Или СтрНайти(ИмяМетаданных, "РегистрНакопления.") = 1
        Или СтрНайти(ИмяМетаданных, "РегистрБухгалтерии.") = 1
        Или СтрНайти(ИмяМетаданных, "РегистрСведений.") = 1
        Или СтрНайти(ИмяМетаданных, "РегистрРасчета.") = 1
        Или СтрНайти(ИмяМетаданных, "Последовательность.") = 1
        Или СтрНайти(ИмяМетаданных, "ЖурналДокументов.") = 1 Тогда
        
        // Очищаем основную таблицу объекта
        Если ЗначениеЗаполнено(ИмяТаблицыБД) Тогда
            СкриптSQL = СкриптSQL + "TRUNCATE TABLE " + ИмяТаблицыБД + ";" + Символы.ПС;
        КонецЕсли;
        
        // Очищаем все вложенные таблицы (табличные части, итоги, перерасчеты)
        Для Каждого ВложеннаяТаблица Из Стр.ВложенныеТаблицы Цикл
            Если ЗначениеЗаполнено(ВложеннаяТаблица.ИмяТаблицыХранения) Тогда
                СкриптSQL = СкриптSQL + "TRUNCATE TABLE " + ВложеннаяТаблица.ИмяТаблицыХранения + ";" + Символы.ПС;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

Важные нюансы при прямой очистке через SQL:

  1. Таблицы регистрации изменений (планы обмена): если в базе настроена синхронизация данных или РИБ, в таблицах изменений (_Document123_ChangesNum) останутся ссылки на удаленные объекты. Их также необходимо усекать, иначе синхронизация завершится ошибкой.
  2. Таблицы итогов и агрегатов: регистры накопления и бухгалтерии имеют отдельные таблицы остатков и оборотов. Если усечь только таблицу движений, в таблицах итогов останутся старые данные. Функция ПолучитьСтруктуруХраненияБД() возвращает их во вложенных таблицах, поэтому очищаются и движения, и итоги.
  3. Битые ссылки: если реквизиты справочников или констант ссылались на удаленные документы, они примут значение Объект не найден. После очистки потребуется запустить регламентную процедуру очистки битых ссылок.
  4. Тестирование и исправление: после выполнения SQL-скрипта обязательно выполним в Конфигураторе Администрирование -> Тестирование и исправление с отмеченными пунктами «Проверка логической целостности», «Реструктуризация таблиц» и «Пересчет итогов».

Способ 2. Очистка через реструктуризацию метаданных

Если доступ к СУБД ограничен или прямое вмешательство в таблицы нежелательно, применим метод реструктуризации на уровне Конфигуратора. Этот подход позволяет удалить физические таблицы штатными средствами платформы 1С.

Разберем последовательность шагов:

  1. Выгрузим исходную конфигурацию в файл (.cf) через меню Конфигурация -> Сохранить конфигурацию в файл.
  2. В дереве метаданных удалим ветки: Документы, Журналы документов, Регистры накопления, Регистры бухгалтерии, Регистры расчета, Последовательности и ненужные Регистры сведений.
  3. Обновим конфигурацию базы данных (клавиша F7). Платформа физически удалит из базы данных все таблицы удаленных объектов метаданных вместе со всеми записями и индексами.
  4. Загрузим исходный файл конфигурации обратно через Конфигурация -> Загрузить конфигурацию из файла.
  5. Повторно применим изменения (клавиша F7). Платформа заново создаст абсолютно пустые таблицы для всех документов и регистров с сохранением их исходной структуры.

Для автоматизации этой операции при частой работе можно использовать механизм выгрузки и загрузки конфигурации из файлов XML через параметры командной строки Конфигуратора.

Способ 3. Оптимизированная программная очистка средствами 1С

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

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

Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать(Истина);
  1. Пакетная обработка в транзакциях: удаление объектов следует выполнять порциями по 1 000–5 000 элементов в одной транзакции, чтобы избежать переполнения оперативной памяти и эскалации блокировок.

Итоги

Для моментальной полной очистки базы данных объемом 300 Гб оптимально использовать Способ 1 (генерация SQL-скрипта с TRUNCATE TABLE) или Способ 2 (двойная реструктуризация метаданных). Оба метода выполняются за считанные минуты вместо суток стандартного переноса данных через XML.

← На главную