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

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

При работе с крупными информационными базами 1С, особенно в конфигурациях на базе БСП (например, УТ 11, ERP или КА), часто возникает ситуация, когда объем присоединенных файлов (изображения номенклатуры, сканы документов, Excel-файлы) достигает критических значений. Стандартное удаление помеченных объектов при количестве записей около 1 000 000 может занимать дни, что неприемлемо для бизнеса. В этой статье мы разберем, как очистить базу данных максимально быстро, не нарушив её целостность.

Анализ структуры хранения: где на самом деле лежат файлы?

Прежде чем приступать к удалению, проанализируем, как 1С хранит файлы в SQL-базе. Начиная с версии БСП 2.0, данные разнесены по разным таблицам. Просто очистить справочник присоединенных файлов недостаточно. Рассмотрим структуру подробнее:

  1. Справочники метаданных: Например, Справочник.НоменклатураПрисоединенныеФайлы. Здесь хранятся только карточки файлов: имя, автор, дата создания и ссылка на владельца.
  2. Регистры сведений (двоичные данные): Сами "тяжелые" данные (бинарный код картинки или документа) чаще всего хранятся в регистре сведений ПрисоединенныеФайлы или ХранилищеФайлов. Очистка записей регистров в этом случае становится приоритетной задачей. В SQL это таблицы с именами типа _InfoRg..., и именно в них находится поле BinaryData (тип image или varbinary(max)), которое и раздувает базу.
  3. Версионирование: Если в системе включено версионирование файлов, данные могут дублироваться в справочнике ВерсииФайлов.

Выясним причину "разбухания" базы, прежде чем что-то удалять. Для этого в SQL Management Studio воспользуемся стандартным отчетом или применим SQL Базомер для анализа дискового пространства. Если мы видим, что таблицы регистров сведений, связанных с файлами, занимают десятки гигабайт — пора приступать к очистке.

Метод 1: Прямое удаление через SQL (самый быстрый способ)

Этот метод считается "мгновенным", так как команда TRUNCATE или DELETE на уровне СУБД работает в обход объектной логики 1С. Рассмотрим алгоритм действий:

Шаг 1. Определяем имена таблиц. Для этого можно использовать консоль запросов или обработку Структура хранения БД. Нам нужно найти таблицы, соответствующие справочникам присоединенных файлов и регистрам хранения двоичных данных.

Шаг 2. Очистка таблиц. Если мы уверены, что нам нужно удалить абсолютно все файлы, используем команду TRUNCATE TABLE. Она не пишет детальный лог транзакций, поэтому выполняется моментально.


-- ПРИМЕР ДЛЯ SQL (Имена таблиц условные, уточните свои через структуру хранения)
TRUNCATE TABLE _Reference150; -- Справочник присоединенных файлов
TRUNCATE TABLE _InfoRg20531; -- Регистр со двоичными данными

Внимание: Использование TRUNCATE опасно тем, что в документах-владельцах останутся "битые" ссылки. Пользователь увидит надпись "Объект не найден" при попытке открыть файл. Перед выполнением обязательно сделайте бэкап!

Метод 2: Оптимизированное удаление средствами 1С

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

Вместо метода УстановитьПометкуУдаления() используем метод Удалить(). Это позволит избежать долгой стадии поиска ссылок в регламентном задании. Проанализируем пример кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	НоменклатураПрисоединенныеФайлы.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

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

Установка параметра ОбменДанными.Загрузка = Истина позволяет пропустить часть подписок на события и существенно ускорить процесс. Однако помните, что даже в таком режиме 900 000 записей могут удаляться несколько часов.

Особенности работы в распределенных базах (РИБ)

Проанализируем ситуацию, когда у нас есть 10 и более узлов РИБ. Это критический момент. Если вы удалите файлы напрямую через SQL, механизмы регистрации изменений 1С об этом не узнают. В результате:

Рекомендация: При массовом удалении в РИБ лучше всего выполнить процедуру очистки на каждом узле отдельно через SQL, предварительно отключив регистрацию изменений для этих таблиц, чтобы не перегружать каналы связи сообщениями об обмене.

Метод 3: Безопасная альтернатива — перенос в тома

Если ваша цель — уменьшить размер SQL-базы, но вы боитесь удалять данные навсегда, рассмотрим штатный функционал "Хранение файлов в томах на диске". Это самый правильный путь с точки зрения архитектуры 1С.

  1. Создайте папку (том) на сервере с доступом для службы 1С.
  2. В настройках системы (Администрирование - Настройки файлов) укажите использование томов.
  3. Запустите типовую обработку "Перенос файлов в тома".

После завершения процесса все "тяжелые" данные уйдут из SQL-таблиц в файлы на жестком диске. База станет легкой, а файлы на диске (если они действительно не нужны) можно будет удалить мгновенно обычными средствами операционной системы (например, командой rm -rf или Shift+Del).

Завершение: Сжатие базы после удаления

Важно понимать: после удаления миллионов строк размер файла базы данных (.mdf) сам по себе не уменьшится. SQL Server просто пометит это место как свободное внутри файла. Чтобы реально вернуть место операционной системе, выполним Shrink.

Посмотрим, как это сделать в SQL Management Studio:

  1. Нажмите правой кнопкой на базу данных.
  2. Выберите Задачи (Tasks) -> Сжать (Shrink) -> База данных (Database).
  3. Также не забудьте выполнить Shrink Log, так как при массовом удалении через DELETE файл лога транзакций (.ldf) может вырасти в несколько раз.

Если вы используете файловую версию базы, обязательно запустите утилиту chdbfl.exe или выполните "Сжатие таблиц" через конфигуратор в режиме "Тестирование и исправление". Это единственный способ физически уменьшить размер файла 1Cv8.1CD.

Таким образом, мы выяснили, что для мгновенного результата лучше использовать SQL Truncate (с осторожностью), а для сохранения стабильности в РИБ — перенос в тома с последующей очисткой папок. Выбор метода зависит от критичности сохранения ссылочной целостности и наличия свободного времени на обслуживание системы.

← На главную