Очистка регистров сведений и движений в 1С 8.3: три рабочих способа

· 9 мин

Содержание

Закрыть регистр в 1С — значит удалить из него ненужные записи: целиком, за период или по одному значению измерения. Независимый регистр сведений чистят вручную через Главное меню → Все функции или кодом, записывая пустой набор записей. Регистр, подчинённый регистратору, чистят только через документы — отменой проведения.

Способ зависит от типа регистра, объёма данных и того, нужна ли вам история. Всё ниже относится к платформе 1С:Предприятие 8.3 с интерфейсом «Такси» и одинаково работает в любой типовой конфигурации: БП 3.0, ЗУП 3.1, УТ 11.

Какие бывают регистры и почему их чистят

Перед очисткой посмотрите свойства регистра в конфигураторе. Два параметра решают всё: режим записи и периодичность.

Тип регистраОткуда берутся записиКак удалять
Регистр сведений, режим записи «Независимый»Вводятся вручную или кодомВручную в списке или набором записей с отбором по измерениям
Регистр сведений, «Подчинение регистратору»Движения документовОтмена проведения или набор записей с отбором по регистратору
Регистр накопленияТолько движения документовОтмена проведения документов
Регистр бухгалтерии, регистр расчётаДвижения документовТолько через документы

Периодичность (непериодический, день, месяц и так далее) влияет на то, есть ли у записи поле Период. Для периодических регистров это важно: удаление старых записей может изменить «текущее» значение.

Зачем вообще чистить регистры:

  • 🗂️ раздутая история — регистры логов, состояний обмена, версий объектов растут на миллионы строк;
  • 🐢 медленные отчёты и запросы, особенно в файловой базе;
  • 🧪 мусор после тестов, неудачной загрузки или ошибочного обмена;
  • 🔁 нужно перезаполнить регистр с нуля — например, после смены алгоритма расчёта.

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

Подготовка: что сделать до удаления записей

Удалённые записи регистра не попадают в корзину и не помечаются на удаление. Они исчезают сразу.

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

Дальше:

  1. Определите точное имя регистра в метаданных. В пользовательском режиме оно отличается от синонима: «Курсы валют» в списке — КурсыВалют в коде.
  2. Посмотрите режим записи и периодичность (таблица выше).
  3. Проверьте, кто читает этот регистр. В конфигураторе на объекте регистра откройте контекстное меню и выберите Поиск ссылок на объект — увидите модули, отчёты и обработки, которые на него опираются.
  4. Оцените объём: простой запрос ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.ИмяРегистра в консоли запросов.
  5. Выберите время. Монопольный режим для удаления записей не нужен, но параллельная запись в тот же регистр даст конфликт блокировок. Миллион строк лучше чистить вечером, когда пользователи вышли.

Отмена проведения: штатный способ убрать движения документов

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

Один документ

  1. Откройте документ.
  2. В командной панели нажмите Отмена проведения (иногда она в меню Ещё).
  3. Документ останется в базе, но все его движения по всем регистрам будут удалены.

Проверить результат можно кнопкой Показать проводки и другие движения документа (значок «Дт/Кт») — у непроведённого документа таблицы движений пустые.

Много документов сразу

  1. Откройте список документов нужного вида.
  2. Установите отбор по периоду или организации.
  3. Выделите строки: Ctrl+A или Shift + клик.
  4. В меню Ещё выберите Отмена проведения.

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

Если регистр подчинён регистратору, но документы-регистраторы вам нужны проведёнными, не удаляйте их движения отдельно. Лучше переписать регистр и перепровести документы.

Ручное удаление записей регистра сведений через «Все функции»

Этот способ подходит для независимых регистров сведений и небольших объёмов: десятки или сотни строк.

Включаем команду «Все функции»

  1. Откройте Главное меню (значок ≡ в левом верхнем углу).
  2. Перейдите в Сервис → Параметры.
  3. Установите флажок Отображать команду "Все функции", нажмите Применить.

Удаляем записи

  1. Главное меню → Все функции.
  2. Разверните ветку Регистры сведений и откройте нужный регистр.
  3. Отберите записи: через строку поиска списка или настройку отбора в меню Ещё — например, по валюте или по периоду.
  4. Выделите строки и нажмите Delete или Ещё → Удалить.
  5. Подтвердите удаление.

Записи регистров, подчинённых регистратору, в таком списке обычно только для просмотра: удалить их интерактивно нельзя. Это защита, а не ошибка.

Удалять вручную тоже может не каждый. Нужны права на интерактивное удаление этого регистра — у роли «Полные права» они есть, у обычного бухгалтера, как правило, нет.

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

Очистка регистра кодом через внешнюю обработку

Для больших объёмов и точных условий нужен код. В типовых конфигурациях встроенной «консоли кода» нет. Используйте внешнюю обработку :

  1. В конфигураторе: Файл → Новый → Внешняя обработка.
  2. Добавьте форму, на форме — команду, в модуле — серверную процедуру.
  3. Сохраните .epf и откройте в пользовательском режиме через Главное меню → Файл → Открыть.

Платформа при открытии внешней обработки предупредит об опасных действиях — это нормально, если файл написали вы. У пользователя должно быть право открывать внешние обработки.

Полная очистка независимого регистра

Пустой набор записей без отбора при записи стирает все записи регистра.

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

