Как правильно удалить организацию и связанные документы из базы 1С без нарушения целостности данных?

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

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

Что происходит при прямом удалении организации и последующем ТИИ

Рассмотрим сценарий, когда организация удаляется без контроля ссылочной целостности:


МассивСсылок = Новый Массив;
МассивСсылок.Добавить(Справочники.Организации.НайтиПоКоду("000000001"));
УдалитьОбъекты(МассивСсылок, Ложь);

Проанализируем последствия такого действия:

  1. Появление битых ссылок: Во всех документах, регистрах сведений, периодических реквизитах и константах значение удаленной организации превращается в объект вида <Объект не найден>.
  2. Результат работы ТИИ: При выборе опций «Очищать ссылки» или «Удалять объекты» процедура Тестирование и исправление очистит ссылки в реквизитах документов, сделав поле организации пустым. Сами документы при этом не удалятся, а движения по регистрам останутся в базе данных, что приведет к искажению отчетов и аналитики.
  3. Потеря событийных механизмов: Метод УдалитьОбъекты(..., Ложь) не вызывает обработчики событий модуля объекта ПередУдалением и ПриЗаписи, из-за чего сопутствующие записи в служебных регистрах остаются «висеть» в базе.

Причины ошибки «Не хватает памяти» при пакетном удалении документов

Посмотрим на типичную попытку циклического удаления документов по списку организаций:


Запрос = Новый Запрос;
Запрос.УстановитьПараметр("спОрганизаций", спОрганизаций);
Запрос.Текст = "ВЫБРАТЬ
               |    АвансовыйОтчет.Ссылка
               |ИЗ
               |    Документ.АвансовыйОтчет КАК АвансовыйОтчет
               |ГДЕ
               |    АвансовыйОтчет.Организация В(&спОрганизаций)";

МассивСсылок.Очистить();
тз = Запрос.Выполнить().Выгрузить();
Для Каждого стрТз Из тз Цикл
    МассивСсылок.Добавить(стрТз.Ссылка);
КонецЦикла;

УдалитьОбъекты(МассивСсылок, Ложь);

Выясним причину падения с ошибкой переполнения памяти при обработке десятков тысяч записей:

  1. Выгрузка в память: Метод Запрос.Выполнить().Выгрузить() формирует в оперативной памяти полную таблицу значений. Если документов сотни тысяч, 32-разрядный процесс быстро исчерпывает адресное пространство.
  2. Размер массива в транзакции: Передача массива из 26 000 и более элементов в процедуру УдалитьОбъекты заставляет СУБД удерживать массивные транзакционные блокировки и журнал транзакций.
  3. Очистка движений и пересчет итогов: При физическом удалении каждого документа платформа выполняет очистку записей в регистрах и пересчет итогов. Для ускорения процесса рекомендуется предварительно отключать расчет итогов по регистрам накопления и бухгалтерии.

Пошаговый алгоритм корректного удаления данных

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

  1. Анализ всех связанных объектов: Используем метод НайтиПоСсылкам() для выявления всех мест использования организации (включая табличные части, независимые регистры сведений и константы).
  2. Снятие с проведения и очистка движений: Перед непосредственным удалением документов очищаем наборы записей их движений по регистрам.
  3. Порционная обработка: Выбираем ссылки порциями по 500–1000 элементов с помощью явного управления транзакциями (НачатьТранзакцию() и ЗафиксироватьТранзакцию()).
  4. Удаление подчиненных справочников: Удаляем связанные справочники (банковские счета, кассы, подразделения организации, договоры).
  5. Удаление независимых регистров: Очищаем записи в регистрах сведений, где организация является измерением (например, учетная политика, ответственные лица).
  6. Удаление элемента справочника «Организации»: В последнюю очередь удаляем саму организацию штатным контролем ссылочной целостности.

Альтернативные архитектурные решения

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

  1. Выгрузка через РИБ с фильтрацией:

    Создаем план обмена с фильтрацией по организации. Формируем начальный образ дочернего узла — платформа самостоятельно включит в новую базу только документы и справочники нужных организаций. Затем в новой базе отвязываем узел от главного с помощью команды ПланыОбмена.УстановитьГлавныйУзел(Неопределено).

  2. Перенос данных в чистую базу:

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

  3. Штатная свертка информационной базы:

    Если организация закрыта исторически, выполняем штатную обработку «Свертка информационной базы» на определенную дату, после чего очищаем нулевые остатки.

← На главную