Чистка регистров 1С 8.3 без потери данных: три рабочих способа

· 9 мин

Содержание

Почистить регистры 1С безопасно можно тремя путями: штатными командами платформы и конфигурации (пересчёт итогов, свёртка, очистка версий), обработкой на встроенном языке через НаборЗаписей.Записать() или прямым TRUNCATE в СУБД. Первый способ подходит почти всем, второй — для служебных регистров сведений, третий — только для администратора с полной копией базы под рукой.

Типичная ситуация: файловая база Бухгалтерии за пять лет выросла до 30 ГБ, открывается минуту, а отчёты по остаткам считаются по десять. Часто место занимают не проводки, а служебные данные — история версий объектов, журнал регистрации, регистрация изменений для обменов. Их и надо чистить в первую очередь.

Какие регистры 1С можно чистить, а какие трогать нельзя

Не каждый регистр 1С одинаково «засоряется», и не каждый можно безболезненно очистить. Главное правило: движения документов (регистры с регистратором) удалять в обход документов нельзя — учёт разойдётся с первичкой.

Что растётГде хранитсяМожно чистить?Чем
История изменений объектоврегистр сведений ВерсииОбъектов (БСП)Да, устаревшие версииштатная очистка или обработка
Журнал регистрациифайлы в каталоге 1Cv8LogДа, старые записикоманда «Сократить» в Конфигураторе
Регистрация изменений обменовтаблицы изменений планов обменаДа, если узел не используетсяудаление регистрации по узлу
Итоги регистров накопления и бухгалтериитаблицы итоговНе чистить, а пересчитывать«Управление итогами», «Тестирование и исправление»
Движения документов за старые годырегистры накопления, бухгалтерииТолько свёрткой«Свертка информационной базы»
Технические регистры сведений без регистраторанезависимые регистры сведенийДа, если понятна их рольобработка или SQL

Признаки, что пора чистить:

  • 📈 размер базы растёт быстрее, чем число документов;
  • 🐢 медленно открываются формы документов с историей изменений;
  • 💾 резервная копия .dt выгружается часами;
  • 🔄 обмен с РИБ или сайтом гоняет тысячи «старых» объектов.

Прежде чем что-то удалять, узнайте, какие таблицы на самом деле большие. Для клиент-серверной базы это видно в СУБД. Для файловой — через ПолучитьСтруктуруХраненияБазыДанных() (пример ниже) и сравнение с размером файла 1Cv8.1CD.

Подготовка к очистке регистров: копия, права, замер

Резервная копия

Сделайте две копии: выгрузку .dt через Конфигуратор → Администрирование → Выгрузить информационную базу и, для SQL-базы, бэкап средствами СУБД. Выгрузка .dt требует монопольного доступа — делайте её вне рабочего времени, предупредив пользователей.

Все способы ниже необратимы. Удалённые версии объектов, строки журнала и записи регистров вернуть можно только из копии.

Права

  • 🔑 для штатных команд — роль «Полные права» (или «Администратор системы»);
  • 🛠 для обработки — тоже полные права, иначе запись набора упадёт на проверке прав;
  • 🗄 для SQL — учётная запись с правом изменения базы (db_owner в MS SQL или владелец базы в PostgreSQL).

Замер «до»

Зафиксируйте три цифры: размер базы (файла 1Cv8.1CD или базы в СУБД), размер выгрузки .dt, время формирования одного тяжёлого отчёта, например оборотно-сальдовой ведомости за год. После очистки сравните — так видно, был ли толк.

Для клиент-серверной базы на MS SQL самые большие таблицы покажет запрос:

SELECT TOP 20 t.name AS table_name,
       SUM(p.rows) AS rows_count,
       SUM(a.total_pages) * 8 / 1024 AS size_mb
FROM sys.tables t
JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id IN (0,1)
JOIN sys.allocation_units a ON p.partition_id = a.container_id
GROUP BY t.name
ORDER BY size_mb DESC;

Имена вида _InfoRg1234 — регистры сведений, _AccumRg — регистры накопления, _AccRg — регистры бухгалтерии. Какому объекту конфигурации соответствует таблица, покажет код из раздела про SQL.

Способ 1. Чистим регистры 1С штатными средствами

Самый безопасный вариант: платформа и конфигурация сами следят за целостностью. Начинайте с него.

Пересчёт итогов вместо очистки

