К статье
Практический материал

Администрирование · 9 мин

Как быстро очистить регистр сведений в 1С

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

Регистр сведений в 1С часто разрастается до миллионов записей: история цен, курсы валют, логи обменов, служебные настройки. Когда регистр тормозит отчёты и занимает место в базе, возникает задача его быстрой очистки — полной или частичной. Способ зависит от режима работы (файловая или клиент-серверная база), наличия доступа к конфигуратору и от того, подчинён ли регистр регистратору.

Главный принцип: очистка регистра сведений — необратимая операция. Записи удаляются физически, и восстановить их можно только из резервной копии. Поэтому перед любыми действиями нужно сделать копию базы и убедиться, что регистр действительно не участвует в текущих расчётах, обменах и отчётах.

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

Что проверить перед очисткой регистра

Первый шаг — определить тип регистра. Откройте конфигуратор, найдите регистр в ветке «Регистры сведений» и посмотрите свойство «Режим записи». Если стоит «Независимый» — записи можно удалять напрямую. Если «Подчинение регистратору» — записи принадлежат документам, и очистка напрямую нарушит логику учёта.

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

Третий шаг — сделать резервную копию. Для файловой базы достаточно скопировать файл 1Cv8.1CD при закрытых сеансах. Для клиент-серверной базы используйте штатные средства СУБД (pg_dump для PostgreSQL, backup для MS SQL) или выгрузку в dt через конфигуратор.

Очистка независимого регистра программным кодом

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

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

НаборЗаписей.Записать();

Пустой набор без установленных отборов при записи замещает всё содержимое регистра. На больших таблицах операция занимает от нескольких секунд до нескольких минут — время зависит от объёма данных и производительности СУБД.

Частичная очистка по отбору

Если нужно удалить только часть записей, установите отбор по измерениям перед записью пустого набора:

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Валюта.Установить(НужнаяВалюта);

НаборЗаписей.Записать();

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

bsl
НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Записать(); // очищает весь регистр

Очистка регистра, подчинённого регистратору

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

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

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

Очистка через консоль запросов и обработки

Запросом языка 1С нельзя удалить записи регистра напрямую — оператор УНИЧТОЖИТЬ в запросах отсутствует. Но запрос удобен для предварительной оценки: посчитать количество записей, проверить распределение по измерениям, найти устаревшие данные.

Для интерактивной очистки без написания кода используются универсальные обработки: «Редактирование регистра сведений», «Универсальный подбор и обработка объектов» и аналогичные. Они позволяют открыть таблицу регистра, отобрать записи и удалить их пакетно. Такие обработки распространяются отдельно и не входят в типовую поставку платформы.

В клиент-серверном варианте теоретически возможна очистка прямым SQL-запросом DELETE к таблице регистра. Это самый быстрый по времени вариант на огромных объёмах, но и самый рискованный: платформа кеширует метаданные, а таблица может участвовать в итогах, индексах и планах обмена. Прямые изменения в СУБД нарушают условия поддержки и допустимы только при полном понимании структуры хранения.

Сравнение способов очистки

Пустой набор записей в коде

Быстро и безопасно для независимых регистров. Не работает для регистров, подчинённых регистратору.

Отмена проведения документов

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

Универсальные обработки

Наглядно, не требует навыков программирования. Скорость ниже, чем у прямого кода, нужен внешний файл обработки.

Прямой DELETE в СУБД

Максимальная скорость на очень больших таблицах. Риск рассинхронизации, потеря поддержки, требует глубокого понимания структуры базы.

Очистка в монопольном и многопользовательском режиме

Запись пустого набора выполняется в одной транзакции и блокирует таблицу регистра. В многопользовательской базе это может привести к конфликтам блокировок, если пользователи в этот момент пишут в тот же регистр. Поэтому массовую очистку лучше выполнять в монопольном режиме или в нерабочее время.

Если регистр очень большой и транзакция рискует переполнить журнал транзакций СУБД, очищайте порциями: удаляйте записи по диапазонам периодов или по значениям измерений в цикле. Это дольше суммарно, но безопаснее для сервера.

Порядок безопасной очистки
  1. 1
    Сделайте резервную копию базы и проверьте, что она восстанавливается
  2. 2
    Определите режим записи регистра: независимый или подчинён регистратору
  3. 3
    Найдите объекты, использующие регистр, через поиск ссылок в конфигураторе
  4. 4
    Оцените объём записей запросом и выберите способ очистки
  5. 5
    Выполните очистку в монопольном режиме или в нерабочее время
  6. 6
    Проверьте результат: количество записей, работу связанных отчётов и обменов

Как проверить результат и избежать ошибок

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

Для клиент-серверной базы имеет смысл проверить размер таблицы на уровне СУБД: удалённые строки не всегда сразу освобождают место на диске. Может потребоваться реиндексация или сжатие таблицы средствами СУБД — это отдельная операция, выполняемая администратором базы данных.

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

Типичные ошибки
01
Очистка без резервной копии — при ошибке данные восстановить нечем
02
Попытка записать пустой набор в подчинённый регистр — платформа выдаст ошибку отсутствия отбора по регистратору
03
Очистка в рабочее время — конфликты блокировок и обрыв транзакции у пользователей
04
Удаление записей, участвующих в обмене — рассинхронизация узлов и повторная полная выгрузка
05
Ожидание мгновенного уменьшения файла базы — место освобождается только после сжатия средствами СУБД или тестирования и исправления

FAQ

Можно ли очистить регистр сведений без конфигуратора и программирования?

Да, если под рукой есть универсальная обработка редактирования регистров — она открывается через «Файл → Открыть» в режиме предприятия и позволяет удалить записи интерактивно. Штатных кнопок «очистить регистр» в типовых конфигурациях, как правило, нет.

Почему пустой набор записей не очищает регистр?

Чаще всего регистр подчинён регистратору — тогда набор обязан иметь отбор по регистратору, и без него запись невозможна. Вторая причина — установленный отбор по измерениям: пустой набор удалит только записи, попадающие под отбор, а не весь регистр.

Уменьшится ли размер базы после очистки регистра?

Логически данные удалятся сразу, но физический размер файла базы или таблицы СУБД обычно не меняется. В файловом варианте нужно выполнить тестирование и исправление с реструктуризацией, в клиент-серверном — сжатие таблиц средствами СУБД.

Как очистить только старые записи периодического регистра?

Установите отбор по периоду в наборе записей: укажите нужную дату в отборе и запишите пустой набор. Для диапазона дат удобнее выбрать запросом записи за старый период и удалять их порциями в цикле по отдельным датам или значениям измерений.

Что делать, если регистр участвует в плане обмена?

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

Итог

Что важно запомнить

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