Чистим раздутые регистры сведений 1С 8.3: от поиска виновника до сжатия базы
Содержание
Очистить регистр сведений
(РС) в 1С 8.3 можно тремя путями: удалить документы-регистраторы через Администрирование → Обслуживание → Корректировка данных → Удаление помеченных объектов, включить штатную очистку, если регистр служебный (версии объектов, очереди обмена), или записать пустой набор записей кодом из внешней обработки. Консоль запросов сама ничего не удаляет: она только находит лишние записи. После любой очистки базу надо обслужить, иначе файл или таблицы на сервере СУБД не уменьшатся и ускорения работы вы не увидите.
Порядок всегда один: сначала узнать, какой регистр раздут и почему, потом выбрать способ. Удалять «наугад» записи регистра сведений опасно: в нём часто лежат цены, курсы, настройки и состояния документов, без которых программа считает неправильно.
С чего начать: какой регистр раздут и можно ли его чистить
Тормозит обычно не «база вообще», а одна-две таблицы. Найти их можно так.
Файловая база. Размер файла 1Cv8.1CD виден в папке базы, но по таблицам он не делится. Используйте функцию платформы ПолучитьРазмерДанныхБазыДанных() (есть в платформе 8.3.15 и выше): во внешней обработке передайте ей объект метаданных регистра и получите размер в байтах. Пройдитесь циклом по Метаданные.РегистрыСведений и отсортируйте результат.
Клиент-серверная база . Размеры таблиц быстрее взять в СУБД:
- 🗄️ MS SQL Server — отчёт «Disk Usage by Top Tables» в SQL Server Management Studio;
- 🐘 PostgreSQL — запрос к
pg_total_relation_sizeпо таблицам схемы;
Таблицы называются вида _InfoRg1234. Чтобы понять, какой это регистр, вызовите в 1С ПолучитьСтруктуруХраненияБазыДанных(): она вернёт соответствие имени таблицы СУБД и объекта метаданных.
-- PostgreSQL: 20 самых крупных таблиц базы
SELECT relname AS table_name,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;
Дальше решите, к какому типу относится регистр. От этого зависит способ очистки.
| Тип регистра | Как появляются записи | Чем чистить |
|---|---|---|
| Подчинён регистратору | Движения документов | Удаление документов или перепроведение |
| Независимый, служебный | Механизмы программы (версии, очереди, кэши) | Штатная настройка или регламентное задание |
| Независимый, учётный (цены, курсы, настройки) | Ввод пользователем, загрузка | Только выборочно и после согласования |
Перед любой очисткой сделайте резервную копию базы (выгрузку .dt или бэкап средствами СУБД) и проверьте, что она разворачивается. Записи регистра сведений не помечаются на удаление: удалённое не вернуть кнопкой «Отменить».
Тип регистра виден в Конфигураторе: откройте ветку Регистры сведений, двойной щелчок по регистру, вкладка Основные — поле «Режим записи» (Независимый или Подчинение регистратору) и «Периодичность».
Удаление помеченных объектов: когда оно очищает регистр
Штатное удаление помеченных работает с документами и справочниками, а не с записями регистров. Но если регистр подчинён регистратору, при удалении документа платформа удаляет и все его движения. Так очищаются, например, регистры, которые заполняют старые документы обмена, загрузки выписок, ввода цен.
Порядок для БП 3.0, ЗУП 3.1, УТ 11:
- Отберите документы, которые больше не нужны, и пометьте их на удаление (
Delв списке или команда «Пометить на удаление»). - Откройте
Администрирование → Обслуживание → Корректировка данных → Удаление помеченных объектов. - Выберите режим удаления: всё помеченное или выборочно.
- Запустите удаление и дождитесь окна со списком объектов, которые удалить не удалось.
- По каждому неудалённому посмотрите, где на него ссылаются. Пока ссылка есть, объект и его движения останутся.
💡 В тех же конфигурациях обработка доступна и через Все функции → Стандартные → Удаление помеченных объектов. Если пункта «Все функции» нет, включите его: Сервис и настройки → Параметры → Отображать команду «Все функции».
Независимый регистр этим способом не очистится никогда. Записи цен номенклатуры за 2015 год останутся, даже если вы удалите все документы того года.
Консоль запросов: как найти лишние записи
Язык запросов 1С умеет только читать данные. Команд DELETE и UPDATE, как в SQL, в нём нет. Поэтому консоль запросов нужна на этапе разведки: понять, сколько записей и за какие периоды занимают место.
Консоль — это внешняя обработка, она запускается в режиме 1С:Предприятие (Файл → Открыть), а не в Конфигураторе. Пример запроса, который считает записи по годам:
ВЫБРАТЬ
ГОД(Т.Период) КАК Год,
КОЛИЧЕСТВО(*) КАК Записей
ИЗ
РегистрСведений.ЛогЗапросов КАК Т
СГРУППИРОВАТЬ ПО
ГОД(Т.Период)
УПОРЯДОЧИТЬ ПО
Год
ЛогЗапросов здесь условное имя: подставьте свой регистр. Для непериодического регистра группируйте по измерению, например по организации или объекту.
Что даёт такой отчёт:
- 📊 видно, за какие годы накопилось больше всего записей;
- 🔍 можно проверить, нет ли записей с пустыми ссылками или ссылками на удалённые объекты («<Объект не найден>»);
- 🧮 вы заранее знаете, сколько записей удалит обработка, и сверяете число после.
А Конфигуратор в этой работе нужен для двух вещей: посмотреть структуру регистра и после очистки запустить тестирование и исправление.
Удаление записей регистра кодом и внешними обработками
Если регистр независимый и штатной очистки для него нет, записи удаляют кодом. Принцип: создать набор записей, установить отбор и записать его пустым. Платформа заменит записи, попавшие под отбор, на пустой набор, то есть удалит их.
Ниже готовая серверная процедура для внешней обработки. Она удаляет записи периодического регистра старше заданной даты. У регистра одно измерение Объект; если измерений больше, добавьте их в запрос и в отбор.
&НаСервереБезКонтекста
Процедура УдалитьЗаписиДоДаты(ДатаГраницы)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Период КАК Период,
| Т.Объект КАК Объект
|ИЗ
| РегистрСведений.ЛогЗапросов КАК Т
|ГДЕ
| Т.Период < &ДатаГраницы";
Запрос.УстановитьПараметр("ДатаГраницы", ДатаГраницы);
Выборка = Запрос.Выполнить().Выбрать();
Удалено = 0;
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ЛогЗапросов.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Выборка.Период);
Набор.Отбор.Объект.Установить(Выборка.Объект);
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать(Истина);
Удалено = Удалено + 1;
КонецЦикла;
Сообщить("Удалено наборов: " + Формат(Удалено, "ЧГ=0"));
КонецПроцедуры
Что важно в этом коде:
Записать(Истина)— режим замещения: всё, что попало под отбор, заменяется пустым набором;ОбменДанными.Загрузка = Истина— сигнал обработчикамПередЗаписьюи подпискам на события, что идёт служебная запись. Типовой код в этом режиме пропускает проверки и дополнительные действия, удаление идёт быстрее. Если регистр участвует в обмене, проверьте на копии, регистрируются ли удаления к отправке, или уберите эту строку;- каждый вызов
Записать— отдельная транзакция. Если прервать обработку, удалённое останется удалённым, а остальное — на месте.
Полностью очистить независимый регистр можно короче: создать набор без отбора и записать его. Применяйте это только к служебным регистрам, про которые точно знаете, что программа заполнит их заново.
Набор = РегистрыСведений.ЛогЗапросов.СоздатьНаборЗаписей();
Набор.Записать();
Для регистра, подчинённого регистратору, так делать нельзя. Отбор по Регистратор и пустая запись удалят движения документа, а сам документ останется проведённым. Отчёты разойдутся с документами. Такие регистры чистите через документы: отмена проведения, удаление или перепроведение.
Готовые универсальные обработки для удаления записей тоже есть, они работают по тому же принципу. Перед запуском чужой обработки откройте её модуль и проверьте, что она удаляет именно то, что вы выбрали. Для открытия внешних обработок у пользователя должна быть соответствующая роль, обычно это администратор.
Правка → Найти по имени регистра). Пока не ясно, кто пишет записи, не удаляйте.Штатная очистка служебных регистров
Часто раздут не учётный регистр, а служебный регистр библиотеки стандартных подсистем. Для многих из них очистка уже предусмотрена.
Версии объектов. Если включено версионирование, регистр ВерсииОбъектов растёт с каждой записью документа и справочника. В БП 3.0 и ЗУП 3.1 настройки лежат в Администрирование → Общие настройки, группа про историю изменений. Там задают срок хранения версий и запускают удаление устаревших. Срок в 1–2 года обычно не мешает ни разбору спорных правок, ни проверкам.
Регистрация изменений для обмена. Записи о том, что надо передать в другую базу, хранятся в таблицах плана обмена, а не в регистре. Они очищаются после успешного обмена. Если обмен давно не работает , таблица растёт бесконечно. Решение — восстановить обмен или отключить узел, которым больше не пользуются.
Журнал регистрации. Это не регистр, а отдельные файлы в каталоге базы. Его размер задаётся в Конфигураторе: Администрирование → Настройка журнала регистрации, там же есть сокращение журнала с выгрузкой старых записей в файл.
💡 Прежде чем писать код удаления, найдите в коде конфигурации, кто заполняет регистр. Если это подсистема с настройками, правильнее изменить настройку, чем стирать записи, которые на следующий день появятся снова.
Автоматическая очистка через регламентные задания
Разовая чистка помогает на месяц, если регистр продолжает расти. Надёжнее поставить очистку на расписание.
Посмотреть штатные задания можно в Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Найдите в списке задания, в названии которых есть «удаление» или «очистка»: удаление помеченных объектов, очистка устаревших версий и другие. Откройте задание и проверьте:
- Включено ли оно (флажок «Включено»).
- Какое у него расписание. Тяжёлые задания ставьте на ночь или выходные.
- Когда оно выполнялось последний раз и с каким результатом.
В клиент-серверной базе регламентные задания выполняет сервер 1С. Убедитесь, что в консоли кластера для базы не стоит запрет на их выполнение («Блокировка регламентных заданий включена»). В файловой базе задания выполняются, только пока к базе подключён хотя бы один клиентский сеанс.
Для собственного регистра без штатной очистки создайте регламентное задание в расширении конфигурации. В его обработчик положите процедуру удаления из предыдущего раздела с параметром «хранить N дней». Расширение не снимает конфигурацию с поддержки, поэтому обновления пройдут без ручного сравнения.
Обслуживание базы после очистки данных
После удаления записей место внутри базы освобождается, но файл и таблицы СУБД сами не уменьшаются. Скорость тоже может не измениться, пока не перестроены индексы и статистика.
| База | Что сделать | Когда |
|---|---|---|
| Файловая | Конфигуратор → Администрирование → Тестирование и исправление, флажок «Сжатие таблиц информационной базы» | В нерабочее время, нужен монопольный доступ |
| Файловая, сильно раздута | Выгрузка в .dt и загрузка в новую пустую базу | Если сжатие не дало результата |
| MS SQL Server | Перестроение индексов и обновление статистики (план обслуживания) | Ночью, после крупной очистки |
| PostgreSQL | VACUUM ANALYZE по таблице; VACUUM FULL — только в окно простоя | Сразу после очистки |
Тестирование и исправление с монопольным доступом, VACUUM FULL и загрузка .dt блокируют базу. Предупредите пользователей и делайте это вне рабочего дня: все открытые сеансы придётся завершить.
На MS SQL не злоупотребляйте сжатием файла данных (SHRINKFILE): оно фрагментирует индексы, и база снова вырастет при обычной работе. Освободившееся место СУБД переиспользует сама.
Проверить результат просто. Повторите замер размеров из первого раздела и сравните время типичной операции, ради которой затевали очистку: открытие формы, проведение документа, формирование отчёта.
Частые ошибки при очистке регистров
- ❌ Чистить регистр, который раздувается из-за сбоя. Например, зацикленный обмен или задание, которое пишет одно и то же раз в минуту. Через неделю регистр снова огромный. Сначала устраните источник.
- ❌ Удалять движения документов кодом. Документ числится проведённым, а движений нет. Такие расхождения потом ищут неделями.
- ❌ Очищать регистр с ценами или курсами «до начала года». Периодический регистр отдаёт срез последних значений. Если у товара цена не менялась три года, удаление старых записей оставит его без цены. Удаляйте только записи, после которых есть более новая запись по тем же измерениям.
- ❌ Не проверить результат на копии. Отчёты, которые читают регистр, надо сравнить до и после на тестовой базе.
- ❌ Ждать ускорения сразу после удаления. Без сжатия, перестроения индексов и обновления статистики выигрыш минимален.
Частые вопросы
Можно ли удалить записи регистра сведений вручную из формы списка?
Del. Для тысяч записей это неудобно, и удаление подчинённых регистров так обычно недоступно.Почему записи регистра не помечаются на удаление, как документы?
Сколько времени займёт удаление миллиона записей?
Затронет ли очистка регистра обмен с другими базами?
ОбменДанными.Загрузка = Истина поведение регистрации зависит от конфигурации, поэтому проверьте его на копии, чтобы базы не разошлись.