При работе с файловыми базами данных 1С:Предприятие пользователи и администраторы нередко сталкиваются с неприятной ошибкой СУБД: «Превышен максимально допустимый размер внутреннего файла». Эта проблема возникает внезапно, блокирует запись документов (например, при попытке провести «Корректировку записей регистров») и может полностью остановить работу компании. В этой статье мы подробно разберем, почему возникает данная ошибка, как устроена файловая база данных изнутри, а также рассмотрим пошаговые практические методы решения проблемы — от простых бесплатных утилит до глубокого анализа структуры таблиц.
Для того чтобы эффективно бороться с проблемой, проанализируем внутреннее устройство файловой базы данных 1С (файл 1Cv8.1CD). Вопреки распространенному мнению, этот файл не является монолитным куском данных. Внутри него находится полноценная реляционная база данных, состоящая из множества так называемых внутренних файлов (таблиц). Каждой таблице в конфигурации (будь то справочник, документ, регистр накопления или регистр сведений) соответствует до четырех внутренних файлов:
Существуют жесткие технологические ограничения на размер любого из этих четырех внутренних файлов для одной таблицы. Ограничение завязано на размер страницы данных, который используется при форматировании базы:
Как только одна из таблиц вашей базы данных (например, индексная таблица крупного регистра сведений или файл хранилища прикрепленных файлов) достигает этого лимита, СУБД 1С блокирует любые операции записи, выдавая ошибку превышения размера.
Выясним причину переполнения и разберем по шагам все доступные методы исправления ситуации.
Если ваша база данных исторически была создана со стандартным размером страницы 4 КБ, то лимит таблицы составляет всего 4 ГБ. Мы можем быстро расширить этот лимит до 6 ГБ (для платформы 8.3) или до 16 ГБ (если вы используете современную платформу 8.5 и выше) путем конвертации базы и изменения размера страницы до 64 КБ.
Для выполнения этой процедуры воспользуемся официальной консольной утилитой cnvdbfl.exe, которая поставляется вместе с платформой 1С и находится в каталоге установленной версии программы.
Рассмотрим по шагам процесс конвертации:
1Cv8.1CD в безопасное место.1C:Enterprise Enterprise Server (если используется) или веб-серверы не обращаются к файлу.
cd "C:\Program Files\1cv8\8.3.25.1234\bin"
cnvdbfl.exe -i "D:\1C_Bases\Accounting\1Cv8.1CD"
cnvdbfl.exe -c -f 8.3.8 -p 64k "D:\1C_Bases\Accounting\1Cv8.1CD"
Параметр -c запускает режим конвертации, -f 8.3.8 указывает на использование нового формата баз данных, а параметр -p 64k задает размер страницы 64 КБ. После завершения процесса лимит для проблемного внутреннего файла автоматически увеличится, и база снова сможет записывать новые данные.
Простое увеличение размера страницы — это отличная «первая помощь», но если база продолжает активно расти, рано или поздно вы упретесь и в новые лимиты (6 ГБ или 16 ГБ). Чтобы действовать точечно, проанализируем, какая именно таблица в базе данных занимает критический объем.
Для этого мы можем написать несложную программную обработку внутри самой 1С, использующую встроенные функции платформы: ПолучитьСтруктуруХраненияБазыДанных() и ПолучитьРазмерДанныхБазыДанных().
Посмотрим на пример кода, который позволяет вывести список самых тяжелых таблиц базы данных:
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
ТаблицаРазмеров = ПолучитьРазмерДанныхБазыДанных();
// Объединим эти данные, чтобы сопоставить физические имена таблиц СУБД
// (например, _InfoRg1234) с понятными именами объектов метаданных.
Для Каждого СтрокаРазмера Из ТаблицаРазмеров Цикл
НайденныеСтроки = ТаблицаСтруктуры.НайтиСтроки(Новый Структура("ИмяТаблицыХранения", СтрокаРазмера.ИмяТаблицы));
Если НайденныеСтроки.Количество() > 0 Тогда
ИмяМетаданных = НайденныеСтроки[0].ИмяТаблицы;
Сообщить("Таблица: " + ИмяМетаданных + " (" + СтрокаРазмера.ИмяТаблицы + ") - Размер: " + СтрокаРазмера.Размер + " байт");
КонецЕсли;
КонецЦикла;
Если база данных повреждена или не запускается в режиме «1С:Предприятие» из-за ошибки СУБД, мы можем использовать альтернативный метод диагностики: временную миграцию базы на бесплатную СУБД PostgreSQL.
.dt через конфигуратор (если он открывается)..dt в клиент-серверную базу данных._InfoRg... (регистр сведений) или _AccumReg... (регистр накопления).Когда проблемный объект метаданных найден, необходимо провести его оптимизацию. Очень часто «виновниками» раздувания базы становятся логи обмена данными, версионирование объектов, кэш или некорректно работающие регистры сведений.
Рассмотрим основные точечные решения для разгрузки тяжелых таблиц:
_ChangeRec...) могут разрастись до гигантских масштабов. Выполните принудительный сброс регистрации изменений для зависших узлов обмена.ВерсииОбъектов (история изменений документов) и регистров сведений, хранящих журналы выгрузок или кэш. Удалите устаревшие записи (например, версии объектов старше одного года).Важный нюанс! Простое программное или интерактивное удаление документов или записей регистра в режиме «1С:Предприятие» физически не уменьшает размер файла 1Cv8.1CD на диске. СУБД лишь помечает эти страницы как свободные для будущих записей. Чтобы физически освободить место на жестком диске и уменьшить размер внутренних файлов, обязательно выполните следующие шаги:
Альтернативным способом полного перестроения и сжатия базы является цикл выгрузки базы в файл .dt с его последующей загрузкой в новую чистую файловую базу данных.
Если вы применили все способы оптимизации данных, увеличили страницу до 64 КБ, но база продолжает стабильно расти и приближаться к критическим отметкам, это верный признак того, что ваш бизнес перерос рамки файлового режима работы.
Единственным стратегически верным решением в данном случае является переход на клиент-серверную архитектуру 1С. В серверном режиме ограничения файловой системы 1CD полностью нивелируются, так как хранением и индексацией данных занимается промышленная СУБД (MS SQL Server, PostgreSQL, IBM DB2 или Oracle). Лимиты на размер таблиц в таких системах исчисляются терабайтами, а быстродействие и стабильность базы при многопользовательской работе возрастают в разы.
Подведем итоги. При возникновении ошибки превышения размера внутреннего файла мы рекомендуем действовать последовательно: сначала сделайте резервную копию и увеличьте размер страницы файла базы до 64 КБ утилитой cnvdbfl.exe, затем локализуйте «тяжелые» таблицы программными методами, очистите ненужные данные и проведите сжатие таблиц. Этот комплекс мер позволит вернуть вашу базу 1С к полноценной и стабильной работе!