Чистим и сжимаем базу данных 1С 8.3: рабочие методы

· 9 мин

Содержание

База выросла до десятков гигабайт, бэкап идёт час, а файловая база приближается к пределу, за которым начинаются сбои? Главная ошибка — сразу бежать делать 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С или в строке подключения.

Какая у вас информационная база?

Чистка данных (следующие два раздела) одинакова для всех вариантов. Различается только финальное физическое сжатие.

Удаление помеченных объектов и битых ссылок

Это первый и самый безопасный шаг — он убирает мусор, который накопился от обычной работы.

  1. Откройте Администрирование → Обслуживание → Удаление помеченных объектов.
  2. Выберите режим полного удаления (контроль ссылок включён — объект, на который ещё ссылаются, удалён не будет).
  3. Запустите поиск. Программа покажет объекты, которые нельзя удалить, и причину — другой документ или запись регистра на них ссылается.
  4. По «неудаляемым» разберитесь отдельно: либо снимите пометку, если объект нужен, либо удалите сначала то, что на него ссылается.

Регулярная пометка на удаление без последующего удаления — самая частая причина разрастания в рабочих базах. Сотни помеченных контрагентов и номенклатуры тянут за собой тысячи строк движений.

Удаление помеченных объектов устанавливает монопольную блокировку: пока идёт процесс, остальные пользователи работать не смогут. Запускайте в нерабочее время.

Отдельная история — битые (висячие) ссылки: документ ссылается на объект, которого в базе уже нет. На размер они влияют слабо, но мешают корректному удалению и провоцируют ошибки. Их ловит проверка ссылочной целостности в тестировании (следующий раздел) — там же можно выбрать, что делать с найденными ссылками: очистить или создать объекты по ссылкам.

Тестирование, исправление и сжатие таблиц файловой базы

Для файловой базы физическое уменьшение размера делается встроенными средствами платформы — без SQL.

Способ 1. Тестирование и исправление в Конфигураторе.

  1. Сделайте копию базы и закройте все сеансы.
  2. Запустите базу в режиме Конфигуратора.
  3. Откройте Администрирование → Тестирование и исправление.
  4. Для уменьшения объёма отметьте Реиндексация таблиц и Сжатие таблиц информационной базы. При подозрении на ошибки добавьте проверку логической и ссылочной целостности.
  5. Переключатель внизу поставьте в положение «Тестирование и исправление» (не только тестирование), запустите.

Сжатие таблиц физически убирает из файла .1CD место, освободившееся после удаления данных. Именно оно уменьшает размер файла на диске.

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

Альтернатива, которая пересобирает файл с нуля:

  1. В Конфигураторе: Администрирование → Выгрузить информационную базу → сохраните .dt.
  2. Создайте пустую базу или очистите текущую и загрузите .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. Определите дату свёртки — обычно начало года, за который отчётность уже сдана и закрыта.
  2. Запустите обработку свёртки (Администрирование → Обслуживание или через раздел работы с данными конкретной конфигурации).
  3. Обработка создаёт документы ввода остатков на дату свёртки.
  4. Сверьте остатки до и после — оборотно-сальдовая ведомость на дату свёртки должна совпасть.
  5. Только после сверки удаляйте помеченные старые документы.

Свёртка необратима. После удаления старых документов детализации за те периоды в базе не останется. Делайте свёртку на копии, проверяйте остатки, и только убедившись в совпадении — переносите результат в рабочую базу (или оставляйте проверенную копию как рабочую). Исходную базу сохраните в архиве на случай встречной проверки.

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

Выносим присоединённые файлы и историю из базы

Два «тихих» пожирателя объёма, которые часто дают больше эффекта, чем всё остальное вместе.

Присоединённые файлы. По умолчанию сканы и вложения хранятся внутри базы. Перенесите их в тома на диске:

  1. Откройте Администрирование → Настройки работы с файлами.
  2. Переключите хранение файлов с «в информационной базе» на «в томах на диске».
  3. Укажите каталог тома (для серверной базы — путь, доступный серверу 1С).
  4. Запустите перенос уже существующих файлов в том.

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

История изменений (версионирование объектов). Если включено версионирование, в настройках хранения версий (Администрирование → Общие настройки → История изменений либо раздел версионирования объектов) проверьте:

  • для каких объектов хранится история — возможно, версионировать нужно не всё;
  • срок хранения версий — старые версии можно удалять по расписанию.

Очистка устаревших версий освобождает место без потери актуальных данных.

Журнал регистрации. Чтобы он не рос бесконечно, ограничьте срок хранения записей и настройте разделение по периодам. Для файловой базы это делается в Конфигураторе (Администрирование → Настройка журнала регистрации), для серверной — в свойствах базы. Старые записи можно сократить, оставив, например, последние несколько месяцев.

Регламент: чтобы база не разрасталась снова

Разовая чистка даёт эффект на месяцы, но без регулярного обслуживания балласт вернётся. Настройте повторяющиеся операции и забудьте о ручной работе.

Регламент обслуживания базы 1С
Выполнено: 0 / 7

Для клиент-серверных баз перестроение индексов, обновление статистики и бэкап лога удобно вынести в регламентные задания SQL Server (SQL Agent) или в типовой механизм регламентных операций 1С, запуская их в нерабочее время.

Главный принцип: данные удаляет 1С, место освобождает СУБД. Нарушение порядка — когда сначала жмут SQL, не почистив помеченные объекты и не вынеся файлы, — даёт временный результат, и через пару месяцев всё возвращается.

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

После удаления документов в SQL база не уменьшилась. Почему?
В клиент-серверном варианте удаление данных освобождает место внутри файла, но не возвращает его операционной системе. Физический размер уменьшает только shrink (DBCC SHRINKFILE) или VACUUM FULL на PostgreSQL — после чистки и с последующим перестроением индексов.
Можно ли сжать базу без выгрузки всех пользователей?
Нет. Удаление помеченных объектов, тестирование и исправление, chdbfl.exe и свёртка требуют монопольного доступа. Shrink и обслуживание индексов на SQL технически выполнимы при работающих пользователях, но сильно тормозят базу — делают их в технологическое окно.
Что безопаснее для файловой базы — сжатие таблиц или выгрузка в .dt?
Обе операции штатные. Сжатие таблиц в тестировании работает «на месте» и быстрее. Выгрузка-загрузка .dt пересобирает файл целиком и даёт более компактный результат, но дольше. В любом случае сначала делают резервную копию.
Свёртка удалит данные, которые понадобятся при проверке?
Да, если свернуть периоды, за которые ещё могут запросить первичку и детализацию. Поэтому исходную базу перед свёрткой обязательно сохраняют в архиве — остатки в рабочей базе сойдутся, а детализация останется в копии.
Насколько реально уменьшить базу?
Зависит от источника роста. Вынос присоединённых файлов и очистка истории версий иногда убирают гигабайты. Удаление помеченных объектов и свёртка старых лет на крупных базах дают кратное сокращение. Если же база состоит из актуальных движений — сжать её значимо не получится, и это нормально.