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