К статье
Практический материал

Администрирование · 10 мин

Как удалить данные из регистра накопления 1С

Способы удаления данных из регистра накопления 1С: через документы, обработки и код. Риски, проверка результата, типичные ошибки и восстановление данных.

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

Выбор способа зависит от объёма: если нужно убрать движения нескольких документов, достаточно штатных средств. Если требуется очистить регистр целиком, свернуть историю за период или удалить «осиротевшие» записи без документов — понадобится код или обработка. Каждый вариант имеет свои риски: некорректная очистка ломает отчёты, последовательности и итоги, а восстановить данные без резервной копии невозможно.

Как устроено хранение данных в регистре накопления

Регистр накопления состоит из таблицы движений и виртуальных таблиц итогов (остатков и оборотов). Каждая запись в таблице движений обязательно привязана к регистратору — документу, который её создал. Поле «Регистратор» хранит ссылку на документ, и платформа не позволяет создать запись без него штатными средствами.

Итоговые таблицы (остатки) пересчитываются автоматически при записи движений. Если удалить записи из таблицы движений напрямую в СУБД, минуя платформу, итоги станут неактуальными, а механизм получения остатков начнёт возвращать неверные данные. Поэтому любые манипуляции выполняются только средствами встроенного языка или штатных операций — тогда итоги пересчитаются корректно.

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

Удаление движений через документы — штатный и безопасный путь

Самый правильный способ убрать записи из регистра — устранить их источник. Откройте документ, сформировавший движения, и выполните одно из действий: отмените проведение (кнопка «Провести» / снятие отметки проведения) или пометьте документ на удаление. В обоих случаях платформа автоматически очистит все движения документа по всем регистрам, где он является регистратором.

Чтобы найти, какие документы сделали движения по регистру, используйте отчёт «Движения документа» или стандартный отчёт по регистру с группировкой по регистратору. Если нужно массово отменить проведение за период, воспользуйтесь групповой обработкой документов: «Администрирование → Обслуживание → Корректировка данных → Групповое изменение реквизитов» (в типовых конфигурациях на БСП) с операцией отмены проведения.

Порядок действий через документы
  1. 1
    Найдите документы-регистраторы через отчёт по регистру с детализацией до регистратора
  2. 2
    Сделайте резервную копию базы перед массовыми операциями
  3. 3
    Отмените проведение документов или пометьте их на удаление
  4. 4
    Выполните «Удаление помеченных объектов» в монопольном режиме, если документы больше не нужны
  5. 5
    Проверьте остатки по регистру стандартным отчётом

После пометки на удаление записи из регистра исчезают сразу, а сами документы физически удаляются через «Операции → Удаление помеченных объектов». Учтите, что удаление документов за прошлые периоды изменит отчётность за эти периоды — если данные уже сданы, это создаст расхождения с отчётностью.

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

Когда нужно очистить регистр полностью или удалить записи без живых регистраторов, используется объект «НаборЗаписей». Минимальный код полной очистки регистра выглядит так:

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

Для удаления движений конкретного документа набор записей отбирается по регистратору:

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

Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);

Набор.Записать(Истина);

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

Очистка через типовые и внешние обработки

В конфигурациях на Библиотеке стандартных подсистем есть штатные механизмы, косвенно решающие задачу. «Удаление помеченных объектов» физически удаляет документы вместе с их движениями. Обработка «Свертка информационной базы» (поставляется отдельно для типовых решений) заменяет движения за прошлые периоды документами ввода остатков — это не удаление в чистом виде, но радикально сокращает объём регистра.

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

Особые ситуации: битые ссылки, обмены, разделённые базы

Записи с недоступными регистраторами

Иногда в регистре остаются записи, чей регистратор удалён с нарушением ссылочной целостности (например, после сбоев обмена или прямых манипуляций с базой). Такие записи видны в таблице движений, но документ открыть нельзя. Удаляются они программно: запросом находятся значения регистраторов, затем для каждого очищается набор записей по отбору.

Регистры в планах обмена

