Очистка истории версий объектов в 1С 8.3: все способы

· 9 мин

Содержание

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

Механизм версионирования запоминает каждое изменение документа или справочника: кто, когда и что поменял. Удобно для разбора полётов, но за год-два таблица версий раздувается до десятков гигабайт и тянет базу вниз. Удаление старых версий возвращает место и ускоряет обслуживание, при этом сами документы и проводки не трогаются — чистится только архив изменений.

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

Что именно удаляется и почему это безопасно для учёта

Версионирование — часть Библиотеки стандартных подсистем (БСП). Оно есть в типовых: Бухгалтерия 3.0, ЗУП 3.1, Управление торговлей 11, ERP, Комплексная автоматизация.

Все версии складываются в отдельный регистр сведений ВерсииОбъектов. В нём лежат:

  • 🔗 ссылка на объект, у которого есть история;
  • 📦 сам снимок версии — двоичные данные в поле типа «хранилище значения»;
  • 🕒 дата версии, автор, комментарий.

Ключевой момент: этот регистр самостоятельный и не связан ссылками с документами, движениями и бухгалтерскими итогами. Если удалить из него все записи, текущие данные базы, проводки и отчётность останутся нетронутыми. Пропадёт только возможность посмотреть, как объект выглядел раньше.

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

Что проверить перед очисткой версий

Перед любым из методов стоит подготовиться. Особенно это касается варианта с прямым доступом к СУБД.

Подготовка к очистке версий объектов
Выполнено: 0 / 5

Оценить размер версий проще всего на стороне СУБД. Для MS SQL Server откройте список таблиц базы и отсортируйте по занимаемому месту — таблица регистра версий обычно оказывается в самом верху, её имя начинается с _InfoRg. Если версии давно включены, нередко именно она занимает половину базы.

Второй ориентир — какие объекты «версионируются» активнее всего. Обычно это часто редактируемые документы: реализации, поступления, заказы. Если по ним правок много и давно, именно их версии и дают основной объём регистра. Это подсказка, что чистить, если решите удалять выборочно.

Прямое имя таблицы (_InfoRgXXXX) угадывать вручную не нужно и опасно — номер в разных базах разный. Как получить его точно — в разделе про SQL ниже.

Штатная очистка средствами 1С по сроку хранения

Самый безопасный способ — не лезть в СУБД, а ограничить хранение штатно. 1С сама удалит лишнее фоновым заданием.

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

Дальше порядок действий:

  1. Убедитесь, что версионирование вообще включено и для каких объектов.
  2. Задайте политику хранения — доступны варианты вроде «хранить все версии», «хранить за последние несколько месяцев» или «хранить последние N версий по объекту».
  3. Сохраните настройку. Записи, которые выходят за срок, пометятся как устаревшие.
  4. Фактическое удаление выполнит регламентное задание очистки устаревших версий — оно отрабатывает по расписанию.

Если ждать расписание не хочется, регламентные задания можно запустить вручную: Администрирование → Обслуживание → Регламентные и фоновые задания, найти задание очистки версий и выполнить его. На клиент-серверной базе задания идут на сервере, на файловой — только когда база открыта.

Этот способ не блокирует работу: пользователи могут оставаться в базе. Минус — большой объём старых версий удаляется порциями и не мгновенно, а место в файле базы сразу не высвобождается (см. раздел про уменьшение размера).

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

Удаление версий напрямую через SQL

Когда версий накопились десятки гигабайт, штатная очистка порциями может идти слишком долго. Администраторы СУБД в таком случае чистят таблицу регистра напрямую. Это быстро, но ответственность на вас.

Шаг 1. Узнать точное имя таблицы. Не угадывайте — получите соответствие метаданных и физических таблиц штатно. В 1С это делает функция ПолучитьСтруктуруХраненияБазыДанных (англ. GetDBStorageStructureInfo); её можно вызвать во внешней обработке и найти строку для регистра сведений ВерсииОбъектов. В ответе будет физическое имя таблицы вида _InfoRgXXXX и имена полей.

Шаг 2. Остановить запись в базу. Перед операцией завершите сеансы пользователей или заблокируйте вход.

1С не знает о прямых изменениях в СУБД. Делайте это на базе без активных сеансов и только после резервной копии. Прерывание пользователей в разгар работы оборвёт их несохранённые действия.

Шаг 3. Удалить данные. Два варианта:

  • Полная очистка всей истории — очистить таблицу целиком:
TRUNCATE TABLE _InfoRgXXXX;
  • Удаление только старых версий по дате — обычный DELETE с условием по полю даты (имя поля возьмите из структуры хранения, оно тоже «зашифровано» вида _Fld...):
DELETE FROM _InfoRgXXXX
WHERE _Fld_Period < '2024-01-01';

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

Чтобы DELETE не раздул журнал транзакций на десятки гигабайт, удаляйте не одним запросом, а пачками — например, по сто тысяч строк в цикле DELETE TOP (100000) ..., с контрольной точкой между итерациями. На базе в полной модели восстановления журнал всё равно будет расти, поэтому следите за свободным местом под него и делайте бэкап лога по ходу. Для разовой чистки нередко удобнее временно переключить базу на простую модель восстановления, но это решение администратора СУБД — оно влияет на схему резервного копирования.

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

