Как ускорить удаление помеченных объектов в 1С при больших объемах данных

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

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

Выясним причину медленной работы стандартного механизма

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

Рассмотрим основные факторы, замедляющие процесс:

  1. Огромное количество таблиц: Платформа проверяет все метаданные, где данный объект может выступать в качестве типа значения.
  2. Отсутствие индексов: Если в каком-либо регистре поле со ссылкой на объект не проиндексировано, СУБД будет выполнять полное сканирование таблицы (Full Scan).
  3. Блокировки: При стандартном удалении в транзакции накладываются блокировки, которые могут конфликтовать с текущей работой пользователей.
  4. Наличие узлов обмена: Проверка регистрации объекта в планах обмена также требует времени.

Использование фонового удаления объектов

Начиная с современных версий платформы 8.3, разработчики 1С реализовали возможность асинхронного удаления. Разберем по шагам, как запустить этот процесс программно, чтобы не блокировать интерфейс и повысить общую производительность системы. Вместо стандартного интерактивного поиска, мы воспользуемся методом УдалениеПомеченныхОбъектов с определенными параметрами.

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


Процедура ЗапуститьУскоренноеУдаление()
    ПараметрыУдаления = Новый Структура;
    ПараметрыУдаления.Вставить("СпособУдаления", СпособУдаленияОбъектов.НайтиИУдалить);
    ПараметрыУдаления.Вставить("ВыполнятьВФоне", Истина);
    
    // Платформа 8.3.18+ позволяет использовать специализированные методы
    Результат = УдалитьПомеченныеОбъекты(,, ПараметрыУдаления);
    
    Если Результат = Неопределено Тогда
        Сообщить("Задание запущено в фоновом режиме. Мониторинг через консоль заданий.");
    КонецЕсли;
КонецПроцедуры

Важно понимать, что при использовании параметра ВыполнятьВФоне, система создает фоновое задание, которое работает независимо от сеанса пользователя. Это позволяет избежать тайм-аутов соединения Manager (t-call).

Программная оптимизация через поиск ссылок

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

Для оптимизации можно использовать метод НайтиСсылки. Посмотрим на пример алгоритма, ограничивающего область поиска:


// Пример выборочной проверки ссылок перед удалением
МассивОбъектов = НайтиПомеченныеНаУдаление();
ОбластиПоиска = Новый Массив;
ОбластиПоиска.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
ОбластиПоиска.Добавить(Метаданные.РегистрыСведений.ЦеныНоменклатуры);

ТаблицаСсылок = НайтиСсылки(МассивОбъектов, ОбластиПоиска);

// Если таблица ссылок пуста для конкретного объекта, его можно удалять смело
Если ТаблицаСсылок.Количество() = 0 Тогда
    // Прямое удаление без повторной проверки целостности (использовать с осторожностью!)
    ОбъектДляУдаления.ПолучитьОбъект().Удалить();
КонецЕсли;

Внимание: Использование метода Удалить() вместо УстановитьПометкуУдаления() в цикле без проверки ссылок может привести к нарушению логической целостности базы. Мы рекомендуем использовать этот подход только для очистки временных данных или после тщательного анализа структуры метаданных.

Настройка СУБД для ускорения массовых операций

Если программные методы в среде 1С не дают желаемого результата, следует обратить внимание на уровень базы данных (SQL Server или PostgreSQL). Правильная настройка сервера критична для производительности: в этом поможет детальная инструкция по настройке регламентных операций MS SQL SERVER под 1С. При массовом удалении лог транзакций растет взрывными темпами, что замедляет запись данных.

Рассмотрим рекомендации по настройке для ускорения процесса:

  1. Модель восстановления: Если вы проводите глобальную чистку базы (например, после свертки), переведите базу данных в модель Simple. Это отключит детальное логирование каждой операции удаления, что существенно ускорит процесс.
  2. Параллелизм (Max Degree of Parallelism): Для выполнения тяжелых запросов по поиску ссылок убедитесь, что настройки SQL Server позволяют использовать несколько ядер процессора для одного запроса.
  3. Очистка процедурного кэша: Иногда старые планы запросов мешают эффективному поиску ссылок в таблицах. Используйте команду DBCC FREEPROCCACHE перед началом глобального удаления.

Разберем по шагам использование типовой обработки «Обслуживание»

В типовых конфигурациях (ERP, КА, УТ 11) реализован удобный механизм, который многие программисты недооценивают. Давайте посмотрим, как настроить его для максимальной производительности. В разделе НСИ и администрирование — Обслуживание — Удаление помеченных объектов выберите режим "По расписанию".

Почему это эффективнее ручного запуска?

Посмотрим на настройки в коде типового решения, которые отвечают за это (общий модуль УдалениеОбъектовСлужебный):


// Типовой механизм часто использует параметры блокировки
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
// Это предотвращает конфликты, но замедляет работу других пользователей

Практические советы по работе с большими объемами

Проанализировав опыт многих внедрений, мы выделили несколько "золотых правил" для ускорения удаления:

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

Таким образом, комбинируя программные методы платформы 1С:Предприятие, возможности фоновых заданий и тонкую настройку СУБД, мы можем сократить время очистки базы данных в несколько раз, обеспечивая стабильную работу системы даже в периоды интенсивной нагрузки.

← На главную