ОбменДанными.Загрузка = Истина отключает обработчики ПередЗаписью и ПриЗаписи модуля набора. Это быстрее и не запускает лишнюю логику. Но если в обработчиках есть нужные действия (например, запись истории изменений), уберите эту строку.

Очистка по значению измерения

Удалим только записи по одному контрагенту:

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

Записи по остальным контрагентам останутся. Отбор Установить() работает только на равенство: «больше» или «в списке» в наборе записей не задать. Сложные условия решаются запросом, как в следующем разделе.

Движения одного регистратора

Для подчинённого регистра отбор ставят по регистратору:

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

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

Периодические регистры: удаляем старую историю безопасно

У периодического регистра сведений в отборе набора есть поле Период. Отбор опять только на равенство, поэтому записи «старше даты» удаляют так: запросом получают список периодов, а затем по каждому записывают пустой набор.

&НаСервере
Процедура УдалитьИсториюДоНаСервере(Граница)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    Т.Период КАК Период
    |ИЗ
    |    РегистрСведений.ИмяРегистра КАК Т
    |ГДЕ
    |    Т.Период < &Граница";
    Запрос.УстановитьПараметр("Граница", Граница);

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

КонецПроцедуры

Отбор только по периоду удаляет за эту дату записи по всем измерениям. Если нужно удалить историю только одного товара — добавьте в запрос и в отбор нужное измерение.

Главная ловушка — срез последних

Конфигурация берёт «текущее» значение периодического регистра через срез последних: самую позднюю запись на дату. Цена товара на сегодня — это последняя установленная цена, даже если её ввели три года назад.

Пример: цену товара А меняли 10.02.2022 (100 ₽) и 15.03.2023 (120 ₽), больше не трогали. Удалили всё до 01.01.2024 — у товара А цены больше нет. Документы подставят ноль.

Как не попасть:

  • 📌 перед удалением запросом СрезПоследних(&Граница) найдите записи, которые актуальны на дату границы;
  • 📌 исключите их из удаления или перенесите на дату границы: прочитайте запись, запишите с новым периодом, потом удаляйте старые;
  • 📌 после очистки сверьте срез последних на текущую дату с тем, что было до неё.
Какой способ очистки вам подходит?

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

Удаление строк не всегда сразу уменьшает базу. Файл 1Cv8.1CD файловой базы сам не сжимается, место внутри освобождается для новых данных.

Проверка данных

  1. Повторите запрос КОЛИЧЕСТВО(*) — число строк должно совпасть с ожиданием.
  2. Сформируйте отчёты, которые читают этот регистр. Для регистров накопления — оборотно-сальдовые ведомости и остатки на текущую дату.
  3. Для периодических регистров — проверьте срез последних, как в разделе выше.

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

Если отменяли проведение документов, обновите итоги регистров накопления и бухгалтерии: Главное меню → Все функции → Стандартные → Управление итогами. На вкладке пересчёта выберите регистры и выполните пересчёт итогов. Регистров сведений это не касается: итогов у них нет.

Тестирование и исправление, сжатие

Для файловой базы после удаления больших объёмов запустите конфигуратор: Администрирование → Тестирование и исправление. Отметьте Сжатие таблиц информационной базы и Пересчёт итогов. Режим требует монопольного доступа: все пользователи должны выйти из базы, их сеансы будут закрыты.

Для клиент-серверной базы место освобождают средствами СУБД. В MS SQL — сжатие базы или файла данных, в PostgreSQL — VACUUM. Это делает администратор СУБД в окно обслуживания.

Частые ошибки при очистке регистров

ОшибкаЧем кончитсяКак правильно
Записали пустой набор, забыв установить отборРегистр очищен полностьюСначала проверяйте код на копии базы
Удалили движения регистра накопления кодом при проведённых документахОстатки и обороты не сходятся с документамиОтмена проведения или перепроведение
Удалили старую историю периодического регистра целикомПропали актуальные цены, курсы, ставкиСохранить срез последних на дату границы
Чистили таблицы _InfoRg или _AccumRg напрямую в СУБДРассогласование итогов, ошибки платформыТолько средствами 1С
Запустили большую очистку днём одной транзакциейБлокировки, долгое ожидание у пользователейПорциями по периодам, вне рабочего времени

Порционное удаление из кода выше уже работает правильно: каждый Набор.Записать() идёт отдельной транзакцией. Если обернуть весь цикл в НачатьТранзакцию(), блокировка будет держаться до конца — так делать не нужно.

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

Можно ли восстановить удалённые записи регистра?
Только из резервной копии. Отдельно записи регистра можно перенести из копии кодом: прочитать набор в копии, выгрузить и записать в рабочую базу.
Нужен ли монопольный режим для очистки регистра сведений?
Нет. Записи удаляются в обычном режиме. Монопольный доступ нужен для тестирования и исправления базы, загрузки .dt и обновления структуры.
Почему в списке регистра кнопка удаления неактивна?
Либо регистр подчинён регистратору и его записи меняются только через документы, либо у вашего пользователя нет права на интерактивное удаление этого регистра.
Удалится ли запись регистра при удалении документа?
Да. При удалении проведённого документа платформа удаляет и все его движения. Помеченный на удаление документ сначала теряет проведение, а движения исчезают.
Уйдёт ли очистка в другие базы по обмену?
Если регистр входит в план обмена, удаление записей считается изменением и может быть передано в другие узлы. Проверьте поведение на копии базы и узла до очистки рабочей базы.