Удаление движений регистра накопления: рабочие способы и порядок
Содержание
Очистить регистр накопления напрямую «кнопкой» в пользовательском режиме нельзя: его записи подчинены регистратору — документу, который их сформировал. Поэтому очистка всегда сводится к одному из трёх действий: отменить проведение документов, записать по каждому регистратору пустой набор записей из кода или обработки, либо (в крайнем случае) удалить строки прямым запросом в СУБД.
Какой способ выбрать — зависит от того, нужно ли убрать движения одного документа, вычистить регистр целиком перед переносом данных или сократить разросшуюся таблицу за старые годы. Ниже — что делает каждый способ, в каком порядке действовать и как не оставить базу в несогласованном состоянии.
Любая из операций меняет учётные данные. Перед очисткой сделайте резервную копию базы и выполняйте работу в монопольном режиме или в нерабочее время — иначе параллельные проведения перепишут регистр заново.
Что даёт очистка регистра и чем она рискованна
Регистр накопления хранит движения: приход и расход по измерениям (склад, номенклатура, организация и т. п.). Каждая строка привязана к регистратору и к его дате. Чистят регистр в нескольких ситуациях:
- 🧹 перед тестовым переносом или повторной загрузкой данных, когда старые движения мешают;
- 🧩 при разработке — чтобы перепровести документы с новой логикой «с чистого листа»;
- 📉 для сокращения объёма базы, когда таблица движений за прошлые годы занимает гигабайты;
- 🔧 при исправлении ошибки, из-за которой в регистр попали лишние или задвоенные записи.
Главный риск — рассинхронизация. Если удалить движения, но оставить проведёнными документы-регистраторы, отчёты по остаткам и оборотам покажут неверные цифры, а повторное проведение этих документов вернёт записи обратно. Поэтому удаление движений почти всегда идёт в паре либо с отменой проведения документов, либо с последующим пересчётом итогов.
Второй риск — итоги. У регистров остатков рядом с таблицей движений живёт таблица рассчитанных итогов. Если тронуть движения в обход платформы (прямым SQL), итоги останутся старыми, и остатки «поедут». Разбор итогов — отдельный раздел ниже.
Способ 1. Отмена проведения документов-регистраторов
Самый безопасный путь, если нужно убрать движения, сформированные документами. Регистр чистится штатно, итоги пересчитываются платформой автоматически.
Для одного документа:
- Откройте документ.
- Нажмите
Ещё → Отменить проведение(или снимите флаг проведения и запишите). - Движения этого документа по всем регистрам удаляются сразу.
Для группы документов используйте типовую обработку групповых действий. В типовых конфигурациях (БП 3.0, ЗУП 3.1, УТ 11) она открывается через Все функции → Стандартные → Групповое изменение реквизитов для реквизитов и через обработку отмены проведения — в разделе обслуживания. Если «Все функции» недоступны, включите их: Главное меню (значок с треугольником) → Сервис → Параметры → Отображать команду «Все функции».
Проще всего отменить проведение списком:
- Откройте журнал документов нужного вида.
- Выделите строки (отбором по периоду или вручную,
Ctrl+A— выделить всё). - В командной панели списка вызовите команду отмены проведения выделенных документов.
Если документы нужно не просто «обездвижить», а убрать совсем, пометьте их на удаление и выполните Администрирование → Обслуживание → Удаление помеченных объектов. Удаление снимет и движения, и сами документы — но только если на них никто не ссылается.
Этот способ не годится, когда регистратор сохранять надо, а движения — нет (например, документ проводится оперативно, но конкретный регистр для теста нужно обнулить). Тогда переходите к наборам записей.
Способ 2. Удаление движений через наборы записей
Это «рабочая лошадка» разработчика. Приём основан на том, что запись пустого набора записей по отбору удаляет все строки, попавшие в отбор. Выполняется в консоли запросов с обработкой или во внешней обработке.
Чтобы очистить регистр целиком, переберите всех регистраторов и запишите по каждому пустой набор:
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Регистратор
|ИЗ
| РегистрНакопления.ТоварыНаСкладах");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Записать(); // набор пустой — строки удаляются
КонецЦикла;
Имя регистра (ТоварыНаСкладах) замените на своё. Отбор по регистратору обязателен: записать набор без установленного отбора по регистратору у подчинённого регистра платформа не даст.
Если нужно вычистить движения не всего регистра, а только одного документа или одной организации, добавьте отбор:
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Записать();
Чем этот способ лучше прямого SQL: платформа сама аккуратно правит таблицу итогов и остаётся в рамках поддерживаемых операций. Чем он медленнее отмены проведения: пустой набор пишется транзакцией на каждого регистратора, и на сотнях тысяч документов проход заметно дольше, чем одна операция свёртки.
На больших объёмах учитывайте две вещи. Во-первых, запись каждого набора — отдельная транзакция, и при массовом проходе регистр надолго блокируется для других сеансов. Выполняйте очистку в монопольном режиме. Во-вторых, если регистр остатков отключён от итогов на время обработки, проход идёт быстрее: временно выключите использование итогов методом УстановитьИспользованиеИтогов(Ложь), обнулите движения, затем включите итоги обратно и пересчитайте их. Для регистра оборотов этот приём не нужен.
Один документ обычно пишет движения в несколько регистров сразу. Запись пустого набора по одному регистру уберёт движения только из него — в остальных регистрах записи этого документа останутся. Это и есть причина использовать наборы, когда нужно вычистить ровно один регистр, не трогая учёт по другим.
Запись набора — это изменение базы в обход проведения. Документы останутся проведёнными, а движений по этому регистру у них не будет. Для разработки это нормально, для рабочей базы — повод потом перепровести документы или пересчитать итоги.
Способ 3. Прямое удаление в СУБД — крайняя мера
Удалить строки запросом DELETE прямо в таблице SQL Server или PostgreSQL технически можно, но это неподдерживаемая операция. Фирма 1С такие вмешательства не рекомендует: платформа рассчитывает, что таблицы движений и итогов согласованы, и прямой DELETE эту согласованность ломает.
Что идёт не так при прямом SQL:
- таблица рассчитанных итогов остаётся старой — остатки показывают движения, которых уже нет;
- нарушается нумерация и внутренние служебные поля, которые ведёт платформа;
- при следующем обновлении конфигурации или реструктуризации возможны ошибки.
Если всё же нужно работать на уровне СУБД (например, при разовой разборке очень большой базы под контролем DBA), сначала узнайте реальные имена таблиц. Их выдаёт встроенная функция:
Структура = ПолучитьСтруктуруХранениеБазыДанных();
Движения регистра накопления лежат в таблице вида _AccumRgNNN, итоги — в _AccumRgTNNN, где NNN — внутренний номер. Точные имена всегда берите из структуры хранения, а не из догадок: номера различаются от базы к базе.
После прямого удаления строк обязательно запустите Тестирование и исправление и пересчёт итогов (см. ниже), иначе база останется в несогласованном состоянии. Правильнее вообще не трогать таблицы напрямую, а использовать наборы записей или свёртку.
Для выбора способа ориентируйтесь по задаче:
Регистры остатков и оборотов: в чём разница при очистке
Регистры накопления бывают двух видов, и это влияет на то, что придётся делать после удаления движений.
| Вид регистра | Что хранит | Нужен ли пересчёт итогов |
|---|---|---|
| Регистр остатков | приход/расход и рассчитанные остатки по измерениям | да, есть таблица итогов |
| Регистр оборотов | только обороты за период | таблицы остатков нет, но могут быть итоги оборотов |
У регистра остатков рядом с движениями всегда есть таблица итогов. Пока вы чистите регистр наборами записей или отменой проведения, платформа правит итоги сама. Если же движения ушли в обход платформы, итоги надо пересчитать вручную.
Измерения (Склад, Номенклатура, Организация и т. д.) на технику очистки не влияют: отбор при записи набора всё равно ставится по регистратору. А вот при частичной очистке именно по измерениям удобно сузить, какие документы перебирать — отберите в запросе регистраторов, у которых есть движения по нужному складу или организации, и обнуляйте только их.
Не путайте регистр накопления с независимым регистром сведений. У независимого регистра сведений регистратора нет, и там набор записей можно писать с отбором по измерениям напрямую — очистка проще. У регистра накопления регистратор обязателен всегда.
Пересчёт итогов и проверка данных после очистки
После любой очистки убедитесь, что регистр и его итоги согласованы.
Пересчёт итогов из кода — одной строкой на регистр остатков:
РегистрыНакопления.ТоварыНаСкладах.ПересчитатьИтоги();
Интерактивно пересчёт делают через Все функции → Стандартные → Управление итогами: там выбирают регистры и запускают пересчёт за нужный период. Для рабочей базы это тяжёлая операция — запускайте её в монопольном режиме.
Проверка, что регистр действительно пуст:
- Постройте любой отчёт по остаткам/оборотам этого регистра — он должен быть пустым за весь период.
- Или выполните запрос
ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрНакопления.ИмяРегистрав консоли — ноль означает, что движений не осталось. - Проверьте, что документы, которые должны были остаться проведёнными, не потеряли движения по другим регистрам.
Если вы удаляли сами документы-регистраторы, проверьте, что на них не осталось ссылок из других объектов. В пользовательском режиме для этого служит команда поиска ссылок на объект в карточке документа — она покажет, где он ещё используется. Документ со ссылками обработка удаления помеченных объектов не удалит, пока ссылки не сняты.
Если вы работали прямым SQL или подозреваете рассинхронизацию, запустите Конфигуратор → Администрирование → Тестирование и исправление, отметьте пересчёт итогов и проверку логической целостности.
Тестирование и исправление требует монопольного доступа к базе. Все пользовательские сеансы при запуске будут завершены — предупредите пользователей и выбирайте нерабочее время.
Свёртка базы и профилактика разрастания регистров
Когда цель — не стереть регистр, а уменьшить объём базы за счёт старых движений, ручная очистка не подходит: вы потеряете историю остатков. Для этого есть штатная обработка свёртки.
Свёртка информационной базы делает три вещи:
- формирует документы ввода остатков на выбранную дату;
- удаляет движения и документы за период до этой даты;
- оставляет корректные остатки для дальнейшей работы.
В типовых конфигурациях обработка входит в поставку — в БП 3.0 её запускают из раздела Администрирование (пункт свёртки информационной базы). Перед свёрткой обязательна архивная копия: операция необратима.
Чтобы регистры не разрастались снова:
- 🗂️ проводите свёртку по закрытым и сданным периодам раз в один-два года;
- 🧾 не оставляйте массовые тестовые проведения в рабочей базе — чистите их наборами записей сразу;
- ⚙️ при доработках, формирующих движения, следите, чтобы документ не записывал пустые или нулевые строки в регистр;
- 💾 держите регламентное резервное копирование — любая очистка становится безопасной, когда есть точка отката.
Частые вопросы
Можно ли очистить регистр накопления без Конфигуратора?
Почему после удаления движений остатки всё равно показываются?
Все функции → Стандартные → Управление итогами или метод ПересчитатьИтоги().