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

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

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

Почему стандартное удаление работает медленно?

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

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

Использование объекта УдалениеПомеченныхОбъектов

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

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


// Создаем объект менеджера удаления
МенеджерУдаления = УдалениеПомеченныхОбъектов.Создать();

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

// Настройка параметров удаления
МенеджерУдаления.РежимУдаления = РежимУдаленияПомеченныхОбъектов.УдалятьПостепенно;
МенеджерУдаления.МаксимальноеВремяВыполнения = 3600; // Ограничение в секундах

Посмотрим на пример использования метода Удалить(). Этот метод возвращает массив объектов, которые не удалось удалить из-за наличия ссылок на них. Это критически важно для последующего анализа причин отказа в удалении.

Ускорение через использование фоновых заданий

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

Использование фонового задания позволяет системе распределить нагрузку на ресурсы сервера. В коде это может выглядеть следующим образом:


ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(Истина); // Параметр: удалять без подтверждения

ФоновыеЗадания.Выполнить("МойОбщийМодуль.ПрограммноеУдаление", ПараметрыЗадания, , "Удаление объектов");

Метод поиска ссылок перед удалением

Одной из самых затратных операций является поиск ссылок. Если мы заранее знаем, что объекты можно удалять без контроля ссылочной целостности (что крайне опасно, но иногда необходимо в технических целях), мы можем использовать метод УстановитьОбменДанными.Загрузка = Истина. Однако в стандартных бизнес-сценариях мы проанализируем использование функции НайтиСсылки().

Чтобы ускорить процесс, разберем следующий подход:

  1. Сначала получаем список всех помеченных объектов.
  2. Проверяем наличие ссылок только для тех объектов, которые мы реально собираемся удалить в текущей итерации.
  3. Используем индексацию реквизитов, по которым чаще всего происходит поиск (например, поле Владелец или Склад).

Новые режимы удаления в платформе 8.3.21+

В последних версиях платформы появился новый режим — "Ускоренное удаление". Он работает за счет оптимизации SQL-запросов к базе данных при поиске ссылок. Рассмотрим подробнее, как включить этот режим программно через установку свойств менеджера удаления.

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


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

Обработка не удаленных объектов

Часто проблема не в скорости удаления, а в том, что объекты "висят" годами, так как на них есть ссылки. Мы проанализируем ситуацию, как программно очистить ссылки на удаляемые объекты. Например, если старый документ ссылается на помеченную номенклатуру, нам нужно либо очистить этот реквизит, либо пометить на удаление и сам документ.

Разберем алгоритм очистки:

  1. Получаем таблицу ссылок через НайтиСсылки().
  2. Обходим таблицу и определяем типы данных.
  3. Для каждого найденного места использования вызываем процедуру очистки (если это допустимо логикой учета).

Практические советы по оптимизации

В завершение рассмотрим несколько практических советов, которые помогут сделать процесс эффективным:

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

← На главную