Очистка регистров сведений и движений в 1С 8.3: три рабочих способа
Содержание
Закрыть регистр в 1С — значит удалить из него ненужные записи: целиком, за период или по одному значению измерения. Независимый регистр сведений
чистят вручную через Главное меню → Все функции или кодом, записывая пустой набор записей. Регистр, подчинённый регистратору, чистят только через документы — отменой проведения.
Способ зависит от типа регистра, объёма данных и того, нужна ли вам история. Всё ниже относится к платформе 1С:Предприятие 8.3 с интерфейсом «Такси» и одинаково работает в любой типовой конфигурации: БП 3.0, ЗУП 3.1, УТ 11.
Какие бывают регистры и почему их чистят
Перед очисткой посмотрите свойства регистра в конфигураторе. Два параметра решают всё: режим записи и периодичность.
| Тип регистра | Откуда берутся записи | Как удалять |
|---|---|---|
| Регистр сведений, режим записи «Независимый» | Вводятся вручную или кодом | Вручную в списке или набором записей с отбором по измерениям |
| Регистр сведений, «Подчинение регистратору» | Движения документов | Отмена проведения или набор записей с отбором по регистратору |
| Регистр накопления | Только движения документов | Отмена проведения документов |
| Регистр бухгалтерии, регистр расчёта | Движения документов | Только через документы |
Периодичность (непериодический, день, месяц и так далее) влияет на то, есть ли у записи поле Период. Для периодических регистров это важно: удаление старых записей может изменить «текущее» значение.
Зачем вообще чистить регистры:
- 🗂️ раздутая история — регистры логов, состояний обмена, версий объектов растут на миллионы строк;
- 🐢 медленные отчёты и запросы, особенно в файловой базе;
- 🧪 мусор после тестов, неудачной загрузки или ошибочного обмена;
- 🔁 нужно перезаполнить регистр с нуля — например, после смены алгоритма расчёта.
Если под «закрыть регистр» вы имели в виду запретить изменения за прошлые периоды — это делается не очисткой, а датой запрета изменения данных. В типовых конфигурациях её включают в разделе Администрирование, в настройках проведения документов или прав пользователей.
Подготовка: что сделать до удаления записей
Удалённые записи регистра не попадают в корзину и не помечаются на удаление. Они исчезают сразу.
Перед любой массовой очисткой сделайте резервную копию базы
— выгрузку .dt через конфигуратор (Администрирование → Выгрузить информационную базу) или бэкап средствами СУБД для клиент-серверной базы.
Дальше:
- Определите точное имя регистра в метаданных. В пользовательском режиме оно отличается от синонима: «Курсы валют» в списке —
КурсыВалютв коде. - Посмотрите режим записи и периодичность (таблица выше).
- Проверьте, кто читает этот регистр. В конфигураторе на объекте регистра откройте контекстное меню и выберите
Поиск ссылок на объект— увидите модули, отчёты и обработки, которые на него опираются. - Оцените объём: простой запрос
ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.ИмяРегистрав консоли запросов. - Выберите время. Монопольный режим для удаления записей не нужен, но параллельная запись в тот же регистр даст конфликт блокировок. Миллион строк лучше чистить вечером, когда пользователи вышли.
Отмена проведения: штатный способ убрать движения документов
Для регистров накопления и регистров сведений, подчинённых регистратору, правильный путь один — через документы. Движения принадлежат документу, и если удалить их отдельно, документ останется проведённым без записей. Отчёты разойдутся с первичкой.
Один документ
- Откройте документ.
- В командной панели нажмите
Отмена проведения(иногда она в менюЕщё). - Документ останется в базе, но все его движения по всем регистрам будут удалены.
Проверить результат можно кнопкой Показать проводки и другие движения документа (значок «Дт/Кт») — у непроведённого документа таблицы движений пустые.
Много документов сразу
- Откройте список документов нужного вида.
- Установите отбор по периоду или организации.
- Выделите строки:
Ctrl+AилиShift+ клик. - В меню
ЕщёвыберитеОтмена проведения.
Отмена проведения тысяч документов идёт долго. Каждый документ проходит через свои обработчики, поэтому при ошибке на одном из них процесс остановится — исправьте документ и продолжите.
Если регистр подчинён регистратору, но документы-регистраторы вам нужны проведёнными, не удаляйте их движения отдельно. Лучше переписать регистр и перепровести документы.
Ручное удаление записей регистра сведений через «Все функции»
Этот способ подходит для независимых регистров сведений и небольших объёмов: десятки или сотни строк.
Включаем команду «Все функции»
- Откройте
Главное меню(значок ≡ в левом верхнем углу). - Перейдите в
Сервис → Параметры. - Установите флажок
Отображать команду "Все функции", нажмитеПрименить.
Удаляем записи
Главное меню → Все функции.- Разверните ветку
Регистры сведенийи откройте нужный регистр. - Отберите записи: через строку поиска списка или настройку отбора в меню
Ещё— например, по валюте или по периоду. - Выделите строки и нажмите
DeleteилиЕщё → Удалить. - Подтвердите удаление.
Записи регистров, подчинённых регистратору, в таком списке обычно только для просмотра: удалить их интерактивно нельзя. Это защита, а не ошибка.
Удалять вручную тоже может не каждый. Нужны права на интерактивное удаление этого регистра — у роли «Полные права» они есть, у обычного бухгалтера, как правило, нет.
Сортировка по колонке «Период» и выделение диапазона через Shift позволяют за раз удалить, например, всю историю за прошлый год. Но если строк больше тысячи, форма будет удалять их долго — лучше код.
Очистка регистра кодом через внешнюю обработку
Для больших объёмов и точных условий нужен код. В типовых конфигурациях встроенной «консоли кода» нет. Используйте внешнюю обработку :
- В конфигураторе:
Файл → Новый → Внешняя обработка. - Добавьте форму, на форме — команду, в модуле — серверную процедуру.
- Сохраните
.epfи откройте в пользовательском режиме черезГлавное меню → Файл → Открыть.
Платформа при открытии внешней обработки предупредит об опасных действиях — это нормально, если файл написали вы. У пользователя должно быть право открывать внешние обработки.
Полная очистка независимого регистра
Пустой набор записей без отбора при записи стирает все записи регистра.
&НаСервере
Процедура ОчиститьРегистрНаСервере()
Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();
КонецПроцедуры
ОбменДанными.Загрузка = Истина отключает обработчики ПередЗаписью и ПриЗаписи модуля набора. Это быстрее и не запускает лишнюю логику. Но если в обработчиках есть нужные действия (например, запись истории изменений), уберите эту строку.
Очистка по значению измерения
Удалим только записи по одному контрагенту:
&НаСервере
Процедура ОчиститьПоИзмерениюНаСервере(Контрагент)
Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.Контрагент.Установить(Контрагент);
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();
КонецПроцедуры
Записи по остальным контрагентам останутся. Отбор Установить() работает только на равенство: «больше» или «в списке» в наборе записей не задать. Сложные условия решаются запросом, как в следующем разделе.
Движения одного регистратора
Для подчинённого регистра отбор ставят по регистратору:
Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Записать();
Применяйте это только как техническую операцию — например, когда регистр будете перезаполнять перепроведением.
Периодические регистры: удаляем старую историю безопасно
У периодического регистра сведений в отборе набора есть поле Период. Отбор опять только на равенство, поэтому записи «старше даты» удаляют так: запросом получают список периодов, а затем по каждому записывают пустой набор.
&НаСервере
Процедура УдалитьИсториюДоНаСервере(Граница)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Период КАК Период
|ИЗ
| РегистрСведений.ИмяРегистра КАК Т
|ГДЕ
| Т.Период < &Граница";
Запрос.УстановитьПараметр("Граница", Граница);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(Выборка.Период);
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();
КонецЦикла;
КонецПроцедуры
Отбор только по периоду удаляет за эту дату записи по всем измерениям. Если нужно удалить историю только одного товара — добавьте в запрос и в отбор нужное измерение.
Главная ловушка — срез последних
Конфигурация берёт «текущее» значение периодического регистра через срез последних: самую позднюю запись на дату. Цена товара на сегодня — это последняя установленная цена, даже если её ввели три года назад.
Пример: цену товара А меняли 10.02.2022 (100 ₽) и 15.03.2023 (120 ₽), больше не трогали. Удалили всё до 01.01.2024 — у товара А цены больше нет. Документы подставят ноль.
Как не попасть:
- 📌 перед удалением запросом
СрезПоследних(&Граница)найдите записи, которые актуальны на дату границы; - 📌 исключите их из удаления или перенесите на дату границы: прочитайте запись, запишите с новым периодом, потом удаляйте старые;
- 📌 после очистки сверьте срез последних на текущую дату с тем, что было до неё.
Проверка и оптимизация базы после очистки регистров
Удаление строк не всегда сразу уменьшает базу. Файл 1Cv8.1CD файловой базы сам не сжимается, место внутри освобождается для новых данных.
Проверка данных
- Повторите запрос
КОЛИЧЕСТВО(*)— число строк должно совпасть с ожиданием. - Сформируйте отчёты, которые читают этот регистр. Для регистров накопления — оборотно-сальдовые ведомости и остатки на текущую дату.
- Для периодических регистров — проверьте срез последних, как в разделе выше.
Пересчёт итогов
Если отменяли проведение документов, обновите итоги регистров накопления и бухгалтерии: Главное меню → Все функции → Стандартные → Управление итогами. На вкладке пересчёта выберите регистры и выполните пересчёт итогов. Регистров сведений это не касается: итогов у них нет.
Тестирование и исправление, сжатие
Для файловой базы после удаления больших объёмов запустите конфигуратор: Администрирование → Тестирование и исправление. Отметьте Сжатие таблиц информационной базы и Пересчёт итогов. Режим требует монопольного доступа: все пользователи должны выйти из базы, их сеансы будут закрыты.
Для клиент-серверной базы место освобождают средствами СУБД. В MS SQL — сжатие базы или файла данных, в PostgreSQL — VACUUM. Это делает администратор СУБД в окно обслуживания.
Частые ошибки при очистке регистров
| Ошибка | Чем кончится | Как правильно |
|---|---|---|
| Записали пустой набор, забыв установить отбор | Регистр очищен полностью | Сначала проверяйте код на копии базы |
| Удалили движения регистра накопления кодом при проведённых документах | Остатки и обороты не сходятся с документами | Отмена проведения или перепроведение |
| Удалили старую историю периодического регистра целиком | Пропали актуальные цены, курсы, ставки | Сохранить срез последних на дату границы |
Чистили таблицы _InfoRg или _AccumRg напрямую в СУБД | Рассогласование итогов, ошибки платформы | Только средствами 1С |
| Запустили большую очистку днём одной транзакцией | Блокировки, долгое ожидание у пользователей | Порциями по периодам, вне рабочего времени |
Порционное удаление из кода выше уже работает правильно: каждый Набор.Записать() идёт отдельной транзакцией. Если обернуть весь цикл в НачатьТранзакцию(), блокировка будет держаться до конца — так делать не нужно.