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

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

Как удалить записи в регистре сведений 1С

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

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

Выбор способа зависит от трёх условий: сколько записей нужно удалить, есть ли у регистра регистратор (подчинён он документу или независим) и есть ли у вас права на интерактивное удаление. Для десятка записей достаточно интерфейса списка, для сотен тысяч — понадобится обработка или код, а для подчинённого регистра удаление идёт только через документ-регистратор.

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

Определите тип регистра: независимый или подчинённый регистратору

Первое, что нужно проверить, — режим записи регистра сведений. Откройте конфигуратор, найдите регистр в ветке «Регистры сведений» и посмотрите свойство «Режим записи». Если стоит «Независимый» — записи можно удалять напрямую любым способом. Если «Подчинение регистратору» — каждая запись принадлежит документу, и удалить её можно только вместе с движениями этого документа.

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

Удаление записей через список регистра

Самый простой способ подходит для небольшого количества записей в независимом регистре. Откройте регистр через меню «Операции» → «Регистры сведений» (в управляемом интерфейсе) или через команду перехода из связанного объекта. Выделите нужные строки — по одной или с зажатой клавишей Ctrl/Shift для нескольких.

Дальше два варианта. Первый — пометить на удаление клавишей Delete, после чего записи исчезнут из списка, но физически удалятся только после операции «Удаление помеченных объектов» (Администрирование → Обслуживание). Второй — интерактивное удаление без пометки: Shift+Delete с подтверждением. Второй вариант быстрее, но не оставляет «страховки» в виде пометки.

Если список большой, используйте отбор (кнопка «Ещё» → «Настроить список» в управляемых формах): отфильтруйте записи по измерению, ресурсу или периоду, затем выделите все отображённые строки через Ctrl+A и удалите. Учтите, что Ctrl+A выделяет только загруженную в список порцию — при очень больших таблицах такой способ ненадёжен.

Удаление через список регистра
  1. 1
    Откройте регистр: Операции → Регистры сведений → нужный регистр
  2. 2
    Настройте отбор по измерениям или периоду, чтобы видеть только лишние записи
  3. 3
    Выделите записи (Ctrl+клик или Ctrl+A в пределах отбора)
  4. 4
    Нажмите Delete для пометки или Shift+Delete для прямого удаления
  5. 5
    При пометке — выполните Администрирование → Удаление помеченных объектов
  6. 6
    Проверьте результат повторным отбором по тем же условиям

Программное удаление кодом через набор записей

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

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

НаборЗаписей.Отбор.ТипЦен.Установить(СтарыйТипЦен);

НаборЗаписей.Записать(); // записи по отбору удалены

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

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

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

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

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

Альтернатива коду — типовые и внешние обработки. В конфигурациях на БСП есть «Групповое изменение реквизитов», но оно не удаляет записи регистров. Для удаления используют универсальные обработки поиска и удаления дублей, обработку «Удаление помеченных объектов» для помеченных записей, а также консоль кода / консоль запросов с ИР-подобными инструментами. Любую внешнюю обработку сначала запускайте на копии базы.

Способы удаления записей

Список регистра

Подходит для десятков записей и разовой чистки. Неудобен на больших объёмах, риск выделить лишнее при Ctrl+A.

Набор записей с отбором

Быстрый и штатный способ для массового удаления по измерениям. Требует прав на запуск кода и аккуратного отбора.

Запрос + цикл

Нужен при отборе по ресурсам и сложным условиям. Медленнее, требует порционной обработки и транзакции.

Внешние обработки

Удобны без навыков кода. Обязательна проверка на копии базы, качество обработок разное.

Удаление записей в регистре, подчинённом регистратору

Если регистр подчинён регистратору, прямое удаление записей невозможно — платформа не даст записать набор без регистратора. Здесь три рабочих пути. Первый: отменить проведение документа-регистратора — его движения по регистру будут удалены автоматически. Второй: пометить документ на удаление и выполнить удаление помеченных объектов — движения уйдут вместе с документом.

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

Типичные ошибки и ограничения

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

Третья группа проблем — производительность и блокировки. Удаление миллионов записей одной транзакцией блокирует таблицу и может завершиться тайм-аутом. Дробите операцию на порции, выполняйте в нерабочее время, а в клиент-серверном варианте следите за журналом регистрации и состоянием СУБД. Также помните: после массового удаления физический размер файлов базы не уменьшится автоматически — для файловой базы нужна операция «Тестирование и исправление» с сжатием, для MS SQL — shrink на уровне СУБД (с осторожностью).

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

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

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

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

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

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

Отбор в списке по условиям удаления
Норма

Лишние записи не находятся

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

Записи остались — отбор в коде не совпал с условиями

Количество записей запросом до и после
Норма

Разница равна числу удалённых

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

Удалено больше или меньше ожидаемого

Работа связанных механизмов (цены, курсы, обмены)
Норма

Подстановка данных в документах работает

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

Пустые цены или курсы — удалены актуальные записи

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

Можно ли удалить записи регистра сведений без прав администратора?

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

Почему после удаления записей размер базы не уменьшился?

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

Как удалить записи регистра по условию на ресурс, например «цена равна нулю»?

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

Что будет, если удалить записи периодического регистра за закрытый период?

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

Удалятся ли записи регистра при удалении документа-регистратора?

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

Можно ли восстановить ошибочно удалённые записи?

Штатной функции отката нет. Восстановление возможно только из резервной копии: либо полным восстановлением базы, либо выборочной загрузкой записей через выгрузку/загрузку данных между копией и рабочей базой. Поэтому резервная копия перед массовым удалением обязательна.

Итог

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

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