Проблема достижения файлом 1SConst.dbf объема в 2 Гб является критической для систем на базе «1С:Предприятие 7.7». Это архитектурное ограничение формата DBF, при котором база данных либо перестает открываться, либо начинает работать с фатальными ошибками «Internal Stack Overflow» или «Error reading from file». В данной статье мы подробно разберем, почему это происходит и какими методами можно вернуть базу в работоспособное состояние.
Для начала выясним ситуацию: что именно хранится в этом файле. Таблица 1SConst предназначена для хранения истории всех периодических констант, а также периодических реквизитов справочников. В крупных базах, которые работают без свертки более 5–6 лет, этот файл становится «бутылочным горлышком».
Рассмотрим основные поля таблицы:
OBJID — идентификатор объекта (например, конкретного элемента справочника «Цены»);ID — идентификатор самого реквизита или константы;DATE — дата, с которой устанавливается значение;VALUE — само значение;DOCID — ссылка на документ, если значение было установлено документом.Проанализируем типичную причину раздувания: часто в конфигурациях (особенно в «Торговля и Склад») цены или курсы валют записываются ежедневно, даже если само значение не менялось. Если в базе 200 тысяч активных позиций номенклатуры и для каждой ежедневно обновляется цена, файл 1SConst.dbf будет расти в геометрической прогрессии, достигая критического порога очень быстро.
Если конфигуратор еще позволяет запустить базу в монопольном режиме, первым делом попробуем очистить лишние записи программно. Основная логика заключается в удалении записей, которые не несут смысловой нагрузки — это дублирующиеся значения, идущие подряд.
Рассмотрим алгоритм: если значение реквизита на дату Т совпадает со значением на дату Т-1, то запись на дату Т можно удалить без потери информативности для системы. Для этого можно использовать специализированные обработки по очистке периодических реквизитов. Посмотрим на пример логики, которую можно реализовать самостоятельно:
// Пример логики перебора периодического реквизита
Периодический = СоздатьОбъект("Периодический");
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Периодический.ИспользоватьОбъект("Цена", Спр.ТекущийЭлемент());
Периодический.ВыбратьЗначения();
ПредЗначение = "";
Пока Периодический.ПолучитьЗначение() = 1 Цикл
Если Периодический.Значение = ПредЗначение Тогда
Периодический.Удалить(); // Удаляем дубль
Иначе
ПредЗначение = Периодический.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Важный момент: после программного удаления записей в 1С через Удалить(), физический размер DBF-файла не уменьшится. Это особенность формата: записи помечаются как удаленные, но место в файле зарезервировано. Чтобы физически сжать файл, необходимо выполнить «Упаковку» таблиц.
Если файл уже вплотную приблизился к 2 Гб, штатные средства 1С могут падать с ошибкой «Недостаточно памяти». В этом случае проанализируем ситуацию с точки зрения СУБД. Нам поможет любой внешний редактор DBF-файлов, поддерживающий команду PACK (например, Visual FoxPro или специализированные утилиты типа DBFView).
Разберем по шагам процедуру восстановления:
1SConst.cdx. Это критически важно, так как при ручной правке DBF индексы станут невалидными.1SConst.dbf во внешнем редакторе.PACK).DELETE FROM 1SConst WHERE DATE < '20180101'.PACK.Иногда единственным выходом является перенос базы на SQL-версию 1С 7.7. Однако при объеме 1SConst в 2 Гб штатная выгрузка в .dat файл часто завершается аварийно. Как было отмечено в обсуждении, на помощь может прийти модуль Romix, позволяющий обходить ограничения при выгрузке.
Но при загрузке данных в MSSQL часто возникает ошибка «Нарушена нумерация строк таблицы... Недостаточно памяти». Выясним причину: это происходит из-за того, что конфигуратор пытается вывести тысячи строк предупреждений в окно сообщений. Память процесса 1С (который является 32-битным) переполняется, и загрузка падает.
Решение проблемы при загрузке в SQL:
1SConst перестанет быть проблемой, так как MSSQL легко оперирует терабайтами данных. Там же можно выполнить финальную очистку данных обычным запросом DELETE.Рассмотрим радикальный, но самый эффективный метод — «свёртка» базы через перенос данных в пустую конфигурацию. Для этого часто используется обработка «Универсальный обмен данными» (в простонародье «Универсам»).
Преимущества этого метода:
1SConst.dbf за прошлые годы остается в старой базе.1SConst.dbf в чистой базе будет весить всего несколько мегабайт, что обеспечит колоссальный прирост производительности.При использовании этого метода проанализируем справочники на предмет «задвоенных» кодов. Как отмечали участники обсуждения, при выгрузке/загрузке могут возникнуть коллизии идентификаторов, поэтому предварительно рекомендуется запустить стандартную проверку «Тестирование и исправление» в исходной базе (если объем файла позволяет это сделать после частичной очистки).
Подведем итог. Чтобы успешно «обрезать» 1SConst.dbf, придерживайтесь следующей стратегии:
Во-первых, не пытайтесь делать это только штатным конфигуратором, если файл уже близок к 2 Гб — вы рискуете получить битый файл.
Во-вторых, используйте внешние инструменты для выполнения команды PACK. Это самый быстрый способ уменьшить размер файла, если в нем много записей, помеченных на удаление.
В-третьих, настройте логику работы ваших обработок так, чтобы они не записывали в базу одинаковые значения периодических реквизитов на каждую новую дату. Это предотвратит повторение проблемы в будущем.
Помните, что любая манипуляция с файлами DBF напрямую требует полного бэкапа базы. Работа с 1С 7.7 в современных условиях требует осторожности, но при правильном подходе даже такие «тяжелые» базы могут успешно эксплуатироваться дальше.