Если регистр включён в состав плана обмена, удаление записей зарегистрируется как изменение и уйдёт в другие узлы. Это может быть как желаемым эффектом (очистка распространится на филиалы), так и проблемой — массовая регистрация изменений перегрузит обмен. Перед очисткой в распределённой базе согласуйте действия с администраторами других узлов и при необходимости временно снимите регистрацию изменений.

Закрытые периоды и даты запрета

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

Типичные ошибки
01
Удаление записей напрямую в СУБД запросом DELETE — итоги регистра перестают соответствовать движениям, отчёты показывают неверные остатки
02
Очистка регистра без резервной копии — при ошибке в условии отбора данные теряются безвозвратно
03
Удаление движений без пересчёта итогов и без восстановления последовательностей — расчёт себестоимости и проведение новых документов дают искажённые результаты
04
Игнорирование планов обмена — массовая регистрация удалений блокирует синхронизацию или размножает очистку на узлы, где она не нужна

Проверка результата после удаления

После любого способа удаления убедитесь, что регистр находится в согласованном состоянии. Сформируйте отчёт «Остатки» (или универсальный отчёт по регистру) за несколько периодов и сравните с ожидаемыми значениями. Проверьте, что в таблице движений не осталось записей, которые должны были быть удалены.

Контрольные точки

Как проверить результат

Отчёт по остаткам регистра
Норма

Остатки соответствуют ожиданиям и совпадают с данными смежных регистров

Тревожный признак

Отрицательные или завышенные остатки, расхождения с учётными данными

Записи с битыми регистраторами
Норма

Запрос по таблице движений не находит записей без существующих документов

Тревожный признак

Есть записи, регистратор которых не открывается

Итоги регистра
Норма

Пересчёт итогов выполнен, виртуальные таблицы возвращают актуальные данные

Тревожный признак

Остатки на дату отличаются от оборотов за период

Граница последовательности
Норма

Граница стоит на последнем проведённом документе

Тревожный признак

Граница сброшена на раннюю дату, требуется массовое перепроведение

Если регистр участвует в расчёте себестоимости или партионном учёте, дополнительно выполните восстановление последовательностей («Операции → Проведение документов → Восстановление последовательностей» в типовых) либо перепроведение документов за затронутый период. Это гарантирует корректность последующих расчётов.

Итог

Что важно запомнить

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

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

Можно ли удалить отдельную строку движений документа, не отменяя его проведения?

Штатными средствами — нет: движения документа формируются целиком при проведении. Варианты: изменить данные документа и перепровести его, либо программно загрузить набор записей документа, удалить нужную строку и записать набор обратно. Второй способ нарушает связь «документ — его движения», поэтому при следующем перепроведении удалённая строка появится снова.

Чем отличается пометка на удаление от отмены проведения?

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

Как удалить все записи регистра за определённый период?

Набор записей не поддерживает отбор по периоду, поэтому сначала запросом к таблице движений выберите различные регистраторы за нужный период, затем в цикле для каждого создайте набор записей с отбором по регистратору и запишите пустой набор. Альтернатива для типовых конфигураций — обработка свертки базы, которая заменяет старые движения вводом остатков.

Нужно ли пересчитывать итоги после удаления записей?

При удалении средствами платформы (отмена проведения, запись пустого набора) итоги обновляются автоматически. Пересчёт требуется после массовых операций, работы внешних обработок, восстановления из копии или любых сомнений в корректности остатков. Выполняется через «Тестирование и исправление» в конфигураторе или методом ПересчитатьИтоги().

Что делать, если после очистки регистра отчёты показывают неверные остатки?

Сначала выполните пересчёт итогов — чаще всего проблема в устаревших итоговых таблицах. Если не помогло, проверьте наличие записей с битыми регистраторами и очистите их программно. Затем восстановите границы последовательностей и перепроведите документы за проблемный период. При сохранении расхождений запустите «Тестирование и исправление» с проверкой ссылочной целостности.

Можно ли восстановить удалённые из регистра данные?

Только из резервной копии: платформа не ведёт историю удаления записей регистров. Если копии нет, но движения формировались документами, которые остались в базе, — перепроведите эти документы, и движения будут созданы заново. Если удалены и документы, и копии нет, данные восстановлению не подлежат.