Чистка регистров 1С 8.3 без потери данных: три рабочих способа
Содержание
Почистить регистры 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С:Предприятие включите команду «Все функции»:
Главное меню → Сервис → Параметры → Отображать команду «Все функции». - Откройте
Главное меню → Все функции → Стандартные → Управление итогами. - Нажмите «Пересчитать итоги» (или выберите нужные регистры в полном режиме формы).
Альтернатива — Конфигуратор → Администрирование → Тестирование и исправление, галочка «Пересчет итогов». Этой операции нужен монопольный режим.
💡 Для регистров накопления с большим числом пользователей полезно включить разделение итогов в той же форме «Управление итогами» — меньше взаимных блокировок при проведении.
Журнал регистрации
Журнал не регистр, но при вопросе «почему база весит 40 ГБ» его часто находят первым. В файловой базе он лежит в подкаталоге 1Cv8Log рядом с 1Cv8.1CD, в серверной — в каталоге кластера на сервере.
- Откройте
Конфигуратор → Администрирование → Журнал регистрации. - В окне журнала выберите команду «Сократить…».
- Укажите дату, до которой удалить записи, и при необходимости сохраните удаляемую часть в файл.
Чтобы журнал не разрастался снова, в Администрирование → Настройка журнала регистрации уменьшите уровень (например, «Ошибки» вместо «Все события») и включите разделение по периодам — старые файлы потом проще удалять или архивировать.
Устаревшие версии объектов
В типовых конфигурациях на БСП (Бухгалтерия 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 | огромные таблицы, клиент-серверная база | высокий, без контроля платформы | секунды-минуты |
Проверка базы после очистки регистров
Очистка сама по себе место на диске не освобождает: СУБД и файловая база помечают страницы как свободные, но размер файла не меняют.
- Тестирование и исправление.
Конфигуратор → Администрирование → Тестирование и исправление: «Реиндексация таблиц», «Проверка логической целостности», «Пересчет итогов», «Сжатие таблиц информационной базы». Для файловой базы именно сжатие уменьшает1Cv8.1CD. Нужен монопольный режим. - Обслуживание СУБД. В MS SQL — перестроение индексов и обновление статистики; сжатие файла (
DBCC SHRINKFILE) — только если место действительно нужно, после него снова перестройте индексы. В PostgreSQL —VACUUM ANALYZE, а для возврата места системе —VACUUM FULLпо очищенной таблице (блокирует её на время работы). - Сверка учёта. Сформируйте ту же оборотно-сальдовую ведомость, что и до очистки. Если чистили только служебные регистры, цифры должны совпасть до копейки.
- Замер «после». Размер базы, размер
.dt, время отчёта — сравните с цифрами до.
Ошибки при чистке регистров и как их избежать
- ❌ Удалили движения регистра накопления «лишнего» документа. Документ остался проведённым, остатки съехали. Правильно — отменить проведение или пометить документ на удаление и удалить через «Удаление помеченных объектов».
- ❌ Почистили регистр, а база не уменьшилась. Не выполнено сжатие таблиц (файловая база) или
VACUUM FULL/сжатие файла (СУБД). - ❌ Очистили регистрацию изменений рабочего узла обмена. Изменения не уйдут в периферийную базу или на сайт, данные разойдутся. Удаляйте регистрацию только по узлам, которые точно отключены, или после полной повторной синхронизации.
- ❌ Перепутали
_InfoRgс похожим номером. Номер таблицы у каждой базы свой. Имя всегда берите изПолучитьСтруктуруХраненияБазыДанных()той же базы, а не из статьи или чужой инструкции. - ❌ Журнал снова 20 ГБ через месяц. Причина не устранена: уровень журнала «Все события» или регламентное задание, которое пишет ошибку каждую минуту. Найдите повторяющееся событие в журнале и исправьте его.