Как обрезать файл 1SConst.dbf при достижении порога 2 Гб в 1С 7.7?

Программист 1С v7.7
← На главную

Проблема достижения файлом 1SConst.dbf объема в 2 Гб является критической для систем на базе «1С:Предприятие 7.7». Это архитектурное ограничение формата DBF, при котором база данных либо перестает открываться, либо начинает работать с фатальными ошибками «Internal Stack Overflow» или «Error reading from file». В данной статье мы подробно разберем, почему это происходит и какими методами можно вернуть базу в работоспособное состояние.

Анализируем причину разрастания таблицы 1SConst

Для начала выясним ситуацию: что именно хранится в этом файле. Таблица 1SConst предназначена для хранения истории всех периодических констант, а также периодических реквизитов справочников. В крупных базах, которые работают без свертки более 5–6 лет, этот файл становится «бутылочным горлышком».

Рассмотрим основные поля таблицы:

  1. OBJID — идентификатор объекта (например, конкретного элемента справочника «Цены»);
  2. ID — идентификатор самого реквизита или константы;
  3. DATE — дата, с которой устанавливается значение;
  4. VALUE — само значение;
  5. DOCID — ссылка на документ, если значение было установлено документом.

Проанализируем типичную причину раздувания: часто в конфигурациях (особенно в «Торговля и Склад») цены или курсы валют записываются ежедневно, даже если само значение не менялось. Если в базе 200 тысяч активных позиций номенклатуры и для каждой ежедневно обновляется цена, файл 1SConst.dbf будет расти в геометрической прогрессии, достигая критического порога очень быстро.

Метод 1. Программная очистка дублей и старых данных

Если конфигуратор еще позволяет запустить базу в монопольном режиме, первым делом попробуем очистить лишние записи программно. Основная логика заключается в удалении записей, которые не несут смысловой нагрузки — это дублирующиеся значения, идущие подряд.

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


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

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

Метод 2. Физическое «лечение» файла через внешние редакторы (PACK)

Если файл уже вплотную приблизился к 2 Гб, штатные средства 1С могут падать с ошибкой «Недостаточно памяти». В этом случае проанализируем ситуацию с точки зрения СУБД. Нам поможет любой внешний редактор DBF-файлов, поддерживающий команду PACK (например, Visual FoxPro или специализированные утилиты типа DBFView).

Разберем по шагам процедуру восстановления:

  1. Обязательно сделайте резервную копию всей папки базы данных!
  2. Закройте все сессии 1С.
  3. Удалите индексный файл 1SConst.cdx. Это критически важно, так как при ручной правке DBF индексы станут невалидными.
  4. Откройте 1SConst.dbf во внешнем редакторе.
  5. Выполните физическое удаление записей, помеченных на удаление (команда PACK).
  6. Если файл все еще огромен, примените SQL-фильтрацию средствами редактора. Например, удалите записи старше определенной даты: DELETE FROM 1SConst WHERE DATE < '20180101'.
  7. Снова выполните PACK.
  8. Запустите 1С в монопольном режиме. Программа сообщит об отсутствии индексов и предложит их перестроить. Соглашайтесь.

Метод 3. Переход на MSSQL и борьба с ошибками загрузки

Иногда единственным выходом является перенос базы на SQL-версию 1С 7.7. Однако при объеме 1SConst в 2 Гб штатная выгрузка в .dat файл часто завершается аварийно. Как было отмечено в обсуждении, на помощь может прийти модуль Romix, позволяющий обходить ограничения при выгрузке.

Но при загрузке данных в MSSQL часто возникает ошибка «Нарушена нумерация строк таблицы... Недостаточно памяти». Выясним причину: это происходит из-за того, что конфигуратор пытается вывести тысячи строк предупреждений в окно сообщений. Память процесса 1С (который является 32-битным) переполняется, и загрузка падает.

Решение проблемы при загрузке в SQL:

Метод 4. Использование «Универсама» и перенос остатков

Рассмотрим радикальный, но самый эффективный метод — «свёртка» базы через перенос данных в пустую конфигурацию. Для этого часто используется обработка «Универсальный обмен данными» (в простонародье «Универсам»).

Преимущества этого метода:

  1. Мы переносим только актуальные справочники и остатки на начало текущего периода.
  2. Вся история периодических реквизитов из 1SConst.dbf за прошлые годы остается в старой базе.
  3. Новый файл 1SConst.dbf в чистой базе будет весить всего несколько мегабайт, что обеспечит колоссальный прирост производительности.

При использовании этого метода проанализируем справочники на предмет «задвоенных» кодов. Как отмечали участники обсуждения, при выгрузке/загрузке могут возникнуть коллизии идентификаторов, поэтому предварительно рекомендуется запустить стандартную проверку «Тестирование и исправление» в исходной базе (если объем файла позволяет это сделать после частичной очистки).

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

Подведем итог. Чтобы успешно «обрезать» 1SConst.dbf, придерживайтесь следующей стратегии:

Во-первых, не пытайтесь делать это только штатным конфигуратором, если файл уже близок к 2 Гб — вы рискуете получить битый файл.

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

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

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

← На главную