Проблема достижения файлом 1SBKTTL.DBF предела в 2 Гб является критической для пользователей платформы 1С:Предприятие 7.7. Этот файл отвечает за хранение рассчитанных бухгалтерских итогов (остатков и оборотов) в разрезе периодов и объектов аналитики (субконто). Как только размер файла или его индекса перешагивает порог в 2,14 Гб, система теряет возможность записывать новые данные, что приводит к аварийному завершению работы. Разберем подробно, как диагностировать причины роста этого файла и какие шаги предпринять для решения проблемы.
Прежде всего, нам необходимо понять механику работы этого файла. В отличие от оперативных регистров, 1SBKTTL хранит итоги поквартально. Если по какой-то комбинации счета и субконто хотя бы раз возникло движение, запись об этом будет копироваться в каждый последующий квартал, пока существует ненулевой остаток. Если же аналитика "не закрывается" (например, на одном субконто висит +1 коп., а на другом -1 коп.), файл начинает раздуваться в геометрической прогрессии.
Проанализируем ситуацию, описанную в теме: автор заметил скачкообразный рост файла (68 МБ в месяц). Это часто связано с открытием нового бухгалтерского периода (квартала) или массовым перепроведением документов, которые порождают новые комбинации аналитики.
Выясним, какие именно счета вносят наибольший вклад в объем файла.
В рассматриваемом примере выяснилось, что 65% записей файла занимал 24 счет ("Брак в производстве"), который годами не списывался полностью в разрезе партий. Еще 26% занимал счет 29.1.1 ("Запчасти в готовых изделиях"). Проанализируем это: если общее сальдо по счету равно нулю, а развернутое по субконто — нет, значит, аналитика "расползается".
Разберем способы уменьшения количества записей в таблице итогов через изменение настроек конфигурации. Рассмотрим подробнее два варианта:
Вариант А. Оборотные субконто. Если для учета на определенном счете (например, на счете затрат или брака) нам важно знать, сколько пришло и ушло в течение периода, но не важны остатки в разрезе каждой конкретной партии, мы можем сделать субконто "Оборотным".
Для этого в Конфигураторе в плане счетов выберем нужный счет, найдем нужное субконто (например, "Партии") и установим признак Только обороты. После этого система перестанет хранить остатки в разрезе этого субконто в файле 1SBKTTL, что радикально уменьшит его размер после пересчета итогов.
Вариант Б. Удаление лишней аналитики. Если какая-то аналитика была добавлена "на будущее", но реально не используется в отчетах, ее следует удалить из плана счетов. Помните: каждое лишнее субконто на активном счете — это множитель количества строк в таблице итогов.
Часто причиной роста файла становится техническая ошибка в коде проведения документов. Разберем ситуацию с "пустыми скобками" < >. Это происходит, когда при поступлении товара была указана конкретная партия, а при списании поле партии осталось пустым.
В результате в итогах висит две строки:
Для 1С это две разные записи в файле 1SBKTTL. Чтобы исправить это, необходимо написать обработку, которая найдет такие пары и "схлопнет" их. Посмотрим на пример кода для исправления подобных ситуаций:
// Пример упрощенной логики для зануления ненужной аналитики
Опер = СоздатьОбъект("Операция");
Опер.ВыбратьОперацииСПроводками(ДатаНачала, ДатаКонца, "24, 23");
Пока Опер.ПолучитьОперацию() = 1 Цикл
ФлагИзменения = 0;
Опер.ВыбратьПроводки();
Пока Опер.ПолучитьПроводку() = 1 Цикл
// Если субконто Партия заполнено, но оно нам не нужно для итогов
Если ПустоеЗначение(Опер.Дебет.Субконто(3)) = 0 Тогда
Опер.Дебет.Субконто(3, ""); // Зануляем аналитику
ФлагИзменения = 1;
КонецЕсли;
КонецЦикла;
Если ФлагИзменения = 1 Тогда
Опер.Записать(); // Сохраняем операцию с исправленными проводками
КонецЕсли;
КонецЦикла;
Когда мы исправили аналитику и проводки, размер файла 1SBKTTL.DBF сам по себе не уменьшится. Нам нужно "пересобрать" таблицу итогов. Разберем, как это сделать правильно и быстро.
Администрирование -> Выгрузка данных создаем архив (ZIP/V7), затем в пустую папку делаем Загрузку. При загрузке 1С пересчитывает итоги "с нуля" и создает максимально компактные DBF-файлы.Тестирование и исправление -> Упаковка таблиц или внешние утилиты для сжатия DBF-файлов. Это удалит записи, помеченные на удаление, но не пересчитает итоги так эффективно, как перезагрузка.Если оптимизация учета не помогает (данных объективно слишком много), рассмотрим альтернативные пути:
Переход на SQL-версию. В версии 1С 7.7 для SQL лимит в 2 ГБ отсутствует, так как данные хранятся в таблицах Microsoft SQL Server. Это "принципиальное" решение проблемы, однако оно требует смены лицензии (или использования патчей) и наличия сервера.
Свертка базы данных. Используем специализированные обработки (например, WRAP.ert). Свертка обрезает историю документов за прошлые годы, заменяя их входящими остатками на начало выбранного года. Это физически удаляет движения из базы, а значит, и лишние записи из таблицы итогов.
Использование патчей для DBF. Существуют неофициальные патчи (например, dbeng32.dll от Wirth), которые позволяют 1С 7.7 работать с файлами DBF более 2 ГБ. Это рискованный путь, так как сторонние утилиты (архиваторы, редакторы DBF) могут по-прежнему не понимать такие файлы, но в качестве временной "пожарной" меры это часто помогает спасти вставшую базу.
Проанализировав ситуацию, мы пришли к выводу, что "бешеный рост" файла чаще всего вызван не объемом реальных операций, а мусором в аналитике. Порядок действий должен быть следующим:
Помните, что работа с файлами на грани 2 Гб крайне опасна — всегда делайте архивную копию перед любыми манипуляциями с таблицами 1SBKTTL и 1SENTRY.