При обслуживании или свертке информационных баз 1С:Предприятия 7.7 нередко возникает задача оставить в информационной базе только один вид документов или очистить историю за прошлые периоды. Попытка ускорить этот процесс путем прямого удаления файлов таблиц .dbf из каталога базы данных неизбежно приводит к нарушению логической и ссылочной структуры. Разберем подробно, как устроен механизм хранения данных в платформе 7.7, почему прямое вмешательство в файлы разрушает базу и какими методами можно корректно решить эту задачу.
Проанализируем структуру хранения данных в файловых базах 1С 7.7. Сведения о документах распределены по множеству связанных между собой таблиц:
1CJOURN.dbf — общий журнал документов, где хранятся метаданные (вид документа, дата, номер, флаги проведения и пометки на удаление).DH<ID>.dbf и DT<ID>.dbf — таблицы реквизитов шапки и строк табличной части конкретного вида документа.1SCRDOC.dbf — журнал подчиненных документов и ссылок документов-оснований.1SOPER.dbf и 1SACCSTR.dbf — бухгалтерские операции и проводки.RA<ID>.dbf и RG<ID>.dbf — движения и итоги регистров оперативного учета.1SPROPS.dbf — история периодических реквизитов, измененных документами.Если удалить только файлы шапок DH*.dbf, записи в общем журнале 1CJOURN.dbf остаются. В интерфейсе документы отображаются пустыми строками, а открытие их формы вызывает критические ошибки. Если же удалить сам журнал 1CJOURN.dbf, платформа полностью теряет указатели на документы, хотя их движения в регистрах и проводках продолжают существовать. Индексные файлы .cdx перестают соответствовать таблицам, что приводит к полной потере ссылочной целостности.
В ситуациях, когда из объемной базы требуется оставить лишь один вид документов и связанную с ним нормативно-справочную информацию, самым быстрым и безопасным решением является перенос данных в новую пустую базу.
Разберем по шагам порядок действий:
1Cv7.MD).Этот подход гарантирует отсутствие «мусорных» записей, битых ссылок и зависших движений регистров.
Если создание новой базы не подходит и необходимо очистить текущую базу от всех документов, кроме определенного вида, используем программную обработку. Выясним причину частой ошибки при пакетном удалении: если обходить документы через ВыбратьДокументы() и внутри цикла вызывать Удалить(1), в файловой версии 1С 7.7 происходит сдвиг указателя выборки, из-за чего часть документов пропускается.
Чтобы избежать этой проблемы, сначала соберем список ссылок на удаляемые документы в массив или список значений, а затем удалим их в отдельном цикле. Для существенного ускорения работы объединим операции в транзакции.
Посмотрим на пример правильной обработки:
Процедура ОчиститьДокументы()
Перем Док, СписокДокументов, Сч, Всего;
СписокДокументов = СоздатьОбъект("СписокЗначений");
Док = СоздатьОбъект("Документ");
Сообщить("Сбор списка документов для удаления...");
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент() = 1 Цикл
// Пропускаем нужный вид документов
Если Док.Вид() = "НужныйВидДокумента" Тогда
Продолжить;
КонецЕсли;
СписокДокументов.ДобавитьЗначение(Док.ТекущийДокумент());
КонецЦикла;
Всего = СписокДокументов.РазмерСписка();
Сообщить("Найдено документов для удаления: " + Строка(Всего));
Если Всего = 0 Тогда
Возврат;
КонецЕсли;
// Удаление документов порциями в транзакциях
НачатьТранзакцию();
Для Сч = 1 По Всего Цикл
Если Док.НайтиДокумент(СписокДокументов.ПолучитьЗначение(Сч)) = 1 Тогда
// Снимаем с проведения перед удалением при необходимости
Если Док.Проведен() = 1 Тогда
Док.СделатьНеПроведенным();
КонецЕсли;
// Физическое удаление объекта и всех его движений
Док.Удалить(1);
КонецЕсли;
// Фиксация порциями по 500 документов для экономии памяти
Если Сч % 500 = 0 Тогда
ЗафиксироватьТранзакцию();
Состояние("Удалено документов: " + Строка(Сч) + " из " + Строка(Всего));
НачатьТранзакцию();
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Предупреждение("Удаление завершено. Обязательно выполните Тестирование и исправление ИБ!");
КонецПроцедуры
Проанализируем особенности формата DBF: физическое удаление записей встроенными средствами платформы Удалить(1) не уменьшает размер файлов на диске, а только устанавливает признак удаления записи. Чтобы физически сжать таблицы, пересчитать итоги и исправить возможные ссылочные нарушения, выполним следующие шаги: