При необходимости удалить организацию из рабочей базы 1С у разработчиков часто возникает соблазн применить прямое удаление через функцию УдалитьОбъекты() с последующим запуском процедуры Тестирование и исправление (ТИИ). Разберем, к каким последствиям приводит такой подход, почему возникает ошибка «Не хватает памяти» при массовом удалении документов, и какие альтернативные способы решения задачи существуют.
Рассмотрим сценарий, когда организация удаляется без контроля ссылочной целостности:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(Справочники.Организации.НайтиПоКоду("000000001"));
УдалитьОбъекты(МассивСсылок, Ложь);
Проанализируем последствия такого действия:
<Объект не найден>.УдалитьОбъекты(..., Ложь) не вызывает обработчики событий модуля объекта ПередУдалением и ПриЗаписи, из-за чего сопутствующие записи в служебных регистрах остаются «висеть» в базе.Посмотрим на типичную попытку циклического удаления документов по списку организаций:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("спОрганизаций", спОрганизаций);
Запрос.Текст = "ВЫБРАТЬ
| АвансовыйОтчет.Ссылка
|ИЗ
| Документ.АвансовыйОтчет КАК АвансовыйОтчет
|ГДЕ
| АвансовыйОтчет.Организация В(&спОрганизаций)";
МассивСсылок.Очистить();
тз = Запрос.Выполнить().Выгрузить();
Для Каждого стрТз Из тз Цикл
МассивСсылок.Добавить(стрТз.Ссылка);
КонецЦикла;
УдалитьОбъекты(МассивСсылок, Ложь);
Выясним причину падения с ошибкой переполнения памяти при обработке десятков тысяч записей:
Запрос.Выполнить().Выгрузить() формирует в оперативной памяти полную таблицу значений. Если документов сотни тысяч, 32-разрядный процесс быстро исчерпывает адресное пространство.УдалитьОбъекты заставляет СУБД удерживать массивные транзакционные блокировки и журнал транзакций.Разберем по шагам правильную последовательность действий для полной очистки базы от организации:
НайтиПоСсылкам() для выявления всех мест использования организации (включая табличные части, независимые регистры сведений и константы).НачатьТранзакцию() и ЗафиксироватьТранзакцию()).Если объем удаляемых данных огромен, ручная очистка скриптами может занять слишком много времени и нести риск повреждения ссылочной целостности. Рассмотрим более надежные варианты:
Создаем план обмена с фильтрацией по организации. Формируем начальный образ дочернего узла — платформа самостоятельно включит в новую базу только документы и справочники нужных организаций. Затем в новой базе отвязываем узел от главного с помощью команды ПланыОбмена.УстановитьГлавныйУзел(Неопределено).
Разворачиваем пустую конфигурацию и переносим остатки и справочную информацию только по активным организациям с помощью правил конвертации данных.
Если организация закрыта исторически, выполняем штатную обработку «Свертка информационной базы» на определенную дату, после чего очищаем нулевые остатки.