Как эффективно удалить 45 миллионов документов из базы 1С, работающей 24/7?

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

При работе с большими объемами данных в системах 1С, особенно когда база данных функционирует в режиме 24/7 с высокой нагрузкой, задача массового удаления документов становится критически важной. Мы столкнулись с необходимостью удалить 45 миллионов документов из базы 1С:Предприятия 8.3.18.1289 под управлением MSSQL объемом около 50 ГБ. Стандартные методы удаления в 1С оказались слишком медленными (около 45 суток) и нестабильными, что недопустимо для непрерывной работы.

Давайте подробно рассмотрим, какие подходы существуют для решения этой задачи, их преимущества, недостатки и особенности реализации.

Метод 1: Удаление средствами 1С с использованием регламентных и фоновых заданий (рекомендованный)

Этот метод оказался успешным в нашей ситуации, обеспечив удаление миллионов документов без остановки работы системы и значительных простоев. Ключевые принципы здесь — пакетная обработка, асинхронность и минимизация влияния на текущие операции.

Разбиение на небольшие порции и регламентные задания

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

Для автоматизации и работы в фоне используем РегламентноеЗадание. Это позволяет процессу удаления работать непрерывно (например, 24 часа в сутки), не требуя ручного запуска и контроля.

  1. Создание регламентного задания: Мы создаем новое регламентное задание, которое будет периодически запускать процедуру удаления. Интервал запуска подбираем экспериментально, чтобы каждая порция успевала обработаться, но не создавала чрезмерную нагрузку.
  2. Пакетное удаление: Внутри процедуры регламентного задания мы выбираем небольшое количество документов для удаления за один проход. Например, 10 000 документов.
  3. Управление транзакциями: Каждый пакет документов удаляем в отдельной, короткой транзакции. Это критически важно для производительности MSSQL и управления журналом транзакций. Если транзакция длится долго, журнал транзакций не может быть усечен, что приводит к его разрастанию и возможной остановке базы данных. Короткие транзакции позволяют SQL Server своевременно усекать журнал.
  4. Распроведение документов: Перед удалением документов, имеющих движения в регистрах, необходимо их распровести. Это предотвратит появление «фантомных» движений и обеспечит корректность данных после удаления. Например, так:

Процедура УдалитьПакетДокументов() Экспорт
    // Определяем количество документов в пакете
    КоличествоДокументовВПакете = 10000; 

    // Выбираем документы для удаления
    ВыборкаДокументов = Документы.НашДокумент.Выбрать(,,,"ПометкаУдаления", КоличествоДокументовВПакете);

    Пока ВыборкаДокументов.Следующий() Цикл
        Попытка
            НашДокументОбъект = ВыборкаДокументов.ПолучитьОбъект();

            // Если документ проведен, сначала распроводим его
            Если НашДокументОбъект.Проведен Тогда
                НашДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
            КонецЕсли;

            // Удаляем документ
            НашДокументОбъект.Удалить();
        Исключение
            ЗаписатьВЖурналРегистрации("Ошибка удаления документа " + ВыборкаДокументов.Ссылка + ": " + ОписаниеОшибки(),
                                     УровеньВажностиЖурналаРегистрации.Ошибка);
        КонецПопытки;
    КонецЦикла;

    // Оповещаем о количестве оставшихся документов
    ОсталосьДокументов = Документы.НашДокумент.Количество();
    ЗаписатьВЖурналРегистрации("Удалено документов. Осталось: " + ОсталосьДокументов, УровеньВажностиЖурналаРегистрации.Информация);
КонецПроцедуры
  1. Отключение расчета итогов: Если удаляемые документы затрагивают регистры с интенсивным расчетом итогов, временно отключение расчета итогов для этих регистров может значительно ускорить процесс. Это снизит нагрузку на СУБД при пересчете агрегатов.

Использование фоновых заданий (многопоточность)

