Чистим и сжимаем базу данных 1С 8.3: рабочие методы
Содержание
База выросла до десятков гигабайт, бэкап идёт час, а файловая база приближается к пределу, за которым начинаются сбои? Главная ошибка — сразу бежать делать shrink в SQL. Сжатие СУБД освобождает место, но не трогает причину: помеченные на удаление объекты, историю изменений и файлы, которые лежат внутри базы и продолжают её раздувать.
Порядок действий другой. Сначала убираем лишние данные средствами 1С, потом физически сжимаем то, что осталось. Ниже — оба этапа для файловой базы (.1CD) и для клиент-серверной на MS SQL Server, плюс как не допустить повторного роста.
Любая операция из этой статьи — чистка, свёртка, тестирование — делается только после резервной копии и, как правило, в монопольном режиме. Сначала бэкап, потом всё остальное.
Почему база 1С 8.3 растёт быстрее, чем нужно
Размер определяется не числом «живых» документов, а балластом, который копится годами. Основные источники:
- 🗑 Помеченные на удаление объекты. Пометка не удаляет запись — она остаётся в таблицах вместе со всеми движениями.
- 🕑 История изменений (версионирование объектов). Если включено, каждая правка документа хранит полную копию прежней версии.
- 📎 Присоединённые файлы внутри базы. Сканы, договоры, картинки по умолчанию ложатся прямо в
.1CDили в таблицы SQL. - 📊 Движения регистров. Детальные взаиморасчёты, партионный учёт, большие регистры накопления дают основную массу строк.
- 🧾 Раздутый журнал транзакций (только SQL). При модели восстановления Full без регулярного бэкапа лога файл
.ldfвырастает больше самой базы.
Журнал регистрации (1Cv8.lgd / папка 1Cv8Log) хранится отдельно от базы и в размер .1CD не входит, но место на диске съедает заметно — его тоже имеет смысл ограничить.
Прежде чем чистить, посмотрите, на что уходит объём. Для SQL это запрос к системным представлениям о размере таблиц; для файловой базы — утилита chdbfl.exe, которая после проверки показывает структуру. Часто 70–80 % занимают две-три таблицы, и тогда понятно, за что браться.
С чего начать: файловая база или клиент-сервер
Путь зависит от того, как развёрнута база. Это видно в окне запуска 1С или в строке подключения.
Чистка данных (следующие два раздела) одинакова для всех вариантов. Различается только финальное физическое сжатие.
Удаление помеченных объектов и битых ссылок
Это первый и самый безопасный шаг — он убирает мусор, который накопился от обычной работы.
- Откройте
Администрирование → Обслуживание → Удаление помеченных объектов. - Выберите режим полного удаления (контроль ссылок включён — объект, на который ещё ссылаются, удалён не будет).
- Запустите поиск. Программа покажет объекты, которые нельзя удалить, и причину — другой документ или запись регистра на них ссылается.
- По «неудаляемым» разберитесь отдельно: либо снимите пометку, если объект нужен, либо удалите сначала то, что на него ссылается.
Регулярная пометка на удаление без последующего удаления — самая частая причина разрастания в рабочих базах. Сотни помеченных контрагентов и номенклатуры тянут за собой тысячи строк движений.
Удаление помеченных объектов устанавливает монопольную блокировку: пока идёт процесс, остальные пользователи работать не смогут. Запускайте в нерабочее время.
Отдельная история — битые (висячие) ссылки: документ ссылается на объект, которого в базе уже нет. На размер они влияют слабо, но мешают корректному удалению и провоцируют ошибки. Их ловит проверка ссылочной целостности в тестировании (следующий раздел) — там же можно выбрать, что делать с найденными ссылками: очистить или создать объекты по ссылкам.
Тестирование, исправление и сжатие таблиц файловой базы
Для файловой базы физическое уменьшение размера делается встроенными средствами платформы — без SQL.
Способ 1. Тестирование и исправление в Конфигураторе.
- Сделайте копию базы и закройте все сеансы.
- Запустите базу в режиме Конфигуратора.
- Откройте
Администрирование → Тестирование и исправление. - Для уменьшения объёма отметьте Реиндексация таблиц и Сжатие таблиц информационной базы. При подозрении на ошибки добавьте проверку логической и ссылочной целостности.
- Переключатель внизу поставьте в положение «Тестирование и исправление» (не только тестирование), запустите.
Сжатие таблиц физически убирает из файла .1CD место, освободившееся после удаления данных. Именно оно уменьшает размер файла на диске.
Способ 2. Выгрузка и загрузка .dt.
Альтернатива, которая пересобирает файл с нуля:
- В Конфигураторе:
Администрирование → Выгрузить информационную базу→ сохраните.dt. - Создайте пустую базу или очистите текущую и загрузите
.dtобратно (Администрирование → Загрузить информационную базу).
После загрузки файл всегда получается компактнее исходного — это удобный способ «дефрагментации» небольшой базы.
Способ 3. Утилита chdbfl.exe.
Лежит в каталоге bin платформы (например, ...\1cv8\8.3.xx.xxxx\bin\chdbfl.exe). Проверяет и исправляет физическую целостность файла. База должна быть закрыта. Галочку «Исправлять обнаруженные ошибки» ставьте только после копии — утилита способна удалить повреждённые записи.
Тестирование и исправление, как и работа chdbfl.exe, требует монопольного доступа: ни один пользователь не должен быть в базе. Для больших файловых баз процесс идёт долго — планируйте на вечер или выходные.
Уменьшение базы на MS SQL Server: лог и shrink
В клиент-серверном варианте удаление данных в 1С место на диске не освобождает — оно остаётся «зарезервированным» внутри файла базы. Освобождать надо средствами СУБД.
Шаг 1. Разберитесь с журналом транзакций. Часто разросся не сам файл данных, а лог. Проверьте модель восстановления базы в SQL Server:
| Модель восстановления | Поведение | Когда подходит |
|---|---|---|
| Full | Лог растёт до бэкапа лога | Нужна точка восстановления на любой момент |
| Simple | Лог усекается автоматически | Достаточно восстановления из полного бэкапа |
Если точечное восстановление не нужно, переключение на Simple решает проблему раздутого .ldf. Если Full нужна — настройте регулярный бэкап журнала транзакций, тогда лог перестанет расти.
Шаг 2. Освободите место в файле данных. После чистки данных и усечения лога уменьшите физический размер файлов командой:
-- выполнять в контексте нужной базы
DBCC SHRINKFILE (N'имя_файла_данных', 0);
DBCC SHRINKFILE (N'имя_файла_лога', 0);
Имена файлов берутся из свойств базы (логические имена .mdf и .ldf).
SHRINKDATABASE для всей базы и агрессивный SHRINKFILE сильно фрагментируют индексы — после сжатия производительность 1С падает. Поэтому порядок такой: чистка данных → shrink → перестроение индексов (ALTER INDEX ... REBUILD или регламентное обслуживание). Не делайте shrink регулярно: это разовая операция после крупной чистки, а не ежедневная задача.
На PostgreSQL аналог — VACUUM FULL, который переписывает таблицы и возвращает место ОС. Он тоже берёт монопольную блокировку таблиц, поэтому выполняется в технологическое окно, с последующим ANALYZE.
Свёртка базы: убираем старые документы и остатки
Если базе много лет и старые периоды уже сданы, самый результативный способ — свёртка. Она формирует остатки на выбранную дату вводом начальных остатков, а документы и движения до этой даты удаляет.
Общий порядок:
- Определите дату свёртки — обычно начало года, за который отчётность уже сдана и закрыта.
- Запустите обработку свёртки (
Администрирование → Обслуживаниеили через раздел работы с данными конкретной конфигурации). - Обработка создаёт документы ввода остатков на дату свёртки.
- Сверьте остатки до и после — оборотно-сальдовая ведомость на дату свёртки должна совпасть.
- Только после сверки удаляйте помеченные старые документы.
Свёртка необратима. После удаления старых документов детализации за те периоды в базе не останется. Делайте свёртку на копии, проверяйте остатки, и только убедившись в совпадении — переносите результат в рабочую базу (или оставляйте проверенную копию как рабочую). Исходную базу сохраните в архиве на случай встречной проверки.
Свёртка оправдана, когда старые данные нужны редко и их не жалко вынести в архивную копию. Если по закону требуется хранить первичку и детализацию — свёртку не делают, а идут по пути выноса файлов и регламентной чистки.
Выносим присоединённые файлы и историю из базы
Два «тихих» пожирателя объёма, которые часто дают больше эффекта, чем всё остальное вместе.
Присоединённые файлы. По умолчанию сканы и вложения хранятся внутри базы. Перенесите их в тома на диске:
- Откройте
Администрирование → Настройки работы с файлами. - Переключите хранение файлов с «в информационной базе» на «в томах на диске».
- Укажите каталог тома (для серверной базы — путь, доступный серверу 1С).
- Запустите перенос уже существующих файлов в том.
После переноса файлы лежат обычными файлами в каталоге, а база разгружается — иногда на гигабайты. Заодно задайте максимальный размер загружаемого файла, чтобы в базу не попадали тяжёлые вложения.
История изменений (версионирование объектов). Если включено версионирование, в настройках хранения версий (Администрирование → Общие настройки → История изменений либо раздел версионирования объектов) проверьте:
- для каких объектов хранится история — возможно, версионировать нужно не всё;
- срок хранения версий — старые версии можно удалять по расписанию.
Очистка устаревших версий освобождает место без потери актуальных данных.
Журнал регистрации. Чтобы он не рос бесконечно, ограничьте срок хранения записей и настройте разделение по периодам. Для файловой базы это делается в Конфигураторе (Администрирование → Настройка журнала регистрации), для серверной — в свойствах базы. Старые записи можно сократить, оставив, например, последние несколько месяцев.
Регламент: чтобы база не разрасталась снова
Разовая чистка даёт эффект на месяцы, но без регулярного обслуживания балласт вернётся. Настройте повторяющиеся операции и забудьте о ручной работе.
Для клиент-серверных баз перестроение индексов, обновление статистики и бэкап лога удобно вынести в регламентные задания SQL Server (SQL Agent) или в типовой механизм регламентных операций 1С, запуская их в нерабочее время.
Главный принцип: данные удаляет 1С, место освобождает СУБД. Нарушение порядка — когда сначала жмут SQL, не почистив помеченные объекты и не вынеся файлы, — даёт временный результат, и через пару месяцев всё возвращается.
Частые вопросы
После удаления документов в SQL база не уменьшилась. Почему?
DBCC SHRINKFILE) или VACUUM FULL на PostgreSQL — после чистки и с последующим перестроением индексов.Можно ли сжать базу без выгрузки всех пользователей?
chdbfl.exe и свёртка требуют монопольного доступа. Shrink и обслуживание индексов на SQL технически выполнимы при работающих пользователях, но сильно тормозят базу — делают их в технологическое окно.Что безопаснее для файловой базы — сжатие таблиц или выгрузка в .dt?
.dt пересобирает файл целиком и даёт более компактный результат, но дольше. В любом случае сначала делают резервную копию.