Администрирование · 11 мин
Как почистить регистр сведений в 1С 8.3 вручную
Как вручную очистить регистр сведений в 1С 8.3: через консоль кода, обработку УдалениеДанных и запрос. Способы с учётом режима подчинения регистратору, риски и проверка результата.
Регистр сведений в 1С 8.3 — один из самых быстрорастущих типов объектов: в него пишутся истории цен, курсы валют, версии объектов, журналы обмена, служебные очереди. Со временем таблица раздувается, запросы замедляются, а резервные копии становятся тяжелее. Ручная очистка регистра — рабочий приём, но он требует понимания структуры объекта: независимый регистр и регистр, подчинённый регистратору, чистятся принципиально разными способами.
Главное правило перед любыми действиями — определить режим записи регистра. Независимый регистр сведений можно очищать напрямую через набор записей или запрос. Регистр, подчинённый регистратору, физически нельзя изменить «в лоб»: его записи существуют только вместе с документом-регистратором, и удалить их можно лишь удаляя или отменяя проведение документов. Попытка обойти это ограничение прямой правкой таблицы SQL приводит к рассогласованию данных и ошибкам при проведении.
Определите тип регистра перед очисткой
Откройте конфигуратор, найдите нужный регистр в ветке «Регистры сведений» и посмотрите свойство «Режим записи». Значение «Независимый» означает, что записи создаются напрямую и доступны для ручного удаления. Значение «Подчинение регистратору» означает, что каждая запись привязана к документу, и самостоятельной жизни у неё нет.
Дополнительно проверьте периодичность регистра: непериодический, в пределах секунды, дня, месяца и т.д. Это важно для выборочной очистки: например, удалить историю курсов валют старше определённой даты можно только в периодическом регистре, отбирая записи по полю «Период».
Также оцените, есть ли на регистр ссылки из других механизмов: планов обмена (регистрация изменений), подписок на события, регламентных заданий. Очистка регистра, участвующего в обмене данными, может спровоцировать повторную выгрузку или, наоборот, потерю изменений для узла-приёмника.
Подготовка: резервная копия и монопольный режим
Перед массовым удалением данных сделайте резервную копию. Для файловой базы достаточно скопировать файл 1Cv8.1CD при остановленной работе пользователей. Для клиент-серверной базы используйте выгрузку в dt через конфигуратор (Администрирование → Выгрузить информационную базу) или штатные средства СУБД. Выгрузка в dt не заменяет полноценный бэкап SQL, но для отката конкретной операции обычно достаточно.
Очистку выполняйте в монопольном режиме: завершите сеансы пользователей через консоль кластера или функцию «Блокировка сеансов» в режиме предприятия. Параллельная работа пользователей во время массового удаления может привести к блокировкам, обрыву транзакции и частично очищенному регистру.
Очистка независимого регистра через набор записей
Самый простой способ полностью очистить независимый регистр — записать пустой набор записей. Откройте внешнюю обработку «Консоль кода» или создайте временную обработку и выполните код в режиме предприятия под полными правами.
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
Набор.Записать();
Вызов Записать() без добавления строк и без установленных отборов удаляет все записи регистра. Это быстрая операция, но она безвозвратна — убедитесь, что очищаете именно тот регистр, и что копия базы сделана.
Для выборочной очистки установите отбор перед записью. Например, чтобы удалить записи по конкретному элементу измерения:
Набор = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Номенклатура.Установить(СсылкаНаНоменклатуру);
Набор.Записать();
Важный нюанс: отбор в наборе записей устанавливается только по измерениям (и периоду для периодических регистров при определённых условиях). Удалить записи по условию на ресурс или реквизит таким способом нельзя — сначала нужно выбрать ключи записей запросом, а затем удалять каждую через менеджер записи или набор с отбором.
Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
Набор.Записать(); // удаляет все записи регистраВыборочная очистка через запрос и менеджер записи
Когда нужно удалить часть записей по сложному условию (например, старше даты или по списку значений), используйте связку «запрос + удаление по ключу». Запросом выбираются значения измерений, затем каждая запись удаляется через менеджер записи.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Версии.Объект КАК Объект
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК Версии
|ГДЕ
| Версии.ДатаВерсии < &Граница";
Запрос.УстановитьПараметр("Граница", ДобавитьМесяц(ТекущаяДатаСеанса(), -12));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Установить(Выборка.Объект);
Набор.Записать();
КонецЦикла;
Для больших объёмов оборачивайте операцию в транзакцию порциями: удаление миллионов записей одной транзакцией раздувает журнал транзакций СУБД и может привести к тайм-ауту. Практичный подход — обрабатывать по несколько тысяч ключей за итерацию с фиксацией транзакции между порциями.
- 1Сделайте резервную копию базы и установите монопольный режим
- 2Убедитесь, что регистр независимый (свойство «Режим записи» в конфигураторе)
- 3Сформируйте запрос, выбирающий ключи удаляемых записей, и проверьте его результат в консоли запросов
- 4Выполните удаление набором записей с отбором по каждому ключу, при большом объёме — порциями в транзакциях
- 5Проверьте остаток записей запросом и снимите монопольный режим
Очистка регистра, подчинённого регистратору
Записи подчинённого регистра удаляются только вместе с движениями документа. Есть три легальных пути: распроведение документов, пометка удаления документов с последующим удалением помеченных объектов, либо установка пометки удаления напрямую при отключённом контроле. Во всех случаях работаете вы с документами, а не с регистром.
Для массовой операции удобно использовать типовую обработку «Групповое изменение реквизитов» (Все функции → Обработки) или аргументированный код: выбрать запросом документы за период и пометить их на удаление. После этого запустите «Удаление помеченных объектов» (Администрирование → Обслуживание) — записи регистра удалятся вместе с документами.
Если документы нужно сохранить, а движения убрать, распроведите их: при отмене проведения платформа автоматически очищает наборы записей по всем регистрам, по которым документ делал движения. Учтите, что распроведение документов прошлых периодов может нарушить последовательность проведения и потребовать её восстановления.
Сравнение вариантов очистки
Мгновенная полная очистка независимого регистра. Не подходит для выборочного удаления и подчинённых регистров
Гибкая выборочная очистка независимого регистра. Медленнее, требует аккуратности с транзакциями
Единственный корректный способ убрать движения подчинённого регистра с сохранением документов. Может нарушить последовательность
Полное удаление данных вместе с регистратором. Необратимо, требует проверки ссылочной целостности
Очистка через типовые механизмы и обработки
Во многих типовых конфигурациях (БСП) есть штатные инструменты, которые закрывают типовые сценарии без кода. Обработка «Удаление помеченных объектов» подчищает регистры вместе с документами. Регламентное задание «Очистка версий объектов» в конфигурациях с версионированием удаляет старые версии по настроенным правилам — часто достаточно настроить его, а не чистить вручную.
Для регистров обмена данными («Результаты обмена данными», регистрации изменений) в планах обмена есть команда «Удалить регистрацию изменений» — она очищает служебные записи по выбранному узлу. Удалять эти записи произвольным кодом не стоит: механизм обмена опирается на номера сообщений.
Универсальные обработки с ИТС и из состава БСП («Поиск и удаление дублей», консоли запросов с возможностью удаления) тоже применимы, но любой инструмент проверяйте сначала на копии базы: поведение на больших таблицах может отличаться от ожиданий.
Проверка результата и типичные ошибки
После очистки выполните контрольный запрос: выберите количество записей регистра (ВЫБРАТЬ КОЛИЧЕСТВО(*) или выборку с группировкой по измерениям) и сопоставьте с ожиданием. Для выборочной очистки проверьте, что записи вне условия остались нетронутыми — выберите несколько известных ключей и убедитесь, что данные на месте.
Дополнительно проверьте зависимые механизмы: отчёты, использующие регистр, регламентные задания, обмены данными. Если регистр участвовал в обмене, выполните тестовую синхронизацию и убедитесь в отсутствии ошибок и неожиданных повторных выгрузок.
Как проверить результат
Совпадает с ожидаемым остатком после очистки
Записи остались или удалено больше, чем планировалось
Данные по ним доступны и не изменились
Записи отсутствуют — условие отбора было шире нужного
Синхронизация проходит без ошибок, отчёты строятся
Ошибки обмена, пустые или искажённые отчёты
Часто задаваемые вопросы
Можно ли очистить регистр сведений запросом напрямую, как в SQL?
В языке запросов 1С нет команды DELETE — запросы только читают данные. Удаление выполняется объектными средствами: набором записей с отбором или менеджером записи. Прямой DELETE в таблице SQL технически возможен, но нарушает лицензионные ограничения и может рассогласовать служебные таблицы платформы, поэтому в продуктивной базе его не применяют.
Почему после очистки регистра размер базы не уменьшился?
Удалённые записи освобождают место внутри файла или таблицы, но физический файл не сжимается автоматически. Для файловой базы запустите «Тестирование и исправление» с включённым сжатием таблиц, для клиент-серверной — операции сжатия средствами СУБД (например, shrink для MS SQL) после согласования с администратором баз данных.
Как очистить регистр сведений без программирования?
Для небольших независимых регистров откройте форму списка регистра в режиме предприятия (через «Все функции» → «Регистры сведений»), выделите записи и удалите их. Для подчинённых регистров используйте типовую обработку «Удаление помеченных объектов» после пометки документов-регистраторов. Для массовых операций без кода подойдёт «Групповое изменение реквизитов».
Что делать, если при очистке возникает ошибка блокировки?
Ошибка «Конфликт блокировок» означает, что с регистром работают другие сеансы. Завершите пользовательские сеансы через консоль кластера серверов или установите блокировку сеансов, затем повторите операцию. Если блокировку держит регламентное задание — дождитесь его завершения или отключите задание на время очистки.
Опасно ли очищать регистр «Версии объектов»?
Сам регистр очищается безопасно — это история изменений, а не оперативные данные. Но после очистки восстановить старые версии объектов будет невозможно, а отчёты по истории изменений станут пустыми. Перед удалением убедитесь, что история за удаляемый период не требуется для аудита, и настройте регламентное задание очистки, чтобы регистр не разрастался снова.
Что важно запомнить
Сначала определите режим записи регистра: независимый чистится пустым набором записей или отбором по ключам, подчинённый — только через документы-регистраторы. Работайте в монопольном режиме, с резервной копией, большие объёмы удаляйте порциями, а результат проверяйте контрольным запросом и тестом зависимых механизмов.