Если медленно считаются остатки, виноваты чаще всего не сами движения, а испорченные или не разделённые итоги. Их не удаляют, а пересчитывают:

  1. В режиме 1С:Предприятие включите команду «Все функции»: Главное меню → Сервис → Параметры → Отображать команду «Все функции».
  2. Откройте Главное меню → Все функции → Стандартные → Управление итогами.
  3. Нажмите «Пересчитать итоги» (или выберите нужные регистры в полном режиме формы).

Альтернатива — Конфигуратор → Администрирование → Тестирование и исправление, галочка «Пересчет итогов». Этой операции нужен монопольный режим.

💡 Для регистров накопления с большим числом пользователей полезно включить разделение итогов в той же форме «Управление итогами» — меньше взаимных блокировок при проведении.

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

Журнал не регистр, но при вопросе «почему база весит 40 ГБ» его часто находят первым. В файловой базе он лежит в подкаталоге 1Cv8Log рядом с 1Cv8.1CD, в серверной — в каталоге кластера на сервере.

  1. Откройте Конфигуратор → Администрирование → Журнал регистрации.
  2. В окне журнала выберите команду «Сократить…».
  3. Укажите дату, до которой удалить записи, и при необходимости сохраните удаляемую часть в файл.

Чтобы журнал не разрастался снова, в Администрирование → Настройка журнала регистрации уменьшите уровень (например, «Ошибки» вместо «Все события») и включите разделение по периодам — старые файлы потом проще удалять или архивировать.

Устаревшие версии объектов

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

Свёртка информационной базы

Если тяжёлыми стали именно движения документов за много лет, штатный выход — свёртка. В Бухгалтерии 3.0 обработка «Свертка информационной базы» доступна в разделе Администрирование → Обслуживание. Она удаляет документы до даты свёртки и вводит вместо них остатки.

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

Способ 2. Очистка регистра сведений обработкой

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

Полная очистка регистра — это запись пустого набора без отбора:

&НаСервере
Процедура ОчиститьРегистрПолностьюНаСервере()
	НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
	НаборЗаписей.ОбменДанными.Загрузка = Истина; // не запускать подписки и регистрацию к обмену
	НаборЗаписей.Записать(); // пустой набор без отбора удаляет все записи регистра
КонецПроцедуры

Чаще нужно удалить только старое. Для периодического регистра — по периодам, порциями:

&НаСервере
Процедура УдалитьЗаписиДоДатыНаСервере(ДатаГраницы)
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Т.Период КАК Период
	|ИЗ
	|	РегистрСведений.ИмяРегистра КАК Т
	|ГДЕ
	|	Т.Период < &ДатаГраницы";
	Запрос.УстановитьПараметр("ДатаГраницы", ДатаГраницы);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Удалено = 0;
	Пока Выборка.Следующий() Цикл
		НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.Период.Установить(Выборка.Период);
		НаборЗаписей.ОбменДанными.Загрузка = Истина;
		НаборЗаписей.Записать(); // удаляет все записи за этот период
		Удалено = Удалено + 1;
	КонецЦикла;
	
	Сообщить("Очищено периодов: " + Формат(Удалено, "ЧГ=0"));
КонецПроцедуры

Замените ИмяРегистра на имя из дерева метаданных. Чтобы удалить записи по одному измерению, добавьте отбор: НаборЗаписей.Отбор.ИмяИзмерения.Установить(Значение).

💡 Сначала прогоните обработку на копии и сравните число записей до и после простым запросом ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.ИмяРегистра.

Для регистров накопления и бухгалтерии этот приём не годится. Их наборы привязаны к регистратору: запись пустого набора с отбором по документу оставит проведённый документ без движений. Отчёты начнут расходиться с документами, а при перепроведении движения появятся снова.

Способ 3. Прямая очистка таблиц регистров через SQL

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

  • 🛑 только независимые регистры сведений и таблицы, роль которых вы понимаете;
  • 🛑 никогда — регистры накопления, бухгалтерии, расчёта и их таблицы итогов;
  • 🛑 фирма 1С прямое изменение данных в СУБД не поддерживает, разбираться с последствиями придётся самому.

Как узнать имя таблицы

Выполните в обработке или консоли кода:

Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого Строка Из Структура Цикл
	Если СтрНайти(Строка.ИмяТаблицы, "РегистрСведений.ИмяРегистра") > 0 Тогда
		Сообщить(Строка.ИмяТаблицы + " → " + Строка.ИмяТаблицыХранения);
	КонецЕсли;
КонецЦикла;

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

Сам запрос

Перед запуском завершите сеансы пользователей и заблокируйте начало новых в консоли кластера — иначе работающие пользователи получат ошибки посреди операции. Выбирайте нерабочее время.

