Уменьшаем размер базы 1С: сжатие таблиц, чистка данных и обслуживание СУБД

· 10 мин

Содержание

Файловую базу 1С сжимают в конфигураторе: Администрирование → Тестирование и исправление, флажок «Сжатие таблиц информационной базы», режим «Тестирование и исправление» и кнопка «Выполнить». Второй надёжный способ — выгрузить базу в файл .dt и загрузить обратно: файл 1Cv8.1CD пересобирается без пустых страниц.

Клиент-серверную базу средствами 1С не сжимают — это работа СУБД: DBCC SHRINKFILE в MS SQL Server и VACUUM FULL в PostgreSQL. И в обоих вариантах сжатие освобождает только пустое место. Чтобы база реально похудела, сначала удаляют лишние данные, а потом уже сжимают.

Почему база 1С разрастается и сама не уменьшается

Файл 1Cv8.1CD устроен постранично. Когда вы удаляете документы, страницы помечаются как свободные, но файл на диске остаётся прежнего размера. Новые данные со временем занимают эти дыры, а излишек так и висит.

Основные источники роста:

  • 📄 Документы и движения за много лет. Каждый проведённый документ пишет строки в регистры. Пять лет учёта в средней фирме — это миллионы записей.
  • 🗑️ Объекты, помеченные на удаление, но не удалённые. Пометка не удаляет запись, она просто ставит флаг.
  • 🕓 История изменений (версии объектов). В конфигурациях на БСП каждая запись документа может сохранять копию. Если хранить версии бессрочно, их объём легко обгоняет сами документы.
  • 📎 Файлы, прикреплённые к объектам. Сканы договоров и счетов по умолчанию часто хранятся внутри базы.
  • 🔄 Служебные данные обменов. Регистрации изменений для узлов, которые давно не работают, копятся без ограничений.
  • 🧱 Фрагментация после массовых операций. Перепроведение за год, загрузка данных, удаление — всё это оставляет свободные страницы.

Журнал регистрации в файловой базе лежит не в 1Cv8.1CD, а в соседней папке 1Cv8Log. Его размер на сжатие таблиц не влияет, но место на диске он занимает, иногда десятки гигабайт.

Подготовка базы 1С к сжатию

Сжатие таблиц и загрузка .dt переписывают файл базы целиком. Сбой посреди процесса (отключили свет, кончилось место) может оставить базу в нерабочем виде.

Перед сжатием обязательно сделайте резервную копию и проверьте, что она открывается.

Порядок подготовки:

  1. Предупредите пользователей и выберите время, когда в базе никого нет. Для сжатия нужен монопольный доступ: все сеансы будут завершены.
  2. Сделайте копию. Для файловой базы самое простое — скопировать всю папку базы целиком, пока база закрыта. Дополнительно можно выгрузить .dt через Администрирование → Выгрузить информационную базу.
  3. Проверьте место на диске. Свободного места должно быть не меньше текущего размера базы: во время пересборки данные временно занимают его повторно.
  4. Запишите исходный размер 1Cv8.1CD, чтобы потом оценить эффект.
  5. Если база вела себя странно (ошибки чтения, вылеты), сначала проверьте физическую целостность файла утилитой chdbfl.exe из папки bin платформы.

Если в базе несколько пользователей работают удалённо, установите блокировку начала сеансов заранее. В типовых конфигурациях это делается в Администрирование → Обслуживание через блокировку работы пользователей.

Как сжать файловую базу 1С: три способа

Способ 1. Сжатие таблиц в конфигураторе

Это штатный и самый безопасный путь.

  1. Запустите базу в режиме «Конфигуратор» под пользователем с полными правами.
  2. Откройте Администрирование → Тестирование и исправление.
  3. Снимите лишние флажки и оставьте «Сжатие таблиц информационной базы». Можно дополнительно включить «Реиндексация таблиц информационной базы» — это тоже полезно для скорости.
  4. Режим выберите «Тестирование и исправление».
  5. Нажмите «Выполнить» и дождитесь сообщения о завершении.

На базе в 10–20 ГБ процесс идёт от нескольких минут до часа, в зависимости от диска. На SSD заметно быстрее.

Не отмечайте «Пересчёт итогов» и «Проверка логической и ссылочной целостности» без нужды. Они долгие, а проверка ссылочной целостности при неправильно выбранных действиях может создать объекты-заглушки или удалить ссылки.

Способ 2. Выгрузка в .dt и загрузка обратно

При загрузке .dt база создаётся заново, поэтому пустого места в ней не остаётся совсем. Это работает даже там, где сжатие таблиц дало мало.

  1. В конфигураторе: Администрирование → Выгрузить информационную базу, сохраните файл .dt.
  2. Создайте рядом новую пустую папку.
  3. Лучше загружать в новую базу, а не поверх старой: добавьте в список баз новую пустую базу в этой папке, откройте её конфигуратором.
  4. Администрирование → Загрузить информационную базу, выберите сохранённый .dt.
  5. Проверьте новую базу, сравните остатки по ключевым счетам и только после этого удалите старую.

