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