Удаление записей из регистров сведений и накопления в 1С 8.3: от штатных средств до SQL

· 9 мин

Содержание

Чистить регистр в 1С правильно так: записи, подчинённые документу, убирают через сам документ (отмена проведения или удаление), независимые записи регистра сведений — из списка регистра или записью пустого набора кодом, а после массовой очистки запускают пересчёт итогов. Прямой DELETE в SQL — последний вариант, и только на копии базы.

Типичная ситуация: база выросла до 60 ГБ, половину занимает регистр версий объектов или журнал обмена. Или после неудачной загрузки в регистре висят строки с регистратором <Объект не найден>, и отчёты показывают остатки, которых нет. Удалять и очищать такие данные можно безопасно — если понимать, как регистр хранит записи.

Перед любой массовой очисткой сделайте выгрузку базы в .dt или резервную копию СУБД. Удалённые записи регистра без копии не вернуть.

Какие бывают регистры и как они хранят данные

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

Вид регистраРежим записиЧто хранит в СУБДКак удаляются записи
Регистр сведенийНезависимыйТаблица записей (+ таблицы срезов, если включены)Из списка или кодом, без документов
Регистр сведенийПодчинение регистраторуТаблица записей с полем «Регистратор»Только через регистратор или набор с отбором по регистратору
Регистр накопления (остатки)Всегда подчинёнТаблица движений + таблица итоговЧерез регистратор, затем пересчёт итогов
Регистр накопления (обороты)Всегда подчинёнТаблица движений + таблица оборотовЧерез регистратор
Регистр бухгалтерииВсегда подчинёнДвижения, итоги, субконтоЧерез документ или операцию
Регистр расчётаВсегда подчинёнЗаписи, перерасчёты, фактический периодЧерез документ-начисление

Главное отличие от справочников: у регистра нет «пометки на удаление». Запись либо есть, либо её нет.

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

💡 Периодический регистр сведений хранит историю значений. Удалив старые записи, вы меняете значение «на дату» для всех документов прошлых периодов. Для цен и курсов это опасно: перепроведение старого документа даст другую сумму.

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

Начните с того, что даёт сама программа. Здесь платформа следит за целостностью за вас.

Записи, подчинённые документу

  1. Откройте документ-регистратор.
  2. Нажмите «Отмена проведения» — движения документа удалятся из всех регистров.
  3. Если документ не нужен совсем, пометьте его на удаление и запустите Администрирование → Обслуживание → Удаление помеченных объектов.

При удалении документа его движения уходят вместе с ним. Отдельно чистить регистр не нужно.

Для массовой отмены проведения в БП 3.0 и УТ 11 подходит групповая обработка документов или перепроведение за период с отбором. Найдите её в разделе Администрирование по слову «Групповое».

Независимый регистр сведений

  1. Включите меню «Все функции»: Главное меню → Сервис → Параметры → Отображать команду "Все функции".
  2. Откройте Все функции → Регистры сведений и нужный регистр.
  3. Установите отбор, выделите строки (Shift+клик, Ctrl+A) и нажмите Delete.

Список подчинённого регистра так не почистить: записи доступны только для просмотра. Это защита, а не ошибка.

Свертка базы

Если цель — уменьшить размер базы, а не убрать конкретные строки, в БП 3.0 есть обработка «Свертка информационной базы». Ищите её в Администрирование → Обслуживание. Она удаляет документы до даты свертки и вводит вместо них остатки. Это тоже очистка регистров, но с сохранением сальдо.

Свертка необратима и долгая. Запускайте её на копии, сверяйте оборотно-сальдовую ведомость до и после, и только потом повторяйте в рабочей базе.

Регистры БСП, которые разрастаются

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

  • 📦 Версии объектов — в настройках версионирования (раздел Администрирование → Общие настройки) задают срок хранения и удаляют устаревшие версии;
  • 🔄 Регистрация изменений обмена — очищается после успешного обмена; если узел больше не используется, удалите сам узел плана обмена, и его регистрация уйдёт;
  • 🗂️ Дубли и мусор после загрузки — сначала найдите их консолью запросов (следующий раздел).

Поиск лишних записей через консоль запросов

Язык запросов 1С только читает данные. Удалить запись запросом нельзя — DELETE в нём нет. Консоль нужна, чтобы точно найти, что удалять.

Пример: движения регистра накопления, у которых регистратор удалён в обход платформы («битые ссылки»).

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Остатки.Регистратор КАК Регистратор
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Остатки
ГДЕ
    Остатки.Регистратор.Дата ЕСТЬ NULL

Если документ-регистратор физически отсутствует, обращение к его реквизиту вернёт NULL. Так вы получите список «потерянных» регистраторов.

Второй пример — дубли в независимом регистре сведений, когда одинаковые данные записаны под разными измерениями:

ВЫБРАТЬ
    Рег.Номенклатура,
    КОЛИЧЕСТВО(*) КАК Строк
ИЗ
    РегистрСведений.ШтрихкодыНоменклатуры КАК Рег
СГРУППИРОВАТЬ ПО
    Рег.Номенклатура
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) > 1

Имена регистров в примерах условные — подставьте свои из дерева метаданных. Консоль запросов есть в составе стандартных обработок для 8.3; многие версии консоли умеют выполнять код по результату, но удаление всё равно делается кодом, а не запросом.

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

Основной инструмент программиста — набор записей. Записанный пустой набор с отбором удаляет всё, что под отбор попадает.

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

Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();

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

ОбменДанными.Загрузка = Истина отключает обработчики ПередЗаписью и подписки на события. Это ускоряет очистку, но снимает и проверки конфигурации. Ставьте флаг, только когда точно знаете, что удаляете мусор.

