В процессе эксплуатации высоконагруженных систем на платформе 1С:Предприятие 8.3 пользователи и администраторы часто сталкиваются с проблемой критически медленного удаления помеченных объектов. Стандартная обработка может выполняться часами, блокируя работу пользователей и потребляя избыточные ресурсы сервера. Особенно остро эта проблема проявляется, когда требуется удаление помеченных на удаление объектов с предварительным отбором, так как при накоплении миллионов записей типовые механизмы перестают справляться. В этой статье мы подробно разберем, как оптимизировать этот процесс, проанализируем внутренние механизмы платформы и рассмотрим программные способы ускорения очистки базы.
Прежде чем переходить к оптимизации, давайте проанализируем, почему удаление занимает так много времени. Основная нагрузка ложится не на само удаление записи из таблицы, а на проверку ссылочной целостности. Платформа должна убедиться, что удаляемый объект не используется ни в одном другом документе, справочнике или регистре сведений. Если база данных имеет объем в несколько сотен гигабайт, количество таблиц, которые нужно просканировать, исчисляется тысячами.
Рассмотрим основные факторы, замедляющие процесс:
Начиная с современных версий платформы 8.3, разработчики 1С реализовали возможность асинхронного удаления. Разберем по шагам, как запустить этот процесс программно, чтобы не блокировать интерфейс и повысить общую производительность системы. Вместо стандартного интерактивного поиска, мы воспользуемся методом УдалениеПомеченныхОбъектов с определенными параметрами.
Рассмотрим пример кода, который позволяет запустить удаление в фоновом режиме:
Процедура ЗапуститьУскоренноеУдаление()
ПараметрыУдаления = Новый Структура;
ПараметрыУдаления.Вставить("СпособУдаления", СпособУдаленияОбъектов.НайтиИУдалить);
ПараметрыУдаления.Вставить("ВыполнятьВФоне", Истина);
// Платформа 8.3.18+ позволяет использовать специализированные методы
Результат = УдалитьПомеченныеОбъекты(,, ПараметрыУдаления);
Если Результат = Неопределено Тогда
Сообщить("Задание запущено в фоновом режиме. Мониторинг через консоль заданий.");
КонецЕсли;
КонецПроцедуры
Важно понимать, что при использовании параметра ВыполнятьВФоне, система создает фоновое задание, которое работает независимо от сеанса пользователя. Это позволяет избежать тайм-аутов соединения Manager (t-call).
Часто стандартный поиск ссылок работает избыточно. Если нам нужно очистить базу от документов по конкретной организации или контрагенту, эффективнее использовать специализированные инструменты, такие как универсальная очистка базы и удаление документов. Если же задача стоит в массовой очистке справочной информации, то универсальное удаление элементов справочников позволит выполнить процедуру безопаснее и с меньшей нагрузкой на систему.
Для оптимизации можно использовать метод НайтиСсылки. Посмотрим на пример алгоритма, ограничивающего область поиска:
// Пример выборочной проверки ссылок перед удалением
МассивОбъектов = НайтиПомеченныеНаУдаление();
ОбластиПоиска = Новый Массив;
ОбластиПоиска.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
ОбластиПоиска.Добавить(Метаданные.РегистрыСведений.ЦеныНоменклатуры);
ТаблицаСсылок = НайтиСсылки(МассивОбъектов, ОбластиПоиска);
// Если таблица ссылок пуста для конкретного объекта, его можно удалять смело
Если ТаблицаСсылок.Количество() = 0 Тогда
// Прямое удаление без повторной проверки целостности (использовать с осторожностью!)
ОбъектДляУдаления.ПолучитьОбъект().Удалить();
КонецЕсли;
Внимание: Использование метода Удалить() вместо УстановитьПометкуУдаления() в цикле без проверки ссылок может привести к нарушению логической целостности базы. Мы рекомендуем использовать этот подход только для очистки временных данных или после тщательного анализа структуры метаданных.
Если программные методы в среде 1С не дают желаемого результата, следует обратить внимание на уровень базы данных (SQL Server или PostgreSQL). Правильная настройка сервера критична для производительности: в этом поможет детальная инструкция по настройке регламентных операций MS SQL SERVER под 1С. При массовом удалении лог транзакций растет взрывными темпами, что замедляет запись данных.
Рассмотрим рекомендации по настройке для ускорения процесса:
Simple. Это отключит детальное логирование каждой операции удаления, что существенно ускорит процесс.DBCC FREEPROCCACHE перед началом глобального удаления.В типовых конфигурациях (ERP, КА, УТ 11) реализован удобный механизм, который многие программисты недооценивают. Давайте посмотрим, как настроить его для максимальной производительности. В разделе НСИ и администрирование — Обслуживание — Удаление помеченных объектов выберите режим "По расписанию".
Почему это эффективнее ручного запуска?
РегламентныеЗадания, который умеет восстанавливать работу после сбоя.Посмотрим на настройки в коде типового решения, которые отвечают за это (общий модуль УдалениеОбъектовСлужебный):
// Типовой механизм часто использует параметры блокировки
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.Номенклатура");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
// Это предотвращает конфликты, но замедляет работу других пользователей
Проанализировав опыт многих внедрений, мы выделили несколько "золотых правил" для ускорения удаления:
Объект не найден). Чтобы полностью устранить эту проблему, используйте универсальный комплекс очистки битых ссылок, который проведет полную диагностику и "лечение" базы перед основным удалением.Таким образом, комбинируя программные методы платформы 1С:Предприятие, возможности фоновых заданий и тонкую настройку СУБД, мы можем сократить время очистки базы данных в несколько раз, обеспечивая стабильную работу системы даже в периоды интенсивной нагрузки.