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

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

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

Метод 1. Использование подсистемы «Инструменты разработчика» (ИР)

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

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

Метод 2. Поиск неиспользуемых элементов прямым запросом (Левое соединение)

Стандартный системный метод поиска ссылок может выполняться слишком долго на базах объемом от 50–60 ГБ. В таких случаях эффективнее написать целевой запрос, проверяющий наличие элементов в регистрах накопления, сведений или табличных частях ключевых документов.

Рассмотрим пример запроса для поиска элементов справочника Номенклатура, которые не участвовали в оборотах регистра Закупки:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки.Обороты КАК ЗакупкиОбороты
    |	ПО Номенклатура.Ссылка = ЗакупкиОбороты.Номенклатура
    |ГДЕ
    |	ЗакупкиОбороты.Номенклатура ЕСТЬ NULL
    |	И НЕ Номенклатура.ЭтоГруппа";

Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    // Логика пометки на удаление найденного элемента
КонецЦикла;

Выборка элементов с результатом NULL в левом соединении позволяет быстро отфильтровать элементы, так как СУБД использует индексы существующих таблиц, а не сканирует всю конфигурацию.

Метод 3. Использование метода платформы НайтиПоСсылкам

В платформе 1С предусмотрен встроенный метод глобального контекста НайтиПоСсылкам:


МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаОбъект);

НайденныеСсылки = НайтиПоСсылкам(МассивСсылок);
Если НайденныеСсылки.Количество() = 0 Тогда
    // На объект нет ссылок в базе
КонецЕсли;

Важное ограничение: метод НайтиПоСсылкам выполняет сканирование всех таблиц информационной базы, допускающих хранение проверяемого типа. На базах MS SQL / PostgreSQL размером в десятки гигабайт это приводит к длительному выполнению и высокой нагрузке на дисковый ввод-вывод. Для ускорения необходимо жестко ограничивать область поиска с помощью параметров ОбластьПоиска и ВключитьОбъекты, либо использовать альтернативные функции БСП, такие как ОбщегоНазначения.ЕстьСсылкиНаОбъект.

Проблема блокировок при массовой и параллельной пометке на удаление

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

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

Для предотвращения блокировок при чистке крупных баз рекомендуем выполнять обработку порциями (пакетами по 500–1000 элементов) в рамках отдельных транзакций, а при возможности — проводить работы в монопольном режиме с временным отключением служебных подписок на события и версионирования.

← На главную