В процессе работы с базами 1С:Предприятие пользователи и администраторы часто сталкиваются с ситуацией, когда количество объектов, помеченных на удаление, исчисляется тысячами или даже миллионами. Стандартная системная обработка «Удаление помеченных объектов» в таких случаях работает крайне медленно, так как перед удалением она обязана просканировать всю базу данных на наличие ссылок на каждый помеченный объект. Если нам нужно избавиться всего от одного конкретного элемента справочника или документа, ожидание окончания работы глобальной обработки становится нецелесообразным.
В этой статье мы разберем технические способы, которые позволяют выполнить быстрое точечное удаление объектов, проанализируем риски нарушения ссылочной целостности и научимся правильно использовать инструменты платформы для решения этой задачи.
Самый быстрый и радикальный способ — это использование метода Удалить() программного объекта. Как было отмечено в сообщениях форума, этот метод производит физическое удаление записи из таблицы базы данных мгновенно. Рассмотрим, как это выглядит в коде на примере справочника:
// Получаем объект по ссылке
ОбъектСсылка = Справочники.Номенклатура.НайтиПоКоду("00001");
Если Не ОбъектСсылка.Пустая() Тогда
// Получаем объект для редактирования
ОбъектДляУдаления = ОбъектСсылка.ПолучитьОбъект();
// Вызываем метод непосредственного удаления
ОбъектДляУдаления.Удалить();
Сообщить("Объект успешно удален из базы данных.");
КонецЕсли;
Важные нюансы метода Удалить():
DELETE к базе данных.Если нам нужно удалить объект более цивилизованно, но все еще быстро, проанализируем возможности глобальной функции УдалитьОбъекты(). Этот метод позволяет работать с массивом ссылок и предоставляет выбор: удалять объекты безусловно или с проверкой ссылок.
Рассмотрим пример кода, который позволяет удалить один или несколько объектов с контролем целостности:
// Создаем массив ссылок для удаления
МассивДляУдаления = Новый Массив;
МассивДляУдаления.Добавить(ОбъектСсылка);
// Параметры функции:
// 1. Массив ссылок
// 2. Проверять ссылки (Истина) или удалять безусловно (Ложь)
// 3. Таблица найденных ссылок (выходной параметр)
НайденныеСсылки = Новый ТаблицаЗначений;
УдалитьОбъекты(МассивДляУдаления, Истина, НайденныеСсылки);
Если НайденныеСсылки.Количество() > 0 Тогда
Сообщить("Объект нельзя удалить, так как на него есть ссылки в других местах базы!");
Иначе
Сообщить("Объект успешно и безопасно удален.");
КонецЕсли;
Этот метод предпочтительнее, так как он позволяет избежать появления «битых ссылок» (объектов с идентификатором, но без данных).
Чтобы действовать максимально осознанно, выясним причину, по которой объект может быть заблокирован для удаления. Перед вызовом метода Удалить() мы можем программно проверить, где используется наш элемент. Для этого используется метод НайтиСсылки().
Проанализируем пример реализации такой проверки:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(ВыбраннаяСсылка);
ТаблицаСсылок = НайтиСсылки(МассивСсылок);
Если ТаблицаСсылок.Количество() = 0 Тогда
// Если ссылок нет, удаляем объект без опасений
Объект = ВыбраннаяСсылка.ПолучитьОбъект();
Объект.Удалить();
Иначе
// Если ссылки есть, выведем информацию о том, где именно
Для Каждого Строка Из ТаблицаСсылок Цикл
Сообщить("Ссылка найдена в объекте: " + Строка.Данные);
КонецЦикла;
КонецЕсли;
Такой подход объединяет скорость индивидуального удаления и безопасность стандартной обработки.
В сообщении №12 затронута специфическая проблема: удаление дополнительного реквизита, который отображается зачеркнутым на форме. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) дополнительные реквизиты — это не просто поля таблиц, а записи в специальных ПВХ (Планах видов характеристик) и значения в табличных частях.
Если мы просто пометим на удаление элемент в справочнике «Дополнительные реквизиты и сведения», он действительно будет визуально зачеркнут. Чтобы полностью скрыть его с формы, необходимо:
Если вы не хотите писать код, разберем альтернативный вариант — использование внешних обработок. Наиболее популярной является «Универсальный подбор и обработка объектов». Она позволяет:
GUID или точному времени создания).Это избавляет от необходимости запускать глобальный поиск по всей базе данных, так как обработка работает только с выборкой, которую вы настроили.
Посмотрим на ситуацию со стороны стабильности системы. Почему коллеги на форуме иронизировали про «тазик с цементом»? Непосредственное удаление объекта, на который ссылаются другие данные, порождает битые ссылки.
Чем это грозит:
Если вы все же удалили объект и получили битые ссылки, исправить ситуацию поможет процедура «Тестирование и исправление» (ТиИ) в конфигураторе. Там следует выбрать режим «Очищать ссылки» или «Создавать объекты» для несуществующих ссылок.
Рассмотрев все варианты, мы можем составить оптимальный алгоритм действий для быстрого удаления одного объекта:
Объект.Удалить() в небольшой консоли кода.УдалитьОбъекты(Массив, Истина), чтобы платформа сама проверила связи.Соблюдение этих правил позволит вам экономить время и поддерживать базу данных в чистоте без риска ее повреждения.