При работе с файловыми базами 1С:Предприятие пользователи часто сталкиваются с ситуацией, когда база перестает принимать данные (например, при синхронизации между «Бухгалтерией предприятия» и «Зарплатой и управлением персоналом») или выдает критическую ошибку: «Ошибка СУБД: Превышен максимально допустимый размер внутреннего файла 1Cv8.1CD». Рассмотрим подробно, почему это происходит и как решить проблему, не прибегая к экстренным мерам.
Важно понимать, что ошибка указывает не на общий размер файла базы данных (который может достигать десятков гигабайт), а на ограничение размера одной конкретной таблицы внутри этого файла. В файловой СУБД 1С существуют жесткие лимиты на размер внутренней таблицы, которые зависят от размера страницы данных:
Проанализируем ситуацию: если ваша база занимает 20 Гб, это нормально. Но если одна таблица (например, история изменений или кэш) достигла 6 Гб, база заблокирует любую попытку записи в эту таблицу. Именно поэтому ошибка часто возникает именно при синхронизации — в этот момент система пытается записать большой объем данных в регистры, которые уже находятся «на грани» лимита.
Прежде чем что-то удалять, нам необходимо выяснить, какая именно таблица «распухла». Рассмотрим несколько способов диагностики:
Tool1CD позволяет открыть файл 1Cv8.1CD и увидеть список всех таблиц с их реальным размером. Ищите таблицы, размер которых вплотную приблизился к 4 или 6 Гб.ПолучитьСтруктуруХраненияБазыДанных(), чтобы сопоставить внутренние имена таблиц (типа INFORG24411) с объектами метаданных.Как показывает практика, чаще всего виновником является регистр сведений РегистрСведений.ВерсииОбъектов. В нем хранится история всех изменений документов и справочников. Если синхронизация настроена часто, а версионирование включено для всех документов, этот регистр растет лавинообразно.
Выясним, нужно ли нам хранить историю за все годы. Если нет, выполним очистку. Внимание: простое удаление через НаборЗаписей на огромных объемах может привести к ошибке нехватки памяти. Разберем правильный подход с удалением порциями.
Проанализируем пример кода для безопасной очистки регистра:
Процедура ОчиститьВерсииОбъектов()
// Выбираем объекты, версии которых будем удалять
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВерсииОбъектов.Объект КАК Объект
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Удаляем версии для каждого объекта отдельно, чтобы не перегружать транзакцию
Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Установить(Выборка.Объект);
Набор.Записать(); // Записываем пустой набор, тем самым удаляя данные
КонецЦикла;
КонецПроцедуры
Если записей слишком много, можно добавить условие по дате, оставляя только версии за последний месяц.
Чтобы проблема не повторилась, настроим типовой механизм БСП. Рассмотрим последовательность действий:
Этот механизм работает более корректно, так как он не просто очищает таблицы, но и делает это в фоновом режиме, не блокируя работу пользователей.
Важный нюанс: после удаления данных из файловой базы размер файла 1Cv8.1CD на диске не уменьшится. Внутри файла просто образуются пустые страницы, которые 1С пометит как свободные для новых записей. Чтобы физически уменьшить размер файла и «сбросить» счетчик размера таблиц, необходимо выполнить сжатие.
Разберем, как это сделать:
Только после этой процедуры ОС покажет уменьшение размера файла, а лимит 4/6 Гб для проблемной таблицы будет отодвинут.
Если очистка данных не помогает или данные (история изменений) критически важны, рассмотрим стратегические пути решения:
Это единственный 100% надежный способ избавиться от ограничений файлового формата. Для небольших организаций существует бюджетный вариант — Сервер 1С:Предприятие МИНИ на 5 подключений. В качестве СУБД можно использовать бесплатный PostgreSQL (специальную сборку от 1С) или MS SQL Express (хотя у него тоже есть лимит в 10 Гб на всю базу).
Если у вас сейчас размер страницы 4096 байт, вы можете сконвертировать базу в формат с 16384 или даже 65536 байт с помощью утилиты CNVDBFL.exe (находится в папке bin платформы). Это увеличит лимит таблицы до 10 Гб и выше, но это лишь временная отсрочка проблемы.
Проанализируем еще одну причину роста базы — присоединенные файлы (сканы, отчеты). Если перевести их хранение из информационной базы в Тома на диске (Администрирование — Настройки работы с файлами), мы значительно облегчим основной файл .1CD. После настройки томов используйте обработку «Перенос файлов в тома». Это освободит место в таблицах хранилищ, что может быть критично для общей стабильности базы.
Резюме: при возникновении ошибки первым делом определите «таблицу-гиганта», очистите её (чаще всего это ВерсииОбъектов или ЗамерыПроизводительности), проведите сжатие таблиц через ТИС и настройте регламентную очистку мусора.