Удаление записей из регистров сведений и накопления в 1С 8.3: от штатных средств до SQL
Содержание
Чистить регистр в 1С правильно так: записи, подчинённые документу, убирают через сам документ (отмена проведения или удаление), независимые записи регистра сведений — из списка регистра или записью пустого набора кодом, а после массовой очистки запускают пересчёт итогов. Прямой DELETE в SQL — последний вариант, и только на копии базы.
Типичная ситуация: база выросла до 60 ГБ, половину занимает регистр версий объектов или журнал обмена. Или после неудачной загрузки в регистре висят строки с регистратором <Объект не найден>, и отчёты показывают остатки, которых нет. Удалять и очищать такие данные можно безопасно — если понимать, как регистр хранит записи.
Перед любой массовой очисткой сделайте выгрузку базы в .dt или резервную копию СУБД. Удалённые записи регистра без копии не вернуть.
Какие бывают регистры и как они хранят данные
Способ очистки зависит от вида регистра и от того, подчинён ли он регистратору. Сначала определите это в конфигураторе: откройте регистр в дереве метаданных и посмотрите свойство «Режим записи».
| Вид регистра | Режим записи | Что хранит в СУБД | Как удаляются записи |
|---|---|---|---|
| Регистр сведений | Независимый | Таблица записей (+ таблицы срезов, если включены) | Из списка или кодом, без документов |
| Регистр сведений | Подчинение регистратору | Таблица записей с полем «Регистратор» | Только через регистратор или набор с отбором по регистратору |
| Регистр накопления (остатки) | Всегда подчинён | Таблица движений + таблица итогов | Через регистратор, затем пересчёт итогов |
| Регистр накопления (обороты) | Всегда подчинён | Таблица движений + таблица оборотов | Через регистратор |
| Регистр бухгалтерии | Всегда подчинён | Движения, итоги, субконто | Через документ или операцию |
| Регистр расчёта | Всегда подчинён | Записи, перерасчёты, фактический период | Через документ-начисление |
Главное отличие от справочников: у регистра нет «пометки на удаление». Запись либо есть, либо её нет.
У регистров накопления и бухгалтерии есть таблицы итогов. Их платформа ведёт сама. Если удалить движения в обход платформы, итоги разойдутся с движениями, и остатки в отчётах станут неверными.
💡 Периодический регистр сведений хранит историю значений. Удалив старые записи, вы меняете значение «на дату» для всех документов прошлых периодов. Для цен и курсов это опасно: перепроведение старого документа даст другую сумму.
Штатная очистка без программирования
Начните с того, что даёт сама программа. Здесь платформа следит за целостностью за вас.
Записи, подчинённые документу
- Откройте документ-регистратор.
- Нажмите «Отмена проведения» — движения документа удалятся из всех регистров.
- Если документ не нужен совсем, пометьте его на удаление и запустите
Администрирование → Обслуживание → Удаление помеченных объектов.
При удалении документа его движения уходят вместе с ним. Отдельно чистить регистр не нужно.
Для массовой отмены проведения в БП 3.0 и УТ 11 подходит групповая обработка документов или перепроведение за период с отбором. Найдите её в разделе Администрирование по слову «Групповое».
Независимый регистр сведений
- Включите меню «Все функции»:
Главное меню → Сервис → Параметры → Отображать команду "Все функции". - Откройте
Все функции → Регистры сведенийи нужный регистр. - Установите отбор, выделите строки (Shift+клик, Ctrl+A) и нажмите Delete.
Список подчинённого регистра так не почистить: записи доступны только для просмотра. Это защита, а не ошибка.
Свертка базы
Если цель — уменьшить размер базы, а не убрать конкретные строки, в БП 3.0 есть обработка «Свертка информационной базы». Ищите её в Администрирование → Обслуживание. Она удаляет документы до даты свертки и вводит вместо них остатки. Это тоже очистка регистров, но с сохранением сальдо.
Свертка необратима и долгая. Запускайте её на копии, сверяйте оборотно-сальдовую ведомость до и после, и только потом повторяйте в рабочей базе.
Регистры БСП, которые разрастаются
Чаще всего базу раздувают служебные регистры подсистем: версии объектов, регистрация изменений для обмена, журнал дополнительных данных. Для них в типовых есть собственная очистка:
- 📦 Версии объектов — в настройках версионирования (раздел
Администрирование → Общие настройки) задают срок хранения и удаляют устаревшие версии; - 🔄 Регистрация изменений обмена — очищается после успешного обмена; если узел больше не используется, удалите сам узел плана обмена, и его регистрация уйдёт;
- 🗂️ Дубли и мусор после загрузки — сначала найдите их консолью запросов (следующий раздел).
Поиск лишних записей через консоль запросов
Язык запросов 1С только читает данные. Удалить запись запросом нельзя — DELETE в нём нет. Консоль нужна, чтобы точно найти, что удалять.
Пример: движения регистра накопления, у которых регистратор удалён в обход платформы («битые ссылки»).
ВЫБРАТЬ РАЗЛИЧНЫЕ
Остатки.Регистратор КАК Регистратор
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК Остатки
ГДЕ
Остатки.Регистратор.Дата ЕСТЬ NULL
Если документ-регистратор физически отсутствует, обращение к его реквизиту вернёт NULL. Так вы получите список «потерянных» регистраторов.
Второй пример — дубли в независимом регистре сведений, когда одинаковые данные записаны под разными измерениями:
ВЫБРАТЬ
Рег.Номенклатура,
КОЛИЧЕСТВО(*) КАК Строк
ИЗ
РегистрСведений.ШтрихкодыНоменклатуры КАК Рег
СГРУППИРОВАТЬ ПО
Рег.Номенклатура
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Имена регистров в примерах условные — подставьте свои из дерева метаданных. Консоль запросов есть в составе стандартных обработок для 8.3; многие версии консоли умеют выполнять код по результату, но удаление всё равно делается кодом, а не запросом.
Очистка регистра кодом через набор записей
Основной инструмент программиста — набор записей. Записанный пустой набор с отбором удаляет всё, что под отбор попадает.
Удалить движения одного регистратора
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();
У регистра накопления отбор набора бывает только по регистратору. Удалить «все движения по складу Х» одним набором нельзя — сначала соберите регистраторы запросом, потом пройдите по ним циклом.
ОбменДанными.Загрузка = Истина отключает обработчики ПередЗаписью и подписки на события. Это ускоряет очистку, но снимает и проверки конфигурации. Ставьте флаг, только когда точно знаете, что удаляете мусор.
Очистить независимый регистр сведений по отбору
Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Номенклатура.Установить(СсылкаНаТовар);
Набор.Записать();
Если не установить ни одного отбора и записать пустой набор, удалятся все записи регистра. Это самый быстрый способ полной очистки и самая частая причина потерянных данных. Проверяйте отбор дважды.
Битые регистраторы
Для движений с удалённым регистратором подходит тот же код: ссылку из запроса передают в Отбор.Регистратор.Установить(). Объекта уже нет, но ссылка как значение отбора работает, и набор удаляет строки.
Большие объёмы
Если строк сотни тысяч, не пишите всё одной транзакцией:
- ⏱️ делите по регистраторам или по периодам и записывайте порциями;
- 🔒 запускайте в нерабочее время: запись набора ставит блокировки, и пользователи будут ждать;
- 📝 пишите в журнал регистрации, что и сколько удалено, — пригодится при разборе.
Удаление данных регистра напрямую в SQL
Этот путь для администраторов, которые понимают структуру хранения. Фирма 1С не поддерживает правку данных в обход платформы, а ошибка ломает базу целиком.
Когда он оправдан: регистр на десятки миллионов строк, и очистка кодом идёт сутками. Например, полностью ненужный служебный регистр после отключения подсистемы.
Как найти таблицу регистра
Имена таблиц в СУБД обезличены: _InfoRg1234, _AccumRg567, _AccumRgT568. Сопоставление даёт метод платформы:
Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Выполните его в консоли кода или внешней обработке и найдите строку с метаданными вашего регистра. Там будут основная таблица и все служебные: итоги, обороты, срезы. В PostgreSQL имена в нижнем регистре.
Порядок работы
- Завершите все сеансы и заблокируйте вход в базу. Работа с данными под активными пользователями испортит базу; предупредите людей заранее и делайте это вне рабочего дня.
- Сделайте резервную копию средствами СУБД и проверьте, что она восстанавливается.
- Очистите основную таблицу регистра и все его таблицы итогов и срезов. Оставить итоги без движений — значит получить «фантомные» остатки.
- Запустите «Тестирование и исправление» с пересчётом итогов (следующий раздел).
- Проверьте отчёты по этому регистру на нескольких датах.
-- пример для MS SQL, имена таблиц — из структуры хранения
TRUNCATE TABLE dbo._InfoRg1234;
TRUNCATE для регистра накопления применяйте только если чистите его целиком. Частичное удаление по условию в SQL требует знания полей _RecorderRRef, _Period и связей с итогами — здесь проще и безопаснее код 1С.
Подчинённые регистры нельзя чистить в SQL «по документу» без удаления его движений из остальных регистров. Документ останется проведённым, а движений частично не будет.
Автоматизация очистки внешней обработкой
Если мусор копится постоянно (лог интеграции, временные данные загрузки), очистку стоит поставить на расписание.
Вариант без изменения конфигурации
В типовых на БСП внешнюю обработку можно подключить как дополнительную:
- Создайте внешнюю обработку с процедурой очистки (код набора записей из раздела выше).
- Добавьте в модуль объекта функцию
СведенияОВнешнейОбработке()с видом «Дополнительная обработка» и командой с типом «Вызов серверного метода». - Загрузите её в
Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки. - В карточке обработки для команды настройте расписание.
Так очистка будет выполняться на сервере регламентным заданием и переживёт обновление конфигурации .
Что заложить в обработку
- 🎯 жёсткий отбор: период «старше N дней», конкретный регистр — без универсального «удалить всё»;
- 📦 запись порциями по 1000–5000 регистраторов;
- 🧾 запись итога в журнал регистрации;
- 🧪 режим «только посчитать» без удаления — для первой проверки.
Как проверить и восстановить целостность после очистки
После удаления кодом с ОбменДанными.Загрузка (проверки конфигурации были отключены) и особенно после SQL проверьте базу штатным тестированием.
Тестирование и исправление
- Завершите сеансы пользователей: для режима нужен монопольный доступ.
- Откройте конфигуратор:
Администрирование → Тестирование и исправление. - Отметьте «Пересчёт итогов» и «Проверка логической целостности информационной базы».
- Для поиска ссылок на удалённое включите «Проверка ссылочной целостности» с действием «Не изменять» — сначала посмотреть, что найдёт.
- Запустите и дождитесь протокола.
Пересчёт итогов без конфигуратора
Итоги регистров накопления и бухгалтерии пересчитывают и в пользовательском режиме: Все функции → Стандартные → Управление итогами. Там же включают и выключают использование итогов и задают период рассчитанных итогов. Для больших баз пересчёт идёт долго — планируйте его на ночь.
Если данные удалили лишнее
| Что произошло | Что делать |
|---|---|
| Удалены движения проведённых документов | Перепроведите документы за период — движения создадутся заново |
| Очищен независимый регистр сведений | Восстановите из резервной копии: загрузите копию в отдельную базу и перенесите записи |
| Остатки не сходятся после SQL | Пересчитайте итоги; если не помогло — откат на копию |
| Ошибки «Объект не найден» в отчётах | Проверка ссылочной целостности и разбор найденных ссылок |
Записи регистра сведений, которые вводились руками (курсы, цены, настройки), из документов не восстановить. Для них единственный путь — копия.