Администрирование · 9 мин
Как очистить весь регистр сведений в 1С
Рассказываем, как очистить весь регистр сведений 1С через менеджер записи, обработку и консоль кода. Риски, проверка результата, типичные ошибки и FAQ.
Очистка регистра сведений — типовая задача при тестировании обменов, исправлении ошибочной загрузки данных или подготовке базы к повторному заполнению. В отличие от удаления документов, здесь нет штатной кнопки «очистить всё» в пользовательском интерфейсе: записи регистра либо удаляются программно, либо перезаписываются регистратором, если регистр подчинён ему.
Способ очистки зависит от режима записи регистра. Независимый регистр сведений очищается напрямую через набор записей. Регистр, подчинённый регистратору, нельзя очистить «сам по себе» — его записи принадлежат документам и удаляются только вместе с ними или при отмене их проведения. Попытка очистить подчинённый регистр напрямую завершится ошибкой.
Перед любыми действиями сделайте резервную копию базы. Очистка регистра — необратимая операция: удалённые записи не восстанавливаются штатными средствами, а откат транзакции возможен только внутри самого кода, если вы его предусмотрели.
Определите режим записи регистра перед очисткой
Первый шаг — открыть конфигуратор и посмотреть свойство «Режим записи» нужного регистра сведений. Значение «Независимый» означает, что записи создаются и удаляются напрямую, без привязки к документу. Значение «Подчинение регистратору» означает, что каждая запись принадлежит конкретному документу, и платформа контролирует целостность связи.
Узнать режим можно и программно через метаданные: Метаданные.РегистрыСведений.ИмяРегистра.РежимЗаписи. Это удобно, если вы пишете универсальную обработку очистки и хотите заранее отсечь подчинённые регистры, чтобы не получать ошибку во время выполнения.
Очистка независимого регистра через набор записей
Основной метод — записать пустой набор записей. Код выполняется в консоли кода, внешней обработке или во временном модуле:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Ключевой момент — набор создаётся без установки отбора. Если отбор не задан, запись пустого набора распространяется на весь регистр, и все записи удаляются одной операцией. Если бы вы установили отбор, например по измерению, удалились бы только записи, попадающие под отбор.
Для больших регистров операция может занять заметное время и заблокировать таблицу для других пользователей. В клиент-серверном варианте на сотнях тысяч записей лучше выполнять очистку в монопольном режиме или в период минимальной нагрузки, чтобы не получить конфликт блокировок.
НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Записать(); // пустой набор без отбора удаляет все записи регистраОчистка через консоль кода и готовые обработки
Если конфигуратор недоступен или дорабатывать конфигурацию нельзя, используйте консоль кода — встроенную в некоторые конфигурации или подключаемую как внешнюю обработку. В ней код очистки выполняется напрямую в пользовательском режиме под полными правами. Это самый быстрый путь для разовой операции.
Альтернатива — универсальные обработки поиска и удаления данных, которые позволяют выбрать регистр из списка метаданных и очистить его кнопкой. Их преимущество — визуальный контроль: вы видите имя регистра, количество записей и режим записи до выполнения действия. Недостаток — такие обработки нужно заранее загрузить в базу и проверить их источник.
В типовых конфигурациях часть регистров сведений имеет штатные команды очистки в разделах администрирования — например, очистка устаревших версий объектов или служебных данных обмена. Проверьте стандартные обработки обслуживания: возможно, отдельный код писать не потребуется.
- 1Сделайте резервную копию базы или выгрузку в dt
- 2Откройте конфигуратор и убедитесь, что регистр независимый
- 3Откройте консоль кода или внешнюю обработку с правами администратора
- 4Выполните создание пустого набора записей и метод Записать()
- 5Откройте регистр в пользовательском режиме и убедитесь, что записей нет
Что делать с регистром, подчинённым регистратору
Прямая запись пустого набора в подчинённый регистр невозможна: платформа требует установить отбор по регистратору, и даже с отбором запись пустого набора лишь удалит движения конкретного документа. Массовая очистка такого регистра сводится к работе с самими документами.
Есть два рабочих пути. Первый — отменить проведение всех документов-регистраторов: при отмене проведения движения удаляются автоматически. Второй — пометить документы на удаление и выполнить удаление помеченных объектов, после чего записи регистра исчезнут вместе с документами. Выбор зависит от того, нужны ли сами документы в базе дальше.
Программно отмена проведения выглядит как перебор выборки документов с вызовом ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения). Учтите, что отмена проведения может затронуть связанные регистры и последовательности, а в учётных базах — нарушить закрытые периоды.
Особенности для больших регистров и клиент-серверного режима
На регистрах с миллионами записей единовременная запись пустого набора создаёт одну длинную транзакцию. В файловой базе это просто долго, в клиент-серверной — риск тайм-аута, роста журнала транзакций СУБД и блокировки таблицы для остальных пользователей.
Более управляемый вариант для крупных таблиц — порционная очистка: выборка записей пачками по ключевым измерениям и запись пустых наборов с отбором по каждой порции. Это дольше суммарно, но каждая транзакция короткая, и процесс можно прервать без потери уже выполненной части.
Если регистр очищается полностью и база работает на SQL Server или PostgreSQL, администратор СУБД может предложить усечение таблицы напрямую. Такой путь допустим только при полном понимании структуры хранения и отключённых механизмах регистрации изменений — иначе планы обмена и версионирование получат рассинхронизацию.
Проверка результата после очистки
Сразу после выполнения кода откройте регистр в режиме предприятия через стандартную команду перехода к списку или через «Все функции». Пустой список — первичный признак успеха. Дополнительно можно выполнить запрос с подсчётом количества записей: ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.ИмяРегистра — ноль подтверждает результат.
Если регистр участвовал в обменах, проверьте зарегистрированные изменения в планах обмена. При необходимости удалите регистрацию изменений для этого регистра, чтобы очистка не ушла в другие узлы, либо наоборот — убедитесь, что она корректно передана, если очистка должна быть сквозной.
Как проверить результат
Записей нет, список пуст
Часть записей осталась — вероятно, был задан отбор или регистр перезаполняется обменом
Количество равно нулю
Количество больше нуля — очистка не выполнена или регистр наполняется фоновым заданием
Нет ошибок записи в момент очистки
Ошибки блокировок или нарушения прав — операция прервана
FAQ
Можно ли очистить регистр сведений без программирования?
Штатной кнопки «очистить регистр» в пользовательском интерфейсе нет. Без кода можно выделить все записи в списке регистра и удалить их вручную — это приемлемо для небольшого объёма. Для массовой очистки понадобится консоль кода, внешняя обработка или доработка конфигурации.
Почему возникает ошибка при записи пустого набора?
Чаще всего регистр подчинён регистратору: платформа требует отбор по регистратору и не даёт очистить регистр целиком. Проверьте свойство «Режим записи» в конфигураторе. Вторая причина — недостаток прав у пользователя, выполняющего код.
Удалятся ли данные в других базах при обмене после очистки?
Зависит от настройки планов обмена. Если регистр входит в состав плана обмена и изменения регистрируются автоматически, удаление записей может быть передано в другие узлы как удаление. Перед очисткой проверьте состав планов обмена и при необходимости снимите регистрацию изменений.
Как очистить только часть записей регистра?
Установите отбор в наборе записей по нужному измерению или периоду и запишите пустой набор: удалятся только записи, попадающие под отбор. Либо сформируйте набор с записями, которые нужно оставить, и запишите его с тем же отбором — он заменит текущее содержимое.
Можно ли восстановить регистр после очистки?
Штатных средств отката нет. Восстановление возможно только из резервной копии, выгрузки dt или повторной загрузки данных из источника, если регистр заполнялся обменом. Поэтому резервная копия перед очисткой — обязательный шаг, а не рекомендация.
Чем очистка отличается от пометки записей на удаление?
Записи регистров сведений не поддерживают пометку удаления — этот механизм существует только для объектных данных: справочников, документов, планов счетов. Записи регистра либо существуют, либо удалены физически в момент записи набора.
Что важно запомнить
Независимый регистр сведений очищается записью пустого набора без отбора, подчинённый — только через регистраторы. Перед операцией обязательна резервная копия, после — проверка пустого списка и контроль планов обмена. На больших таблицах выполняйте очистку вне рабочей нагрузки.