Для дальнейшего ускорения процесса можно запускать несколько фоновых заданий в рамках одного регламентного. Это позволяет распараллелить процесс удаления.

  1. Распараллеливание: Вместо одного регламентного задания, запускающего одну порцию, мы можем настроить его так, чтобы оно запускало несколько фоновых заданий параллельно. Например, регламентное задание может инициировать 2, 5 или даже 30 фоновых заданий, каждое из которых будет обрабатывать свою порцию документов.
  2. Контроль взаимоблокировок: При многопоточности возрастает риск взаимоблокировок. Мы должны быть готовы к тому, что некоторые потоки могут замедляться или завершаться с ошибкой блокировки. Однако, как правило, страдает только один поток, а остальные продолжают работу. Платформа 1С обычно хорошо справляется с такими ситуациями.
  3. Мониторинг: Настраиваем детальное логирование в журнал регистрации, чтобы отслеживать прогресс каждого фонового задания, количество удаленных документов и возможные ошибки.

// Пример запуска нескольких фоновых заданий из регламентного
Процедура ЗапуститьУдалениеВНесколькоПотоков() Экспорт
    КоличествоПотоков = 5; // Например, 5 потоков
    Для Сч = 1 По КоличествоПотоков Цикл
        ФоновыеЗадания.Выполнить("УдалитьПакетДокументов", ПараметрыФоновогоЗадания,,, 
                                 "Удаление документов поток " + Сч);
    КонецЦикла;
КонецПроцедуры

Преимущества метода:

Недостатки метода:

Метод 2: Прямое удаление через SQL Server

Прямое взаимодействие с базой данных MSSQL может быть значительно быстрее, особенно для очень больших объемов, но сопряжено с высоким риском нарушения целостности данных, если не учитывать внутреннюю структуру 1С.

Вариант 1: Удаление по условию (DELETE FROM)

Если нам нужно удалить документы по определенным условиям (например, старше определенной даты), мы можем использовать оператор DELETE FROM в SQL. Это будет быстрее, чем 1С-методы, но имеет свои особенности.

  1. Идентификация таблиц: Нам нужно точно знать, какой таблице MSSQL соответствует удаляемый документ в 1С. Эту информацию можно получить с помощью функции ПолучитьСтруктуруХраненияБазыДанных() в 1С. Например, документ "НашДокумент" может храниться в таблице с именем вроде _Document2345.
  2. Учет связанных таблиц: Документы в 1С редко существуют изолированно. Они могут иметь движения в регистрах, ссылки в других документах или справочниках. При прямом DELETE будут удалены только записи из основной таблицы документа. Связанные записи (движения, ссылки) останутся, что приведет к появлению "битых" ссылок и нарушению целостности базы.
  3. Пакетное удаление в SQL: Чтобы избежать разрастания журнала транзакций, даже при прямом SQL-удалении рекомендуется выполнять его порциями, используя оператор TOP или аналогичные конструкции.

-- Пример удаления 10000 документов из таблицы _Document2345 (аналог "НашДокумент")
-- НЕ ЗАБУДЬТЕ, ЧТО ЭТО ТОЛЬКО ОСНОВНАЯ ТАБЛИЦА ДОКУМЕНТА!
-- Движения и связанные данные останутся!

DELETE TOP (10000) FROM dbo._Document2345 WHERE _Date < '2020-01-01 00:00:00.000'
  1. Управление ссылочной целостностью: Если мы все же решились на прямое SQL-удаление, нам придется вручную написать скрипты для очистки или обновления связанных таблиц. Это может включать:
    • DELETE FROM для таблиц движений регистров, связанных с удаляемыми документами.
    • UPDATE TableXXX SET FldYYY = NULL для полей, которые ссылались на удаленные документы, чтобы обнулить эти ссылки.
    Такая работа требует глубокого понимания структуры базы данных 1С и её связей.

Вариант 2: Полная очистка таблицы (TRUNCATE TABLE)

Если нам нужно полностью очистить таблицу от всех данных и нет никаких критичных связей (что крайне редко для документов 1С), оператор TRUNCATE TABLE является самым быстрым способом.

  1. Скорость: TRUNCATE TABLE не логируется построчно, а просто деаллоцирует страницы данных, что делает его чрезвычайно быстрым.
  2. Последствия: После TRUNCATE TABLE данные невозможно восстановить штатными средствами (только из бэкапа). Все записи удаляются, счетчики IDENTITY сбрасываются.
  3. Ограничения: TRUNCATE TABLE не работает, если на таблицу существуют внешние ключи (foreign keys), триггеры, или если она участвует в репликации.
  4. Применимость к 1С: Для таблиц документов 1С этот метод почти никогда не подходит, так как документы всегда имеют связи (как минимум с таблицей _Reference). Его можно использовать для временных таблиц или каких-либо вспомогательных таблиц, где целостность не является критичной.