Плюс способа — старая база цела до последнего шага. Минус — нужно место на две базы и файл выгрузки.

Способ 3. Сжатие из командной строки

Тот же механизм, что в способе 1, но без ручных кликов. Удобно для планировщика заданий.

@echo off
set V8="C:\Program Files\1cv8\8.3.25.1374\bin\1cv8.exe"
set BASE="D:\Bases\Buh"
set LOG="D:\Logs\compress.log"

%V8% DESIGNER /F %BASE% /N "Администратор" /P "пароль" /IBCheckAndRepair -IBCompression -ReIndex /Out %LOG% /DisableStartupDialogs

Номер версии в пути замените на свой — посмотрите папки в C:\Program Files\1cv8\. Результат пишется в файл из параметра /Out, его стоит открыть после первого запуска.

Сравнение способов

СпособКогда подходитРиски и ограничения
Сжатие таблиц в конфигуратореРегулярное обслуживание, после удаления данныхНужен монопольный доступ
Выгрузка и загрузка .dtСжатие дало мало, нужна «чистая» пересборкаНужно место на две базы, долго на больших базах
Командная строка /IBCheckAndRepairАвтоматизация по ночамПароль в файле, нужно следить за логом

Сжатие базы 1С на MS SQL Server и PostgreSQL

В клиент-серверном варианте данные лежат в файлах СУБД. Пункт «Сжатие таблиц» в конфигураторе здесь не поможет: сжимать нужно на стороне сервера баз данных.

MS SQL Server

Чаще всего разрастается не файл данных (.mdf), а журнал транзакций (.ldf). Причина обычно одна: база в модели восстановления FULL, а резервное копирование журнала не настроено. Журнал растёт до тех пор, пока не кончится диск.

Что делать:

  1. В SQL Server Management Studio откройте свойства базы, вкладка Options, посмотрите Recovery model.
  2. Если точка-в-момент восстановление вам не нужна, переключите на Simple. Если нужна — настройте регулярный бэкап журнала, тогда он перестанет расти.
  3. Сожмите журнал:
USE [buh_base];
GO
-- узнать логические имена файлов
SELECT name, type_desc, size/128 AS size_mb FROM sys.database_files;
GO
-- сжать журнал до 1024 МБ
DBCC SHRINKFILE (N'buh_base_log', 1024);
GO
  1. Файл данных сжимайте только если удалили много данных и место действительно нужно: DBCC SHRINKFILE (N'buh_base', <целевой размер в МБ>).

Сжатие файла данных сильно фрагментирует индексы. После него обязательно перестройте индексы (ALTER INDEX ALL ON ... REBUILD или задача «Rebuild Index» в плане обслуживания), иначе 1С начнёт тормозить. Регулярный SHRINK файла данных по расписанию — вредная практика.

PostgreSQL

В PostgreSQL удалённые и изменённые строки остаются в таблицах как «мёртвые» до очистки. Обычный VACUUM (и autovacuum) делает место доступным для повторного использования, но размер файлов не уменьшает. Физически вернуть место системе может VACUUM FULL.

-- обычная очистка и обновление статистики, без блокировки работы
VACUUM ANALYZE;

-- полная пересборка таблиц с возвратом места на диск
VACUUM FULL ANALYZE;

VACUUM FULL берёт на каждую таблицу исключительную блокировку: пользователи 1С на это время не смогут работать с базой. Запускайте его только в окно обслуживания, когда сеансы завершены, и при свободном месте на диске не меньше размера самой большой таблицы.

Проверить, что autovacuum вообще включён, можно запросом SHOW autovacuum; — он должен вернуть on.

Удаление старых данных и очистка журнала регистрации

Сжатие убирает пустоту. Если пустоты нет, база не уменьшится. Поэтому сначала освобождают место внутри.

Помеченные на удаление объекты

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) обработка находится в Администрирование → Обслуживание → Удаление помеченных объектов. Она проверяет ссылки и удаляет только то, на что больше ничего не ссылается. Запускайте её перед сжатием.

История изменений объектов

Если включено версионирование, задайте срок хранения версий в настройках истории изменений (раздел Администрирование → Общие настройки). После этого регламентное задание очистки устаревших версий удалит лишнее. На базах с многолетней бессрочной историей это нередко даёт больше, чем удаление документов.

Файлы внутри базы

Переведите хранение присоединённых файлов в тома на диске. Настройка находится в разделе администрирования, в группе параметров работы с файлами. Уже загруженные файлы можно перенести в тома штатной командой переноса — после этого база уменьшается на их объём.

Журнал регистрации

