Очистка регистров сведений: способы удаления записей и возврата данных
Содержание
Способ очистки регистра сведений зависит от его вида. Независимый регистр чистят вручную через Главное меню → Все функции → Регистры сведений → <имя регистра> (выделить строки и нажать Delete) или программно — записью пустого набора записей. Регистр, подчинённый регистратору, так не трогают: его записи удаляются вместе с движениями документа — через отмену проведения или перепроведение.
Перед любой очисткой — резервная копия. Операция необратима: после записи пустого набора или Delete данные удаляются без возможности отмены внутри программы. Прямое удаление строк в таблицах СУБД через SQL делать нельзя: это рушит целостность базы, итоги и ссылочную согласованность.
Ниже — как определить вид регистра, как чистить каждый из них, как убрать записи за период, настроить регулярную очистку и что делать, если удалили лишнее.
Независимый регистр или подчинённый регистратору
От вида регистра зависит всё остальное, поэтому начните с него. Вид виден в конфигураторе в свойстве Режим записи, а в пользовательском режиме — по поведению списка.
- 🧩 Независимый (
Режим записи = Независимый) — записи живут сами по себе, их можно создавать, менять и удалять напрямую. Примеры: курсы валют, настройки, соответствия значений. - 🔗 Подчинённый регистратору (
Режим записи = Подчинение регистратору) — каждая запись принадлежит документу-регистратору и появляется при его проведении. Удалить такую запись отдельно от документа нельзя.
Проверить прямо в базе просто: откройте список регистра (как — в следующих разделах). Если в командной панели есть кнопки создания и удаления строк, а колонки Регистратор нет — регистр независимый. Если строки показываются с документом-регистратором и вручную не удаляются — он подчинён регистратору.
Отдельно учтите периодичность. У независимого регистра она может быть Непериодический, В пределах секунды, День, Месяц и т.д. Периодичность влияет на отбор при частичной очистке, но не на сам способ удаления.
Подготовка: резервная копия и что проверить заранее
Очистка регистра — это удаление учётных данных. Восстановить их внутри программы потом нельзя, поэтому сначала страхуемся.
Как снять копию в пользовательском режиме: Главное меню → Файл → Сохранить копию в файловой базе или средствами СУБД — в клиент-серверной. В конфигураторе выгрузка через Администрирование → Выгрузить информационную базу создаёт файл .dt.
Отдельно подумайте о зависимостях. Многие регистры сведений питают отчёты, другие регистры и логику проведения документов. Если очистить, например, регистр с настройками учётной политики или соответствиями, перестанут корректно работать связанные механизмы. Чистите только тот регистр, назначение которого вам понятно.
Очистка независимого регистра через «Все функции»
Это основной способ для пользователя и администратора, когда доступа к конфигуратору нет, а регистр независимый и разрешает интерактивное редактирование.
- Включите команду «Все функции», если её нет:
Главное меню → Сервис → Параметры → Отображать команду "Все функции". - Откройте
Главное меню → Все функции → Регистры сведенийи выберите нужный регистр по имени. - В открывшемся списке выделите строки: одну, несколько с
Ctrl/Shiftили все сразу —Ctrl+A. - Нажмите
Deleteили команду удаления в командной панели списка. - Подтвердите удаление.
Если записей много, удаляйте их порциями: интерактивное удаление тысяч строк за один раз нагружает систему. Для больших объёмов надёжнее программный способ из следующего раздела.
Кнопки удаления в списке может не быть. Это значит, что регистр либо подчинён регистратору, либо в конфигурации запрещено его интерактивное редактирование. В первом случае чистите через документы, во втором — только программно.
Очистка набором записей: код для внешней обработки
Программный способ подходит для любого объёма и позволяет точно задать, что удалять. Код выполняют во внешней обработке с полем ввода кода или в консоли запросов/кода — у пользователя должны быть соответствующие права.
Полная очистка независимого регистра — запись пустого набора без отбора:
// Удалить ВСЕ записи независимого регистра
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Записать(); // по умолчанию Замещать = Истина
Набор без установленного отбора при записи с замещением полностью замещает содержимое регистра пустым набором — то есть очищает его целиком. Подставьте имя своего регистра вместо КурсыВалют.
Удаление части записей — по измерению:
// Удалить записи только по одной организации
НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Организация.Установить(ВыбраннаяОрганизация);
НаборЗаписей.Записать(); // замещает отобранный срез пустым набором
Отбор можно ставить по любому измерению регистра. Записывайте набор только с тем отбором, в котором уверены: запись без отбора сотрёт регистр целиком.
Монопольный доступ к базе для этой операции не нужен — запись набора записей это обычная работа с данными. Монополия требуется только при изменении структуры конфигурации, загрузке .dt, тестировании и исправлении базы.
Если сомневаетесь в коде — не запускайте его на рабочей базе. Сначала проверьте на копии: выгрузите базу, разверните её отдельно и выполните очистку там, убедившись, что удалилось ровно то, что нужно.
Периодические регистры: как удалить записи за период
У периодического регистра (В пределах секунды, День, Месяц и др.) каждая запись привязана к дате или моменту времени. Чистить его целиком — так же, как любой независимый. А вот чтобы убрать только старые данные, нужен отбор по периоду.
В пользовательском режиме проще всего отфильтровать список: откройте регистр через «Все функции», настройте отбор списка по колонке периода (например, «меньше начала текущего года»), выделите отобранное и удалите.
Программно для конкретного момента времени отбор ставится по точному значению:
НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ТочныйМоментЗаписи);
НаборЗаписей.Записать();
Для удаления диапазона дат одним отбором Установить не обойтись: он принимает одно значение. Нужные записи сначала выбирают запросом к регистру, а затем удаляют их наборами по ключевым полям в цикле. Поэтому для разовой очистки периода удобнее интерактивный фильтр списка, а для регулярной — регламентное задание (ниже).
Регистры, подчинённые регистратору: очистка через перепроведение
Записи такого регистра нельзя удалить отдельно от документа — они формируются при его проведении. Правильный путь — работать с самим документом.
- ↩️ Отмена проведения. В списке документов снимите проведение (
Ещё → Отменить проведениеили соответствующая кнопка). Движения документа по всем регистрам, включая этот, удалятся. - 🔄 Перепроведение. Если данные устарели из-за изменившихся настроек, перепроведите документы за период (
Операции → Групповое перепроведение документов, если такая обработка есть в конфигурации). Старые движения заменятся новыми.
Программно движения конкретного документа чистят отбором по регистратору:
НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Записать(); // удалит движения только этого документа
Удаляя движения напрямую, вы оставляете документ проведённым, но без движений — база станет противоречивой. Если цель не разовая техническая правка, а восстановление порядка, используйте отмену проведения или перепроведение, а не прямую очистку набора.
Регламентное задание для регулярной очистки
Когда регистр постоянно обрастает устаревшими записями (логи, временные данные, история обменов), очистку автоматизируют регламентным заданием, которое по расписанию удаляет старые строки.
Само задание с нужной логикой задаётся в конфигурации или в расширении — произвольный код «на лету» в пользовательском режиме создать нельзя. Разработчик помещает процедуру очистки в общий модуль и привязывает к предопределённому регламентному заданию, после чего администратор настраивает расписание.
Настройка расписания в пользовательском режиме:
- Откройте
Главное меню → Все функции → Стандартные → Управление регламентными и фоновыми заданиями. - Найдите нужное задание в списке.
- Откройте его, задайте расписание (периодичность, время) и включите флажок использования.
В клиент-серверной базе регламентные задания выполняются на сервере автоматически по расписанию. В файловой — только пока открыт сеанс, поэтому там регулярную очистку обычно запускают вручную или через отдельный фоновый сеанс.
В типовых конфигурациях часть служебных регистров уже чистится штатными регламентными заданиями (например, удаление устаревших данных, сжатие истории). Прежде чем писать своё, проверьте в списке заданий — возможно, нужное уже есть.
Восстановление данных после ошибочной очистки
Внутри программы отменить удаление записей регистра нельзя — кнопки «вернуть» нет. Поэтому стратегия восстановления зависит только от того, есть ли у вас копия и какой это был регистр.
- 💾 Есть резервная копия. Разверните копию в отдельную базу, выгрузите из неё нужные записи регистра (запросом или обработкой) и перенесите в рабочую. Либо, если после очистки других изменений не было, восстановите базу из копии целиком.
- 🔄 Регистр подчинён регистратору. Копия может не понадобиться: перепроведите документы за нужный период — движения по регистру сформируются заново из данных документов.
- 🧮 Регистр независимый, копии нет. Данные придётся восстанавливать вручную или из внешнего источника (выгрузки, обмены, отчёты, где эти значения сохранились). Автоматически они не вернутся.
Именно поэтому резервная копия перед очисткой — не формальность. Без копии удаление записей независимого регистра необратимо.
Частые вопросы
Можно ли очистить регистр сведений прямо в базе SQL?
Почему в списке регистра нет кнопки удаления?
Нужен ли монопольный доступ, чтобы очистить регистр?
Чем отличается очистка периодического регистра?
Delete либо запись пустого набора.