При подготовке тестовых сред, разделении учета или создании чистой рабочей базы на основе существующей часто возникает задача: полностью очистить базу от оперативных данных (всех документов и движений регистров), сохранив при этом справочники, настройки и классификаторы. На базах объемом от 100–300 Гб стандартная выгрузка и загрузка через XML может занимать несколько суток. Разберем наиболее быстрые и надежные способы решения этой задачи.
Прежде чем выполнять любые массовые операции удаления, выполним подготовительные действия на сервере:
Simple, чтобы журнал транзакций (LDF) не разрастался до сотен гигабайт при массовом удалении записей.Самый быстрый способ очистки физических таблиц в реляционной СУБД — выполнение команды TRUNCATE TABLE. В отличие от обычной инструкции DELETE, усечение освобождает страницы памяти мгновенно и практически не нагружает журнал транзакций. Однако в 1С имена таблиц СУБД формируются динамически (например, _Document123, _InfoReg456).
Рассмотрим, как сгенерировать точный список таблиц для очистки прямо из 1С с помощью штатной функции ПолучитьСтруктуруХраненияБД():
ТаблицыБД = ПолучитьСтруктуруХраненияБД();
СкриптSQL = "";
Для Каждого Стр Из ТаблицыБД Цикл
ИмяМетаданных = Стр.ИмяМетаданных;
ИмяТаблицыБД = Стр.ИмяТаблицыХранения;
// Проверяем принадлежность к документам, журналам, последовательностям и регистрам
Если СтрНайти(ИмяМетаданных, "Документ.") = 1
Или СтрНайти(ИмяМетаданных, "РегистрНакопления.") = 1
Или СтрНайти(ИмяМетаданных, "РегистрБухгалтерии.") = 1
Или СтрНайти(ИмяМетаданных, "РегистрСведений.") = 1
Или СтрНайти(ИмяМетаданных, "РегистрРасчета.") = 1
Или СтрНайти(ИмяМетаданных, "Последовательность.") = 1
Или СтрНайти(ИмяМетаданных, "ЖурналДокументов.") = 1 Тогда
// Очищаем основную таблицу объекта
Если ЗначениеЗаполнено(ИмяТаблицыБД) Тогда
СкриптSQL = СкриптSQL + "TRUNCATE TABLE " + ИмяТаблицыБД + ";" + Символы.ПС;
КонецЕсли;
// Очищаем все вложенные таблицы (табличные части, итоги, перерасчеты)
Для Каждого ВложеннаяТаблица Из Стр.ВложенныеТаблицы Цикл
Если ЗначениеЗаполнено(ВложеннаяТаблица.ИмяТаблицыХранения) Тогда
СкриптSQL = СкриптSQL + "TRUNCATE TABLE " + ВложеннаяТаблица.ИмяТаблицыХранения + ";" + Символы.ПС;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Важные нюансы при прямой очистке через SQL:
_Document123_ChangesNum) останутся ссылки на удаленные объекты. Их также необходимо усекать, иначе синхронизация завершится ошибкой.ПолучитьСтруктуруХраненияБД() возвращает их во вложенных таблицах, поэтому очищаются и движения, и итоги.Объект не найден. После очистки потребуется запустить регламентную процедуру очистки битых ссылок.Администрирование -> Тестирование и исправление с отмеченными пунктами «Проверка логической целостности», «Реструктуризация таблиц» и «Пересчет итогов».Если доступ к СУБД ограничен или прямое вмешательство в таблицы нежелательно, применим метод реструктуризации на уровне Конфигуратора. Этот подход позволяет удалить физические таблицы штатными средствами платформы 1С.
Разберем последовательность шагов:
.cf) через меню Конфигурация -> Сохранить конфигурацию в файл.F7). Платформа физически удалит из базы данных все таблицы удаленных объектов метаданных вместе со всеми записями и индексами.Конфигурация -> Загрузить конфигурацию из файла.F7). Платформа заново создаст абсолютно пустые таблицы для всех документов и регистров с сохранением их исходной структуры.Для автоматизации этой операции при частой работе можно использовать механизм выгрузки и загрузки конфигурации из файлов XML через параметры командной строки Конфигуратора.
Если требуется очистить только часть данных или сохранить логическую целостность без прямого SQL-доступа, стандартный программный обход можно ускорить в десятки раз с помощью правильной настройки параметров записи:
УстановитьИспользованиеИтогов(Ложь). Это отключит пересчет агрегатов при каждой транзакции. После завершения очистки включим итоги обратно и выполним разовый пересчет.ОбменДанными.Загрузка = Истина. Это предотвратит запуск платформенных проверок, обработчиков ПередЗаписью, ПриЗаписи и тяжелых подписок на события.
Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать(Истина);
Для моментальной полной очистки базы данных объемом 300 Гб оптимально использовать Способ 1 (генерация SQL-скрипта с TRUNCATE TABLE) или Способ 2 (двойная реструктуризация метаданных). Оба метода выполняются за считанные минуты вместо суток стандартного переноса данных через XML.