Журнал не входит в 1Cv8.1CD, но его сокращают тоже из конфигуратора:

  1. Администрирование → Настройка журнала регистрации.
  2. Кнопка «Сократить», укажите дату, до которой удалить записи .
  3. При желании поставьте флажок сохранения удаляемых записей в отдельный файл.

В той же форме выберите уровень регистрации. Для большинства баз достаточно «Регистрировать ошибки и предупреждения»; режим «все события» на активной базе быстро набирает гигабайты.

Журнал бывает в двух форматах: старый — набор файлов .lgp с индексом .lgf, новый — одна база 1Cv8.lgd. Новый удобнее чистить, но сокращение в обоих случаях делается одной кнопкой из конфигуратора.

Свёртка базы

Если документы старых лет больше не нужны в рабочей базе, применяют свёртку: документы до выбранной даты удаляются, а на их место создаются документы ввода остатков. В Бухгалтерии 3.0 команда свёртки находится среди обработок раздела Администрирование → Обслуживание.

Свёртка необратима. Перед ней сделайте отдельный архив базы и сохраните его как «архив до даты свёртки». Закрытые налоговые периоды должны быть проверены и сданы.

Узлы обмена

Если база когда-то обменивалась с другой базой, которая уже не используется, удалите неактивный узел плана обмена или зарегистрированные для него изменения. Иначе каждая запись документа добавляет строку в регистрацию изменений.

Автоматическое обслуживание базы по расписанию

Разовое сжатие помогает, но через год база снова набирает вес. Лучше настроить регулярное обслуживание.

Регламентные задания 1С

В конфигурациях на БСП: Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Здесь проверьте, что включены задания, связанные с очисткой: удаление устаревших версий объектов, очистка служебных данных, удаление помеченных объектов (если вы готовы к автоматическому удалению). Откройте каждое и посмотрите расписание — разумно ставить ночное время.

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

Сжатие файловой базы по расписанию

Bat-файл из способа 3 добавьте в планировщик заданий Windows:

  1. Откройте «Планировщик заданий» и создайте простую задачу.
  2. Триггер — еженедельно, например в воскресенье в 03:00.
  3. Действие — запуск программы, укажите ваш .bat.
  4. В свойствах задачи включите «Выполнять вне зависимости от регистрации пользователя».

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

План обслуживания MS SQL Server

В SSMS: Management → Maintenance Plans. Типовой набор для базы 1С:

  • 💾 полный бэкап ежедневно и бэкап журнала каждые 1–2 часа (для модели FULL);
  • 🔧 перестроение или реорганизация индексов раз в неделю;
  • 📊 обновление статистики ежедневно;
  • 🧹 удаление старых файлов бэкапов.

Задачу Shrink Database в регулярный план не добавляйте: она каждый раз фрагментирует индексы, а файл всё равно вырастет снова.

В PostgreSQL достаточно не отключать autovacuum и раз в неделю делать VACUUM ANALYZE по крону; VACUUM FULL оставьте для разовых случаев после больших чисток.

Какой у вас случай?

Частые ошибки при сжатии базы

  • ❌ Сжимают без чистки и ждут чуда. Если внутри нет свободных страниц, размер не изменится. Сначала удаление помеченных, версий, файлов.
  • ❌ Удаляют журнал регистрации вручную при открытой базе. Удаление папки 1Cv8Log при работающих сеансах приводит к ошибкам записи журнала. Сокращайте его кнопкой из конфигуратора.
  • ❌ Ставят SHRINK файла данных в ежедневный план SQL. База от этого медленнее, а не меньше.
  • ❌ Загружают .dt поверх единственной копии. Если файл выгрузки битый, база будет потеряна. Загружайте в новую базу.
  • ❌ Запускают сжатие по расписанию без проверки лога. Скрипт может месяцами падать на неверном пароле, а все думают, что обслуживание идёт.

Частые вопросы

Насколько уменьшится база после сжатия?
Ровно на объём пустых страниц внутри файла. Если перед этим удалили много данных, эффект заметный; если нет — может быть всего несколько процентов.
Можно ли сжать базу, не выгоняя пользователей?
Файловую — нет, нужен монопольный доступ. В PostgreSQL обычный VACUUM работает без блокировки, но размер файлов он не уменьшает.
Почему копия .dt весит намного меньше самой базы?
Файл выгрузки — это сжатый архив данных без индексов и пустых страниц. Размер базы после загрузки из него будет больше, чем у .dt, но меньше исходного.
Есть ли предельный размер файловой базы?
Платформа 8.3 в современном формате файла работает и с базами в десятки гигабайт. Ограничивает скорость: при росте базы и числа одновременных пользователей файловый вариант начинает тормозить, и это сигнал переходить на клиент-серверный.
Сколько хранить журнал регистрации?
Обычно хватает 3–6 месяцев. Если журнал нужен для разбора инцидентов за больший срок, сокращайте его с сохранением удаляемых записей в файл.