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

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

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

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

Способ 1. Программное непосредственное удаление через метод Удалить()

Самый быстрый и радикальный способ — это использование метода Удалить() программного объекта. Как было отмечено в сообщениях форума, этот метод производит физическое удаление записи из таблицы базы данных мгновенно. Рассмотрим, как это выглядит в коде на примере справочника:


// Получаем объект по ссылке
ОбъектСсылка = Справочники.Номенклатура.НайтиПоКоду("00001");
Если Не ОбъектСсылка.Пустая() Тогда
    // Получаем объект для редактирования
    ОбъектДляУдаления = ОбъектСсылка.ПолучитьОбъект();
    // Вызываем метод непосредственного удаления
    ОбъектДляУдаления.Удалить();
    Сообщить("Объект успешно удален из базы данных.");
КонецЕсли;

Важные нюансы метода Удалить():

  1. Отсутствие проверок: Платформа не проверяет, используется ли этот объект в других документах, регистрах или справочниках. Если вы удалите товар, который уже продан в десяти накладных, в этих накладных вместо названия товара появится надпись «Объект не найден».
  2. Иерархия: Если вы удаляете группу в иерархическом справочнике, платформа автоматически попытается удалить и все подчиненные элементы.
  3. Скорость: Это самый быстрый метод, так как он транслируется в прямой SQL-запрос DELETE к базе данных.

Способ 2. Использование глобальной функции УдалитьОбъекты()

Если нам нужно удалить объект более цивилизованно, но все еще быстро, проанализируем возможности глобальной функции УдалитьОбъекты(). Этот метод позволяет работать с массивом ссылок и предоставляет выбор: удалять объекты безусловно или с проверкой ссылок.

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


// Создаем массив ссылок для удаления
МассивДляУдаления = Новый Массив;
МассивДляУдаления.Добавить(ОбъектСсылка);

// Параметры функции: 
// 1. Массив ссылок
// 2. Проверять ссылки (Истина) или удалять безусловно (Ложь)
// 3. Таблица найденных ссылок (выходной параметр)

НайденныеСсылки = Новый ТаблицаЗначений;
УдалитьОбъекты(МассивДляУдаления, Истина, НайденныеСсылки);

Если НайденныеСсылки.Количество() > 0 Тогда
    Сообщить("Объект нельзя удалить, так как на него есть ссылки в других местах базы!");
Иначе
    Сообщить("Объект успешно и безопасно удален.");
КонецЕсли;

Этот метод предпочтительнее, так как он позволяет избежать появления «битых ссылок» (объектов с идентификатором, но без данных).

Способ 3. Поиск ссылок перед удалением (НайтиСсылки)

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

Проанализируем пример реализации такой проверки:


МассивСсылок = Новый Массив;
МассивСсылок.Добавить(ВыбраннаяСсылка);
ТаблицаСсылок = НайтиСсылки(МассивСсылок);

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

Такой подход объединяет скорость индивидуального удаления и безопасность стандартной обработки.

Особенности удаления дополнительных реквизитов

В сообщении №12 затронута специфическая проблема: удаление дополнительного реквизита, который отображается зачеркнутым на форме. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) дополнительные реквизиты — это не просто поля таблиц, а записи в специальных ПВХ (Планах видов характеристик) и значения в табличных частях.

Если мы просто пометим на удаление элемент в справочнике «Дополнительные реквизиты и сведения», он действительно будет визуально зачеркнут. Чтобы полностью скрыть его с формы, необходимо:

  1. Зайти в настройки дополнительных реквизитов для конкретного типа объекта (например, справочника «Номенклатура»).
  2. Исключить этот реквизит из списка доступных для данного набора.
  3. Только после этого выполнять физическое удаление самого элемента ПВХ программным способом, описанным выше.

Использование внешних инструментов

Если вы не хотите писать код, разберем альтернативный вариант — использование внешних обработок. Наиболее популярной является «Универсальный подбор и обработка объектов». Она позволяет:

Это избавляет от необходимости запускать глобальный поиск по всей базе данных, так как обработка работает только с выборкой, которую вы настроили.

Риски и последствия непосредственного удаления

Посмотрим на ситуацию со стороны стабильности системы. Почему коллеги на форуме иронизировали про «тазик с цементом»? Непосредственное удаление объекта, на который ссылаются другие данные, порождает битые ссылки.

Чем это грозит:

  1. Ошибки в отчетах: Группировки по удаленному объекту будут выдавать пустые строки или ошибки исполнения.
  2. Проблемы при проведении документов: Если документ ссылается на удаленный склад или товар, попытка его перепроведения может закончиться критической ошибкой платформы.
  3. Некорректная работа бизнес-логики: Алгоритмы, ожидающие наличие объекта, могут работать непредсказуемо.

Если вы все же удалили объект и получили битые ссылки, исправить ситуацию поможет процедура «Тестирование и исправление» (ТиИ) в конфигураторе. Там следует выбрать режим «Очищать ссылки» или «Создавать объекты» для несуществующих ссылок.

Выводы и рекомендации

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

  1. Оцените риск: Если вы на 100% уверены, что объект новый и на него нет ссылок, используйте метод Объект.Удалить() в небольшой консоли кода.
  2. Используйте безопасность: В большинстве случаев лучше потратить лишнюю секунду и применить УдалитьОбъекты(Массив, Истина), чтобы платформа сама проверила связи.
  3. Выборочное удаление в 8.3: Помните, что в актуальных версиях платформы стандартная обработка позволяет перейти в режим «Выборочное удаление», где можно вручную отметить только нужные элементы, не дожидаясь полного анализа всей базы.

Соблюдение этих правил позволит вам экономить время и поддерживать базу данных в чистоте без риска ее повреждения.

← На главную