Как быстро и безопасно удалить неиспользуемые организации в 1С:ERP в режиме 24/7?

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

Удаление неиспользуемых организаций из крупной информационной базы 1С:ERP — сложнейшая задача. Ситуация усугубляется, если база работает в режиме 24/7, объем данных исчисляется сотнями гигабайт, а штатные механизмы удаления помеченных объектов вызывают критические блокировки СУБД и зависание системы. В этой статье мы подробно разберем, почему возникает эта проблема, какие опасные методы использовать категорически нельзя, и как по шагам реализовать безопасное и быстрое удаление лишних организаций.

В чем сложность удаления данных в 1С:ERP?

Конфигурация 1С:ERP имеет сложную архитектуру связей, из-за чего простое удаление документов одной организации "в лоб" практически невозможно. Проанализируем ключевые преграды:

  1. Связи «Интеркомпани» и перекрестные ссылки: Механизмы межфирменных продаж связывают документы разных организаций. Документ передачи товаров может одновременно содержать ссылки на удаляемую организацию-отправителя и остающуюся организацию-получателя. Механическое удаление нарушит целостность данных остающихся компаний.
  2. Ключи реестра документов: В 1С:ERP активно используется регистр сведений РеестрДокументов и справочник КлючиРеестраДокументов. Записи в этом регистре могут содержать ключ с удаляемой организацией, даже если сам связанный документ относится к остающейся организации.
  3. Присоединенные файлы внутри СУБД: Если сканы, договоры и файлы хранятся прямо в базе данных, таблицы СУБД раздуваются до огромных размеров. Любая транзакция удаления документов с файлами приводит к колоссальной нагрузке на дисковую подсистему.
  4. Блокировки таблиц при транзакциях: Массовое удаление затрагивает индексы крупных таблиц (регистров накопления и сведений). При работе пользователей в режиме 24/7 это неизбежно приводит к эскалации блокировок и аварийным завершениям сеансов.

Осторожно: вредные советы и опасные методы

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


ОбъектБД = СсылкаБД.ПолучитьОбъект();
ОбъектБД.ОбменДанными.Загрузка = Истина;
ОбъектБД.Удалить();

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

Аналогично не рекомендуется выполнять прямое удаление через SQL-запросы по GUID организации. База 1С:ERP слишком сложна, и ручное вычищение всех связанных таблиц на уровне СУБД гарантированно приведет к непредсказуемому поведению системы.

Стратегия 1. Каскадный алгоритм удаления порциями ("Ешьте слона по частям")

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

Разберем алгоритм по шагам:

Шаг 1. Перенос файлов во внешние тома. Если присоединенные файлы хранятся в СУБД, перед началом удаления обязательно настройте их хранение на диске (внешние тома) и запустите регламентное задание по их переносу. Это значительно уменьшит размер таблиц и ускорит транзакции удаления.

Шаг 2. Временное снятие дат запрета редактирования. Убедитесь, что для пользователя, под которым запускается обработка очистки, временно отключены даты запрета изменения данных прошлых периодов. Иначе платформа заблокирует любые изменения исторических документов.

Шаг 3. Каскадное удаление данных. Напишите обработку, которая будет последовательно очищать данные в следующем порядке:

  1. Документы удаляемых организаций. При программной пометке на удаление или непосредственном удалении документов платформа автоматически и корректно очистит все их движения во всех регистрах накопления и сведений. Для ускорения пометки на удаление можно использовать свойство ОбменДанными.Загрузка = Истина, так как оно безопасно при установке пометки (но не при физическом удалении!).
  2. Независимые регистры сведений. Очистите записи независимых регистров сведений, где одним из измерений выступает удаляемая организация.
  3. Подчиненные справочники. Программно удалите договоры контрагентов, банковские счета, соглашения и кассы, жестко привязанные к удаляемым организациям. Перед удалением проверяйте наличие ссылок методом НайтиПоСсылкам().
  4. Справочник «Организации». В самую последнюю очередь удаляйте сами элементы справочника Организации.

Пример кода для безопасной порционной пометки документов на удаление с задержкой (чтобы СУБД "успевала дышать" в режиме 24/7):


Выборка = Документы.РеализацияТоваровУслуг.Выбрать(); // Или запрос по конкретной организации
Пока Выборка.Следующий() Цикл
    Если Выборка.Организация = УдаляемаяОрганизация И Не Выборка.ПометкаУдаления Тогда
        ДокОбъект = Выборка.ПолучитьОбъект();
        ДокОбъект.ОбменДанными.Загрузка = Истина;
        ДокОбъект.УстановитьПометкуУдаления(Истина);
        
        // Делаем микропаузу каждые N документов для исключения блокировок
        Если КонтрольныйСчетчик % 100 = 0 Тогда
            Приостановить(1); // Приостанавливает выполнение на 1 секунду
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Стратегия 2. Ограничение доступа через RLS (Временное решение)

Если процесс удаления затягивается на недели из-за высокой нагрузки на базу, а пользователи продолжают работать, примените механизм разграничения доступа на уровне записей (RLS). Запретите доступ к удаляемым организациям для всех пользователей, кроме технической учетной записи, которая выполняет удаление. Это позволит "скрыть" ненужные данные из интерфейсов и отчетов мгновенно, а физическую очистку выполнять в фоновом режиме, медленно и без спешки.

Стратегия 3. Альтернативный перенос в новую чистую базу (Рекомендуемый метод)

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

  1. Создайте новую пустую базу той же конфигурации.
  2. Настройте перенос данных (например, через планы обмена по организациям, которые штатно появились в ERP начиная с версии 2.4, или универсальный обмен XML).
  3. Выгрузите в новую базу только нормативно-справочную информацию (НСИ) и документы по 3 остающимся нужным организациям за актуальный период (или перенесите остатки).

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

← На главную