-- Пример полной очистки таблицы _Document2345
-- КРАЙНЕ ОСТОРОЖНО! Все данные будут удалены безвозвратно.
TRUNCATE TABLE dbo._Document2345;

Преимущества прямого SQL-метода:

Недостатки прямого SQL-метода:

Общие рекомендации и оптимизация для массового удаления

Независимо от выбранного метода, существуют общие подходы, которые помогут нам сделать процесс удаления более эффективным и безопасным.

  1. Резервное копирование: Перед началом любых масштабных операций по удалению данных, особенно на продуктивной базе, мы обязательно должны сделать полную резервную копию базы данных. Это наша страховка на случай непредвиденных проблем.
  2. Тестирование на копии: Всегда сначала тестируем выбранную стратегию удаления на копии продуктивной базы. Это позволит выявить потенциальные проблемы, оценить скорость выполнения и оптимизировать процесс без риска для основной системы.
  3. Анализ связей документов: Мы должны понять, какие документы удаляются, и есть ли на них ссылки в других объектах конфигурации 1С. Это критически важный фактор для выбора метода удаления и предотвращения нарушения целостности данных. Используем отчеты по ссылкам или инструментарий разработчика 1С.
  4. Оптимизация транзакций и журнала транзакций MSSQL:
    • Короткие транзакции: Как уже упоминалось, разбиваем операции на мелкие, управляемые транзакции. Это минимизирует время блокировок и уменьшает размер активной части журнала транзакций.
    • Резервное копирование журнала транзакций: При использовании модели полного восстановления (Full Recovery Model) для базы данных MSSQL, журнал транзакций не будет усекаться без регулярного резервного копирования. Убедимся, что резервное копирование журнала выполняется часто (например, каждые 15-30 минут) во время массовых операций.
    • Сжатие файла журнала: После завершения масштабных операций удаления, когда журнал транзакций может значительно разрастись, мы можем выполнить сжатие файлов журнала (DBCC SHRINKFILE) для освобождения места на диске.
  5. Обслуживание индексов и статистики:
    • Фрагментация индексов: Массовое удаление данных может привести к значительной фрагментации индексов, что замедляет операции поиска и чтения. После завершения процесса удаления мы обязательно должны выполнить реорганизацию или перестроение индексов для всех затронутых таблиц. Перестроение индексов также пересчитывает статистику. На SSD дисках фрагментация менее критична.
    • Обновление статистики: После значительных изменений данных (удалений) важно обновить статистику по таблицам. Это помогает оптимизатору запросов SQL Server строить более эффективные планы выполнения. Используем UPDATE STATISTICS TableName WITH FULLSCAN.
    • Ghost-записи: При удалении данных в MSSQL они не сразу физически удаляются с диска, остаются так называемые "фантомные записи" (Ghost-записи). MSSQL обычно занимается их очисткой в фоновом режиме, но при интенсивном удалении они могут временно влиять на производительность и размер занимаемого места. Перестроение индексов помогает их устранить.
  6. Реструктуризация таблиц (ТИИ): После удаления большого количества документов, особенно если целью является освобождение места, может потребоваться реструктуризация таблиц в 1С (Тестирование и Исправление Информационной базы с соответствующими флагами). Это действие требует монопольного доступа к базе и может быть продолжительным, поэтому планируем его на периоды минимальной нагрузки (ночью). Если реструктуризация занимает 5-15 минут, это может быть приемлемо.
  7. Настройки MSSQL для 1С: Убедимся, что диски, на которых расположены файлы базы данных и журнала, отформатированы с размером кластера 64 КБ. Это обеспечивает лучшую производительность, особенно на HDD. Также проверьте настройки памяти SQL Server.
  8. Мониторинг: Настраиваем активный мониторинг производительности сервера 1С и SQL Server во время процесса удаления. Отслеживаем загрузку CPU, дисковой подсистемы, объем оперативной памяти, количество блокировок и размер журнала транзакций.

В нашей ситуации наиболее эффективным и безопасным оказался метод удаления документов средствами 1С с использованием регламентных и фоновых заданий. Это позволило нам удалить значительный объем документов (уже более 10 миллионов) без остановки работы системы, что подтверждает его практическую ценность для баз, работающих в режиме 24/7.

← На главную