Что делать, если размер файла 1SBKTTL.DBF в 1С 7.7 приближается к 2 ГБ

Программист 1С v7.7 1С:Комплексная автоматизация Бухгалтерский учет Сфера услуг, туризм и социальный сектор
← На главную

Проблема достижения файлом 1SBKTTL.DBF предела в 2 Гб является критической для пользователей платформы 1С:Предприятие 7.7. Этот файл отвечает за хранение рассчитанных бухгалтерских итогов (остатков и оборотов) в разрезе периодов и объектов аналитики (субконто). Как только размер файла или его индекса перешагивает порог в 2,14 Гб, система теряет возможность записывать новые данные, что приводит к аварийному завершению работы. Разберем подробно, как диагностировать причины роста этого файла и какие шаги предпринять для решения проблемы.

Анализируем причины роста файла итогов

Прежде всего, нам необходимо понять механику работы этого файла. В отличие от оперативных регистров, 1SBKTTL хранит итоги поквартально. Если по какой-то комбинации счета и субконто хотя бы раз возникло движение, запись об этом будет копироваться в каждый последующий квартал, пока существует ненулевой остаток. Если же аналитика "не закрывается" (например, на одном субконто висит +1 коп., а на другом -1 коп.), файл начинает раздуваться в геометрической прогрессии.

Проанализируем ситуацию, описанную в теме: автор заметил скачкообразный рост файла (68 МБ в месяц). Это часто связано с открытием нового бухгалтерского периода (квартала) или массовым перепроведением документов, которые порождают новые комбинации аналитики.

Шаг 1. Диагностика "раздутых" счетов

Выясним, какие именно счета вносят наибольший вклад в объем файла.

  1. Сформируем общую Оборотно-сальдовую ведомость (ОСВ) за один день (например, первый день текущего квартала).
  2. Обязательно включим в отчет забалансовые счета.
  3. Для каждого счета в ОСВ выведем расшифровку по всем уровням субконто.
  4. Критический показатель: если по какому-то счету отчет выводит тысячи строк при визуально "нулевом" или незначительном сальдо — это и есть источник проблемы. Для более глубокого изучения проводок можно использовать анализатор запросов.

В рассматриваемом примере выяснилось, что 65% записей файла занимал 24 счет ("Брак в производстве"), который годами не списывался полностью в разрезе партий. Еще 26% занимал счет 29.1.1 ("Запчасти в готовых изделиях"). Проанализируем это: если общее сальдо по счету равно нулю, а развернутое по субконто — нет, значит, аналитика "расползается".

Шаг 2. Оптимизация аналитики (Субконто)

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

Вариант А. Оборотные субконто. Если для учета на определенном счете (например, на счете затрат или брака) нам важно знать, сколько пришло и ушло в течение периода, но не важны остатки в разрезе каждой конкретной партии, мы можем сделать субконто "Оборотным".

Для этого в Конфигураторе в плане счетов выберем нужный счет, найдем нужное субконто (например, "Партии") и установим признак Только обороты. После этого система перестанет хранить остатки в разрезе этого субконто в файле 1SBKTTL, что радикально уменьшит его размер после пересчета итогов.

Вариант Б. Удаление лишней аналитики. Если какая-то аналитика была добавлена "на будущее", но реально не используется в отчетах, ее следует удалить из плана счетов. Помните: каждое лишнее субконто на активном счете — это множитель количества строк в таблице итогов.

Шаг 3. Исправление "кривых" проводок

Часто причиной роста файла становится техническая ошибка в коде проведения документов. Разберем ситуацию с "пустыми скобками" < >. Это происходит, когда при поступлении товара была указана конкретная партия, а при списании поле партии осталось пустым.

В результате в итогах висит две строки:

Для 1С это две разные записи в файле 1SBKTTL. Чтобы исправить это, необходимо написать обработку, которая найдет такие пары и "схлопнет" их. Посмотрим на пример кода для исправления подобных ситуаций:


