Как правильно удалить ненужные документы в 1С 7.7 и почему нельзя удалять файлы DBF вручную?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При обслуживании или свертке информационных баз 1С:Предприятия 7.7 нередко возникает задача оставить в информационной базе только один вид документов или очистить историю за прошлые периоды. Попытка ускорить этот процесс путем прямого удаления файлов таблиц .dbf из каталога базы данных неизбежно приводит к нарушению логической и ссылочной структуры. Разберем подробно, как устроен механизм хранения данных в платформе 7.7, почему прямое вмешательство в файлы разрушает базу и какими методами можно корректно решить эту задачу.

Почему нельзя удалять файлы DBF вручную через проводник

Проанализируем структуру хранения данных в файловых базах 1С 7.7. Сведения о документах распределены по множеству связанных между собой таблиц:

  1. 1CJOURN.dbf — общий журнал документов, где хранятся метаданные (вид документа, дата, номер, флаги проведения и пометки на удаление).
  2. DH<ID>.dbf и DT<ID>.dbf — таблицы реквизитов шапки и строк табличной части конкретного вида документа.
  3. 1SCRDOC.dbf — журнал подчиненных документов и ссылок документов-оснований.
  4. 1SOPER.dbf и 1SACCSTR.dbf — бухгалтерские операции и проводки.
  5. RA<ID>.dbf и RG<ID>.dbf — движения и итоги регистров оперативного учета.
  6. 1SPROPS.dbf — история периодических реквизитов, измененных документами.

Если удалить только файлы шапок DH*.dbf, записи в общем журнале 1CJOURN.dbf остаются. В интерфейсе документы отображаются пустыми строками, а открытие их формы вызывает критические ошибки. Если же удалить сам журнал 1CJOURN.dbf, платформа полностью теряет указатели на документы, хотя их движения в регистрах и проводках продолжают существовать. Индексные файлы .cdx перестают соответствовать таблицам, что приводит к полной потере ссылочной целостности.

Способ 1. Перенос необходимых данных в чистую информационную базу

В ситуациях, когда из объемной базы требуется оставить лишь один вид документов и связанную с ним нормативно-справочную информацию, самым быстрым и безопасным решением является перенос данных в новую пустую базу.

Разберем по шагам порядок действий:

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

Этот подход гарантирует отсутствие «мусорных» записей, битых ссылок и зависших движений регистров.

Способ 2. Программное удаление документов через встроенный язык 1С 7.7

Если создание новой базы не подходит и необходимо очистить текущую базу от всех документов, кроме определенного вида, используем программную обработку. Выясним причину частой ошибки при пакетном удалении: если обходить документы через ВыбратьДокументы() и внутри цикла вызывать Удалить(1), в файловой версии 1С 7.7 происходит сдвиг указателя выборки, из-за чего часть документов пропускается.

Чтобы избежать этой проблемы, сначала соберем список ссылок на удаляемые документы в массив или список значений, а затем удалим их в отдельном цикле. Для существенного ускорения работы объединим операции в транзакции.

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


Процедура ОчиститьДокументы()
    Перем Док, СписокДокументов, Сч, Всего;
    
    СписокДокументов = СоздатьОбъект("СписокЗначений");
    Док = СоздатьОбъект("Документ");
    
    Сообщить("Сбор списка документов для удаления...");
    Док.ВыбратьДокументы();
    Пока Док.ПолучитьДокумент() = 1 Цикл
        // Пропускаем нужный вид документов
        Если Док.Вид() = "НужныйВидДокумента" Тогда
            Продолжить;
        КонецЕсли;
        
        СписокДокументов.ДобавитьЗначение(Док.ТекущийДокумент());
    КонецЦикла;
    
    Всего = СписокДокументов.РазмерСписка();
    Сообщить("Найдено документов для удаления: " + Строка(Всего));
    
    Если Всего = 0 Тогда
        Возврат;
    КонецЕсли;
    
    // Удаление документов порциями в транзакциях
    НачатьТранзакцию();
    Для Сч = 1 По Всего Цикл
        Если Док.НайтиДокумент(СписокДокументов.ПолучитьЗначение(Сч)) = 1 Тогда
            // Снимаем с проведения перед удалением при необходимости
            Если Док.Проведен() = 1 Тогда
                Док.СделатьНеПроведенным();
            КонецЕсли;
            
            // Физическое удаление объекта и всех его движений
            Док.Удалить(1);
        КонецЕсли;
        
        // Фиксация порциями по 500 документов для экономии памяти
        Если Сч % 500 = 0 Тогда
            ЗафиксироватьТранзакцию();
            Состояние("Удалено документов: " + Строка(Сч) + " из " + Строка(Всего));
            НачатьТранзакцию();
        КонецЕсли;
    КонецЦикла;
    ЗафиксироватьТранзакцию();
    
    Предупреждение("Удаление завершено. Обязательно выполните Тестирование и исправление ИБ!");
КонецПроцедуры

Обязательные действия после пакетного удаления документов

Проанализируем особенности формата DBF: физическое удаление записей встроенными средствами платформы Удалить(1) не уменьшает размер файлов на диске, а только устанавливает признак удаления записи. Чтобы физически сжать таблицы, пересчитать итоги и исправить возможные ссылочные нарушения, выполним следующие шаги:

  1. Запускаем 1С:Предприятие 7.7 в режиме Конфигуратор в монопольном режиме.
  2. Открываем пункт меню Администрирование — Тестирование и исправление ИБ.
  3. Устанавливаем все флаги проверки, в том числе:
    1. Проверка физической целостности;
    2. Реиндексация;
    3. Проверка логической целостности;
    4. Упаковка таблиц информационной базы (именно эта опция освобождает место на диске);
    5. Пересчет итогов.
  4. В переключателях при наличии ссылок на несуществующие объекты выбираем вариант Очищать ссылки, а при частичной потере данных — Удалять данные объектов.
  5. Нажимаем кнопку Выполнить и дожидаемся завершения процесса.
  6. После исправления проверяем положение точки актуальности (ТА) и при необходимости устанавливаем ее на дату последнего проведенного документа через пункт меню Операции — Управление итогами.
← На главную