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

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

Как полностью очистить регистр сведений в 1С

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

Регистр сведений в 1С накапливает данные постоянно: курсы валют, цены номенклатуры, штрихкоды, историю изменений, служебные записи механизмов обмена. Со временем часть этих данных теряет ценность, но продолжает занимать место в базе и замедлять запросы. Полная очистка регистра — типовая задача администратора и разработчика, однако выполнять её нужно осознанно: в отличие от документов, записи регистра сведений часто не имеют «корзины» и восстановлению не подлежат.

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

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

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

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

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

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

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

Штатный способ полной очистки — записать пустой набор записей. Код минимален и выполняется за одну транзакцию:

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

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

Метод Записать() без добавления строк физически удаляет все записи набора. Поскольку отбор не установлен, очищается весь регистр. Для независимого регистра это работает всегда, независимо от периодичности.

Код можно выполнить в консоли кода (внешняя обработка «Консоль кода» из стандартных подсистем или аналогичная), во внешней обработке с кнопкой «Выполнить» или в регламентном задании. В файловой базе достаточно запустить обработку в режиме предприятия. В клиент-серверной базе код выполняется на сервере, поэтому обработка должна иметь серверный контекст выполнения.

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

Очистка с отбором: когда нужно удалить не всё

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

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

НаборЗаписей.Отбор.Номенклатура.Установить(НоменклатураСсылка);

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

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

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

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

Платформа не позволяет записать набор записей подчинённого регистра без отбора по регистратору. Попытка выполнить Записать() на пустом наборе без отбора завершится ошибкой. Поэтому очистка такого регистра сводится к работе с документами-регистраторами.

Возможные сценарии: пометить на удаление документы, формирующие записи, и выполнить удаление помеченных объектов — движения удалятся вместе с документами. Либо отменить проведение документов, если регистр заполняется только при проведении. Для массовой операции используются типовые обработки «Групповое изменение реквизитов», «Удаление помеченных объектов» или собственная обработка с циклом по документам.

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

Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ Регистратор ИЗ РегистрСведений.ИмяРегистра");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);

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

КонецЦикла;

Этот способ корректен, но требует осторожности: если провести документ повторно, движения вернутся. Поэтому после очистки движений обычно либо помечают документы на удаление, либо снимают их с проведения.

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

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

В управляемых формах типовых конфигураций часть регистров можно очистить штатно из интерфейса: например, список регистра открывается в режиме предприятия, все строки выделяются (Ctrl+A) и удаляются. Способ подходит только для независимых регистров с небольшим числом записей — на миллионах строк интерактивное удаление займёт неоправданно много времени.

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

Запись пустого набора

Самый быстрый и надёжный способ для независимого регистра. Требует доступа к выполнению кода.

Удаление в режиме предприятия

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

Удаление регистраторов

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

Прямой SQL-запрос DELETE

Быстро, но нарушает логику платформы: не срабатывают подписки, обмены и контроль итогов. Допустимо только в копии базы или при полном понимании последствий.

Производительность и блокировки при очистке больших регистров

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

В файловой базе длительная транзакция также блокирует работу других сеансов. Если база развёрнута на SQL Server и регистр огромный, администраторы иногда используют TRUNCATE или DELETE напрямую в СУБД — но это обход платформы: не выполнятся подписки на события, не зарегистрируются изменения для обмена, а при ошибке в имени таблицы можно повредить другие данные. Такой вариант — только для опытных администраторов и только после резервного копирования.

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

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

Проверка результата и типичные ошибки

После очистки откройте список регистра в режиме предприятия — он должен быть пуст. Надёжнее проверить запросом: ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.ИмяРегистра. Ноль означает успешную очистку. Если записи появились снова вскоре после очистки — работает регламентное задание или обмен, который загружает данные повторно; найдите и отключите источник до очистки.

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

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

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

Количество записей запросом
Норма

Запрос возвращает 0

Тревожный признак

Записи остались или появились снова

Список регистра в режиме предприятия
Норма

Список пуст, отборы сброшены

Тревожный признак

Видны записи — возможно, включён отбор в форме списка, снимите его

Регламентные задания и обмены
Норма

Новые записи не появляются после очистки

Тревожный признак

Записи возвращаются — работает задание или синхронизация

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

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

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

Почему код с пустым набором записей выдаёт ошибку?

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

Удалятся ли записи регистра при удалении документа-регистратора?

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

Освободится ли место на диске после очистки регистра?

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

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

Одним набором с условием «меньше даты» это сделать нельзя — отбор набора работает на равенство. Выберите запросом ключи записей за нужный период и удаляйте их в цикле через менеджер записи или наборы с отбором по измерениям.

Опасно ли очищать служебные регистры типовой конфигурации?

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

Итог

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

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