Очистить независимый регистр сведений по отбору

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

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

Битые регистраторы

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

Большие объёмы

Если строк сотни тысяч, не пишите всё одной транзакцией:

  • ⏱️ делите по регистраторам или по периодам и записывайте порциями;
  • 🔒 запускайте в нерабочее время: запись набора ставит блокировки, и пользователи будут ждать;
  • 📝 пишите в журнал регистрации, что и сколько удалено, — пригодится при разборе.

Удаление данных регистра напрямую в SQL

Этот путь для администраторов, которые понимают структуру хранения. Фирма 1С не поддерживает правку данных в обход платформы, а ошибка ломает базу целиком.

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

Как найти таблицу регистра

Имена таблиц в СУБД обезличены: _InfoRg1234, _AccumRg567, _AccumRgT568. Сопоставление даёт метод платформы:

Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);

Выполните его в консоли кода или внешней обработке и найдите строку с метаданными вашего регистра. Там будут основная таблица и все служебные: итоги, обороты, срезы. В PostgreSQL имена в нижнем регистре.

Порядок работы

  1. Завершите все сеансы и заблокируйте вход в базу. Работа с данными под активными пользователями испортит базу; предупредите людей заранее и делайте это вне рабочего дня.
  2. Сделайте резервную копию средствами СУБД и проверьте, что она восстанавливается.
  3. Очистите основную таблицу регистра и все его таблицы итогов и срезов. Оставить итоги без движений — значит получить «фантомные» остатки.
  4. Запустите «Тестирование и исправление» с пересчётом итогов (следующий раздел).
  5. Проверьте отчёты по этому регистру на нескольких датах.
-- пример для MS SQL, имена таблиц — из структуры хранения
TRUNCATE TABLE dbo._InfoRg1234;

TRUNCATE для регистра накопления применяйте только если чистите его целиком. Частичное удаление по условию в SQL требует знания полей _RecorderRRef, _Period и связей с итогами — здесь проще и безопаснее код 1С.

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

Автоматизация очистки внешней обработкой

Если мусор копится постоянно (лог интеграции, временные данные загрузки), очистку стоит поставить на расписание.

Вариант без изменения конфигурации

В типовых на БСП внешнюю обработку можно подключить как дополнительную:

  1. Создайте внешнюю обработку с процедурой очистки (код набора записей из раздела выше).
  2. Добавьте в модуль объекта функцию СведенияОВнешнейОбработке() с видом «Дополнительная обработка» и командой с типом «Вызов серверного метода».
  3. Загрузите её в Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки.
  4. В карточке обработки для команды настройте расписание.

Так очистка будет выполняться на сервере регламентным заданием и переживёт обновление конфигурации .

Что заложить в обработку

  • 🎯 жёсткий отбор: период «старше N дней», конкретный регистр — без универсального «удалить всё»;
  • 📦 запись порциями по 1000–5000 регистраторов;
  • 🧾 запись итога в журнал регистрации;
  • 🧪 режим «только посчитать» без удаления — для первой проверки.
Перед запуском массовой очистки
Выполнено: 0 / 5

Как проверить и восстановить целостность после очистки

После удаления кодом с ОбменДанными.Загрузка (проверки конфигурации были отключены) и особенно после SQL проверьте базу штатным тестированием.

Тестирование и исправление

  1. Завершите сеансы пользователей: для режима нужен монопольный доступ.
  2. Откройте конфигуратор: Администрирование → Тестирование и исправление.
  3. Отметьте «Пересчёт итогов» и «Проверка логической целостности информационной базы».
  4. Для поиска ссылок на удалённое включите «Проверка ссылочной целостности» с действием «Не изменять» — сначала посмотреть, что найдёт.
  5. Запустите и дождитесь протокола.

Пересчёт итогов без конфигуратора

Итоги регистров накопления и бухгалтерии пересчитывают и в пользовательском режиме: Все функции → Стандартные → Управление итогами. Там же включают и выключают использование итогов и задают период рассчитанных итогов. Для больших баз пересчёт идёт долго — планируйте его на ночь.

Если данные удалили лишнее

Что произошлоЧто делать
Удалены движения проведённых документовПерепроведите документы за период — движения создадутся заново
Очищен независимый регистр сведенийВосстановите из резервной копии: загрузите копию в отдельную базу и перенесите записи
Остатки не сходятся после SQLПересчитайте итоги; если не помогло — откат на копию
Ошибки «Объект не найден» в отчётахПроверка ссылочной целостности и разбор найденных ссылок

Записи регистра сведений, которые вводились руками (курсы, цены, настройки), из документов не восстановить. Для них единственный путь — копия.

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

Можно ли удалить записи регистра запросом в консоли?
Нет. Язык запросов 1С только читает данные. Запросом находят записи, а удаляют их кодом через набор записей.
Почему в списке регистра кнопка удаления не активна?
Регистр подчинён регистратору. Его записи меняются только через документ: отмените проведение или удалите документ.
Уменьшится ли файл базы после очистки регистра?
В файловой базе — после «Сжатия таблиц информационной базы» в тестировании и исправлении. В клиент-серверной место освобождает СУБД: в MS SQL — сжатием файла, в PostgreSQL — командой VACUUM FULL.
Нужно ли пересчитывать итоги после отмены проведения документов?
Нет. При отмене проведения и при записи набора кодом платформа корректирует итоги сама, даже в режиме загрузки. Пересчёт нужен после правки таблиц в SQL или если отчёты по остаткам расходятся с движениями.
Влияет ли очистка регистра на закрытые периоды?
Да, если удалить движения до даты запрета изменения данных. Отчёты и регламентированная отчётность за прошлые периоды изменятся, поэтому такие регистры чистят только по согласованию с главным бухгалтером.