// Пример упрощенной логики для зануления ненужной аналитики
Опер = СоздатьОбъект("Операция");
Опер.ВыбратьОперацииСПроводками(ДатаНачала, ДатаКонца, "24, 23");
Пока Опер.ПолучитьОперацию() = 1 Цикл
    ФлагИзменения = 0;
    Опер.ВыбратьПроводки();
    Пока Опер.ПолучитьПроводку() = 1 Цикл
        // Если субконто Партия заполнено, но оно нам не нужно для итогов
        Если ПустоеЗначение(Опер.Дебет.Субконто(3)) = 0 Тогда
            Опер.Дебет.Субконто(3, ""); // Зануляем аналитику
            ФлагИзменения = 1;
        КонецЕсли;
    КонецЦикла;
    Если ФлагИзменения = 1 Тогда
        Опер.Записать(); // Сохраняем операцию с исправленными проводками
    КонецЕсли;
КонецЦикла;

Шаг 4. Технические приемы обслуживания базы

Когда мы исправили аналитику и проводки, размер файла 1SBKTTL.DBF сам по себе не уменьшится. Нам нужно "пересобрать" таблицу итогов. Разберем, как это сделать правильно и быстро.

  1. Выгрузка и загрузка данных. Это самый эффективный способ. Через Администрирование -> Выгрузка данных создаем архив (ZIP/V7), затем в пустую папку делаем Загрузку. При загрузке 1С пересчитывает итоги "с нуля" и создает максимально компактные DBF-файлы.
  2. Упаковка таблиц. Если выгрузка невозможна, используйте Тестирование и исправление -> Упаковка таблиц или внешние утилиты для сжатия DBF-файлов. Это удалит записи, помеченные на удаление, но не пересчитает итоги так эффективно, как перезагрузка.
  3. Ускорение процесса (RAM-диск). Если пересчет итогов длится несколько дней, создадим виртуальный диск в оперативной памяти (RAMDrive) объемом 3-4 ГБ, скопируем туда базу и запустим пересчет там. Скорость работы с памятью в десятки раз выше, чем с HDD/SSD, что позволит сократить время пересчета с 4 дней до нескольких часов.

Шаг 5. Радикальные меры

Если оптимизация учета не помогает (данных объективно слишком много), рассмотрим альтернативные пути:

Переход на SQL-версию. В версии 1С 7.7 для SQL лимит в 2 ГБ отсутствует, так как данные хранятся в таблицах Microsoft SQL Server. Это "принципиальное" решение проблемы, однако оно требует смены лицензии (или использования патчей) и наличия сервера.

Свертка базы данных. Используем специализированные обработки (например, WRAP.ert). Свертка обрезает историю документов за прошлые годы, заменяя их входящими остатками на начало выбранного года. Это физически удаляет движения из базы, а значит, и лишние записи из таблицы итогов.

Использование патчей для DBF. Существуют неофициальные патчи (например, dbeng32.dll от Wirth), которые позволяют 1С 7.7 работать с файлами DBF более 2 ГБ. Это рискованный путь, так как сторонние утилиты (архиваторы, редакторы DBF) могут по-прежнему не понимать такие файлы, но в качестве временной "пожарной" меры это часто помогает спасти вставшую базу.

Резюме и рекомендации

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

  1. Найти счета-виновники через ОСВ с максимальной детализацией.
  2. Исправить алгоритмы проведения документов, чтобы не плодились пустые или некорректные субконто.
  3. По возможности сделать субконто на счетах затрат и производства "оборотными".
  4. Выполнить полную "Выгрузку-Загрузку" базы для физического сжатия файлов.
  5. Если база все еще велика — планировать переход на SQL или делать свертку базы.

Помните, что работа с файлами на грани 2 Гб крайне опасна — всегда делайте архивную копию перед любыми манипуляциями с таблицами 1SBKTTL и 1SENTRY.

← На главную