Для файловых баз (.1CD) прямого SQL нет — там только штатная очистка и последующая выгрузка-загрузка .dt для компактизации.

Внешние обработки для выборочной очистки

Между «удалить всё в СУБД» и «ждать регламентное задание» есть промежуточный вариант — внешние обработки.

Они работают средствами платформы (через объектную модель, а не напрямую в таблице) и позволяют:

  • 🎯 удалить версии выборочно — по виду объекта, по периоду, по конкретным ссылкам;
  • 📊 сначала посмотреть статистику : сколько версий и по каким объектам накопилось;
  • 🧹 почистить «висящие» версии удалённых объектов.

Плюс таких обработок — безопасность: они не ломают структуру и работают по правилам 1С. Минус — скорость: на гигантских объёмах обработка через объектную модель медленнее прямого TRUNCATE.

Внешнюю обработку запускайте только из проверенного источника и сначала на копии базы. Чужой код с полным доступом к данным — это риск.

Если нужной готовой обработки нет, выборочную очистку по тем же принципам может написать ваш программист 1С: обойти записи регистра ВерсииОбъектов с отбором по дате и удалить их наборами.

Когда историю версий удалять не стоит

Чистить версии полезно не всегда. Прежде чем стирать всё подчистую, прикиньте, не пригодится ли архив.

  • 🧾 Идёт разбор спорной операции. Если выясняете, кто и когда поменял сумму в документе, история версий — единственный источник ответа. Удалите — доказательств не останется.
  • 👥 Много пользователей и правок задним числом. В базах, где документы часто редактируют, версионирование работает как журнал контроля. Полностью отключать его рискованно.
  • 📅 Недавний период. Версии за последние месяцы лучше сохранить: именно свежие правки чаще всего приходится поднимать.

Разумный компромисс — не удалять историю целиком, а оставить окно в несколько месяцев и чистить только то, что старше. Как раз для этого в штатной настройке есть выбор срока хранения, а в SQL — условие по дате.

Если версионирование включено «на всякий случай», но историю никто ни разу не поднимал, его проще отключить для лишних объектов, чем регулярно чистить раздувшийся регистр.

Чем версии объектов отличаются от версий в хранилище конфигурации

Запрос «очистить версии объектов» часто смешивают с очисткой хранилища конфигурации — это разные вещи.

Что чистимВерсии объектов (данные)Версии в хранилище конфигурации
Что хранитисторию изменений документов и справочниковисторию изменений кода и метаданных
Где лежитрегистр ВерсииОбъектов внутри базыотдельное хранилище (файл 1cv8ddb.1CD)
Кого касаетсябухгалтеров и учётные данныеразработчиков и доработку конфигурации
Как чиститьспособы из этой статьи«свёртка» (сжатие) хранилища в Конфигураторе

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

Что сделать после очистки, чтобы вернуть место

Важная деталь: после удаления записей файл базы данных сам по себе не уменьшается. СУБД помечает место как свободное, но держит его за собой. Чтобы реально вернуть гигабайты на диск, нужны ещё два шага.

1. Обслуживание таблиц. После массового удаления статистика и индексы устаревают. Запустите реиндексацию и обновление статистики. В 1С это делает Тестирование и исправление (Конфигуратор → Администрирование → Тестирование и исправление, пункт «Реиндексация таблиц»). На стороне MS SQL — перестроение индексов таблицы версий.

2. Сжатие файла базы. Чтобы освободившееся место вернулось в файловую систему:

  • MS SQL — операция сжатия базы (DBCC SHRINKDATABASE или через управление файлами в SSMS);
  • файловая база .1CD — выгрузка в .dt и загрузка обратно, либо Тестирование и исправление со сжатием.

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

После этих шагов размер базы заметно снижается, а скорость обслуживания (бэкапы, ТиИ) растёт, потому что обрабатывать нужно меньше данных.

Какой способ очистки версий выбрать?

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

Удаление версий объектов не повредит документам и отчётности?
Нет. Регистр версий самостоятельный и не связан с учётными данными. Пропадёт только история изменений — сами документы, проводки и остатки останутся прежними.
Почему после очистки размер базы не уменьшился?
СУБД не отдаёт освободившееся место автоматически — помечает его как свободное внутри файла. Чтобы вернуть место на диск, выполните сжатие базы, а затем перестройте индексы.
Можно ли чистить версии, не выгоняя пользователей из базы?
При штатной очистке по сроку хранения — да, регламентное задание работает фоном. При прямом удалении через SQL — нет: нужно остановить запись в базу и сделать резервную копию.
Как вообще отключить накопление версий, чтобы они не росли?
В настройках версионирования (Администрирование → История изменений) выключите версионирование для тех типов объектов, по которым история не нужна. Новые версии перестанут создаваться.
Чем очистка версий объектов отличается от свёртки базы?
Свёртка убирает старые документы и движения, заменяя их остатками на дату, — меняет учётные данные. Очистка версий удаляет только архив изменений и на текущие данные не влияет. Это разные операции.