Проблема низкой скорости удаления помеченных объектов в 1С:Предприятие 8.3 знакома многим администраторам и разработчикам. При больших объемах данных стандартная обработка может выполняться часами, блокируя работу пользователей или регламентных заданий. В данной статье мы проанализируем ситуацию, разберем причины медленной работы и рассмотрим подробнее современные способы решения этой задачи с помощью программного кода и новых возможностей платформы.
Прежде чем переходить к коду, давайте выясним причину низкой производительности. Когда мы запускаем процесс удаления, платформа выполняет поиск ссылок на каждый удаляемый объект во всей базе данных. Это означает, что для каждого элемента справочника или документа система сканирует все таблицы, где этот объект может быть использован (реквизиты других документов, регистры сведений, регистры накопления и т.д.).
Если в базе миллионы записей, этот процесс становится крайне ресурсоемким. Мы проанализируем, как можно оптимизировать этот процесс, разделив его на этапы и используя специализированные объекты платформы.
Начиная с современных версий платформы 8.3, разработчикам доступен объект УдалениеПомеченныхОбъектовМенеджер. Он позволяет гибко управлять процессом удаления. Разберем по шагам, как реализовать программное удаление с его помощью.
Рассмотрим пример кода, который позволяет запустить удаление в интерактивном или фоновом режиме:
// Создаем объект менеджера удаления
МенеджерУдаления = УдалениеПомеченныхОбъектов.Создать();
// Можно ограничить выборку конкретными типами объектов
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));
МенеджерУдаления.ОбъектыДляУдаления = НайтиПомеченныеНаУдаление(МассивТипов);
// Настройка параметров удаления
МенеджерУдаления.РежимУдаления = РежимУдаленияПомеченныхОбъектов.УдалятьПостепенно;
МенеджерУдаления.МаксимальноеВремяВыполнения = 3600; // Ограничение в секундах
Посмотрим на пример использования метода Удалить(). Этот метод возвращает массив объектов, которые не удалось удалить из-за наличия ссылок на них. Это критически важно для последующего анализа причин отказа в удалении.
Для того чтобы не блокировать сеанс пользователя, мы рекомендуем запускать процесс удаления в фоновом режиме. Это особенно актуально для серверных баз данных. Разберем ситуацию, когда нам нужно программно запустить типовое регламентное задание или создать свое собственное.
Использование фонового задания позволяет системе распределить нагрузку на ресурсы сервера. В коде это может выглядеть следующим образом:
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(Истина); // Параметр: удалять без подтверждения
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ПрограммноеУдаление", ПараметрыЗадания, , "Удаление объектов");
Одной из самых затратных операций является поиск ссылок. Если мы заранее знаем, что объекты можно удалять без контроля ссылочной целостности (что крайне опасно, но иногда необходимо в технических целях), мы можем использовать метод УстановитьОбменДанными.Загрузка = Истина. Однако в стандартных бизнес-сценариях мы проанализируем использование функции НайтиСсылки().
Чтобы ускорить процесс, разберем следующий подход:
Владелец или Склад).В последних версиях платформы появился новый режим — "Ускоренное удаление". Он работает за счет оптимизации SQL-запросов к базе данных при поиске ссылок. Рассмотрим подробнее, как включить этот режим программно через установку свойств менеджера удаления.
Важный момент: при использовании ускоренного режима платформа может накладывать более жесткие блокировки на таблицы, поэтому посмотрим, как это влияет на параллельную работу пользователей. Мы рекомендуем запускать такие процессы в периоды минимальной активности системы (например, ночью).
// Пример настройки ускоренного поиска ссылок
Менеджер = УдалениеПомеченныхОбъектов.Создать();
Менеджер.СпособПоискаСсылок = СпособПоискаСсылокПриУдалении.Ускоренный;
Результат = Менеджер.Удалить();
Часто проблема не в скорости удаления, а в том, что объекты "висят" годами, так как на них есть ссылки. Мы проанализируем ситуацию, как программно очистить ссылки на удаляемые объекты. Например, если старый документ ссылается на помеченную номенклатуру, нам нужно либо очистить этот реквизит, либо пометить на удаление и сам документ.
Разберем алгоритм очистки:
НайтиСсылки().В завершение рассмотрим несколько практических советов, которые помогут сделать процесс эффективным:
НачатьТранзакцию() и ЗафиксироватьТранзакцию() при массовой очистке ссылок перед удалением, чтобы избежать частичного изменения данных.СообщениеПользователю для логирования процесса, чтобы в случае прерывания задания можно было понять, на каком объекте произошла остановка.Таким образом, мы проанализировали основные инструменты для управления удалением помеченных объектов. Использование УдалениеПомеченныхОбъектовМенеджер в сочетании с фоновыми заданиями и правильной настройкой режима поиска ссылок позволяет сократить время выполнения операции в несколько раз.