Полная очистка (MS SQL и PostgreSQL одинаково, имя таблицы — ваше):

TRUNCATE TABLE _InfoRg1234;

Удаление по дате:

-- MS SQL: база создана со смещением дат 2000, поэтому 2023 год хранится как 4023
DELETE FROM _InfoRg1234 WHERE _Period < '4023-01-01';

-- PostgreSQL: смещения нет
DELETE FROM _inforg1234 WHERE _period < '2023-01-01';

Смещение дат задаётся при создании базы на MS SQL. Посмотрите реальные значения в поле _Period запросом SELECT TOP 10, прежде чем писать условие.

После SQL-очистки перезапустите службу сервера 1С или хотя бы рабочие процессы кластера, чтобы сбросить закэшированные данные. Это снова обрывает сеансы — делайте в том же окне обслуживания.

Сравнение трёх способов

СпособКогдаРискСкорость
Штатные командывсегда, начинать с нихминимальныйсредняя
Обработка 1Стехнические регистры сведений, нужен отборсредний, если перепутать регистрмедленно на миллионах строк
SQLогромные таблицы, клиент-серверная базавысокий, без контроля платформысекунды-минуты

Проверка базы после очистки регистров

Очистка сама по себе место на диске не освобождает: СУБД и файловая база помечают страницы как свободные, но размер файла не меняют.

  1. Тестирование и исправление. Конфигуратор → Администрирование → Тестирование и исправление: «Реиндексация таблиц», «Проверка логической целостности», «Пересчет итогов», «Сжатие таблиц информационной базы». Для файловой базы именно сжатие уменьшает 1Cv8.1CD. Нужен монопольный режим.
  2. Обслуживание СУБД. В MS SQL — перестроение индексов и обновление статистики; сжатие файла (DBCC SHRINKFILE) — только если место действительно нужно, после него снова перестройте индексы. В PostgreSQL — VACUUM ANALYZE, а для возврата места системе — VACUUM FULL по очищенной таблице (блокирует её на время работы).
  3. Сверка учёта. Сформируйте ту же оборотно-сальдовую ведомость, что и до очистки. Если чистили только служебные регистры, цифры должны совпасть до копейки.
  4. Замер «после». Размер базы, размер .dt, время отчёта — сравните с цифрами до.
Окно обслуживания: ничего не забыть
Выполнено: 0 / 6

Ошибки при чистке регистров и как их избежать

  • ❌ Удалили движения регистра накопления «лишнего» документа. Документ остался проведённым, остатки съехали. Правильно — отменить проведение или пометить документ на удаление и удалить через «Удаление помеченных объектов».
  • ❌ Почистили регистр, а база не уменьшилась. Не выполнено сжатие таблиц (файловая база) или VACUUM FULL/сжатие файла (СУБД).
  • ❌ Очистили регистрацию изменений рабочего узла обмена. Изменения не уйдут в периферийную базу или на сайт, данные разойдутся. Удаляйте регистрацию только по узлам, которые точно отключены, или после полной повторной синхронизации.
  • ❌ Перепутали _InfoRg с похожим номером. Номер таблицы у каждой базы свой. Имя всегда берите из ПолучитьСтруктуруХраненияБазыДанных() той же базы, а не из статьи или чужой инструкции.
  • ❌ Журнал снова 20 ГБ через месяц. Причина не устранена: уровень журнала «Все события» или регламентное задание, которое пишет ошибку каждую минуту. Найдите повторяющееся событие в журнале и исправьте его.

Частые вопросы про очистку регистров 1С

Можно ли очистить регистр 1С в файловой базе?
Да. Штатные команды и обработка работают одинаково. SQL-способа у файловой базы нет, а место освобождает только «Сжатие таблиц информационной базы» в Конфигураторе.
Почему после удаления помеченных объектов база не уменьшилась?
Удаление освобождает страницы внутри файла, но не уменьшает сам файл. Нужно сжатие таблиц в файловой базе или обслуживание в СУБД.
Нужен ли монопольный режим для очистки регистра обработкой?
Нет, запись набора работает при подключённых пользователях. Но на больших объёмах возможны блокировки, поэтому лучше запускать вне рабочего времени.
Как часто чистить журнал регистрации?
Удобнее не чистить вручную, а включить разделение по периодам и хранить, например, последние 3–6 месяцев. Старые файлы можно архивировать вне базы.
Влияет ли очистка версий объектов на учёт?
Нет. История версий — справочная информация о том, кто и что менял. Остатки и обороты от неё не зависят, но посмотреть, кто изменил старый документ, после очистки уже не получится.