Удаление записей из регистра сведений в 1С 8.3

· 9 мин

Содержание

Очистить регистр сведений в 1С 8.3 можно тремя способами. Если регистр независимый — удалить записи прямо в его списке (когда разрешено редактирование) или программно пустым набором записей. Если регистр подчинён регистратору — отменить проведение документов, которые его заполнили: записи уйдут вместе с движениями.

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

Какие бывают регистры сведений и что это меняет

От вида регистра зависит способ удаления. Путать их — главная причина, почему «записи не удаляются» или появляются снова.

  • 📄 Независимый регистр — записи вводятся вручную или кодом, напрямую. Пример: КурсыВалют, прайс-листы, настройки по организациям. Такой регистр можно редактировать как справочник.
  • 🔗 Регистр, подчинённый регистратору — записи создаёт документ при проведении. Удалить их отдельно нельзя: они живут и умирают вместе с движениями документа.
  • 🕒 Периодический регистр — у записи есть поле Период (или привязка к регистратору). Периодичность влияет на отбор, но не на способ удаления.

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

Служебные регистры (кэш, обмен данными, версионирование) обычно не показаны в интерфейсе. К ним добираются через Главное меню → Все функции → Регистры сведений.

Как открыть регистр через «Все функции»

Если нужного регистра нет в разделах программы, включите команду «Все функции»:

  1. Нажмите кнопку главного меню — стрелка вниз в левом верхнем углу (интерфейс «Такси»).
  2. Откройте Настройки → Параметры.
  3. Поставьте галочку Отображать команду «Все функции» и нажмите ОК.
  4. Теперь Главное меню → Все функции → Регистры сведений покажет полный список.

Этот путь работает в типовых конфигурациях на платформе 8.3 с интерфейсом «Такси». Для открытия регистров прав обычного пользователя обычно недостаточно — нужны административные.

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

Самый простой способ — для независимого регистра, у которого в конфигурации разрешено редактирование.

  1. Откройте список регистра (из раздела программы или через Все функции).
  2. Выделите строки: одну — мышью, несколько — с зажатым Ctrl, весь диапазон — Shift.
  3. Нажмите клавишу Delete или команду удаления в командной панели списка.
  4. Подтвердите удаление.

Если строки не выделяются и кнопки удаления нет, значит для этого регистра не включено интерактивное редактирование (свойство задаётся в Конфигураторе). Тогда остаётся программный способ.

Ручное удаление подходит, когда записей немного — десятки, максимум сотни. Чистить так регистр на миллионы строк бессмысленно: это долго и даёт нагрузку на блокировки. К тому же удалять строки по одной утомительно и легко ошибиться — снести нужные записи вместе с лишними. Для больших объёмов и для регулярной очистки переходите к программному способу: там отбор задаётся точно и повторяемо.

Если в списке есть колонка Регистратор, вручную строки удалить не выйдет — они защищены документом. Переходите к следующему способу.

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

Записи, подчинённые регистратору, очищаются не из регистра, а со стороны документа. Отмените проведение — движения по всем регистрам (и сведений, и накопления) исчезнут.

  1. Откройте список документов нужного вида.
  2. Выделите документы, движения которых надо убрать.
  3. В контекстном меню или в меню Ещё выберите команду отмены проведения.
  4. Документ останется в базе, но его записи во всех регистрах будут удалены.

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

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

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

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

Универсальный способ для больших объёмов и служебных регистров — код во внешней обработке. Работает с любым видом регистра.

Ключевая идея: пустой набор записей, записанный с отбором, удаляет записи по этому отбору. Для независимого регистра отбор ставят по измерениям, для подчинённого — по регистратору.

Очистить весь независимый регистр (пример на КурсыВалют, у него одно измерение Валюта):

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|   Курсы.Валюта КАК Валюта
|ИЗ
|   РегистрСведений.КурсыВалют КАК Курсы";

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

Подставьте имя своего регистра и его измерения. Если измерений несколько, в отбор ставят каждое — именно поэтому сначала запросом выбирают РАЗЛИЧНЫЕ комбинации измерений, а потом очищают их по одной.

Удалить записи одного регистратора (подчинённый регистр):

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

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

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|   Т.Организация КАК Организация,
|   Т.Номенклатура КАК Номенклатура
|ИЗ
|   РегистрСведений.ИмяРегистра КАК Т";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
    Набор.Отбор.Организация.Установить(Выборка.Организация);
    Набор.Отбор.Номенклатура.Установить(Выборка.Номенклатура);
    Набор.Записать();
КонецЦикла;

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

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

Прямое удаление строк в таблицах SQL на уровне СУБД делать нельзя: 1С это не поддерживает, нарушается целостность базы, а при обновлении структуры данные могут «поехать». Все операции только через объектную модель — набор записей.

Почему консоль запросов не чистит регистр

Распространённое заблуждение: «удалю записи через консоль запросов». Язык запросов 1С умеет только читать данные — операторов УДАЛИТЬ или ОЧИСТИТЬ в нём нет. Консоль запросов покажет, что лежит в регистре, но ничего не сотрёт.

Поэтому связка такая:

  • Консоль запросов — чтобы найти и оценить, что удалять: сколько записей, по каким измерениям, за какой период.
  • Консоль кода (внешняя обработка) — чтобы выполнить само удаление набором записей.

Консоль кода берут из набора инструментов разработчика (внешние обработки на диске ИТС). Если готового инструмента нет, достаточно создать внешнюю обработку с модулем и вставить в неё код из примеров выше.

Что проверить после очистки регистра

Удаление записей из регистра сведений может задеть то, что от них зависит. Проверьте после очистки:

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

Если вы удаляли записи подчинённого регистра минуя документ (кодом по отбору на регистратор, не отменяя проведение), документ будет считать себя проведённым, а движений не будет. Такой разнобой лечится перепроведением документа. Чтобы его не было, подчинённые регистры всегда чистят через отмену проведения, а не напрямую.

Для контроля целостности в монопольном режиме выполняют тестирование и исправление информационной базы. Монопольный доступ нужен именно для этой операции, а не для самого удаления записей.

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

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

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

Чаще всего «очистить регистр » хотят из-за того, что он распух и тормозит базу. Разрастаются обычно служебные регистры:

  • 🗂 Версионирование объектов — хранит историю изменений. На активных базах это нередко самая тяжёлая таблица, от нескольких до десятков гигабайт. Глубину хранения версий настраивают в разделе администрирования (версионирование / история изменений).
  • 🔄 Регистры обмена данными — накапливают изменения для узлов РИБ и синхронизаций. Если узел отключён, а регистрация изменений по нему продолжает копиться, таблица растёт без пользы. Чистятся, когда обмен давно не выполняется или узел выведен.
  • ⚡ Регистры кэша и служебных данных — заполняются автоматически в фоне, их можно периодически очищать своей обработкой без риска для учётных данных.

Чтобы не чистить вручную раз в полгода:

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

Частые ошибки при очистке регистров

  • ❌ Снял проведение — думал, записи ушли навсегда. Перепроведение документа вернёт их. Для окончательной очистки документ не проводят или помечают на удаление.
  • ❌ Удалил записи подчинённого регистра кодом, не трогая документ. Регистр и документ рассинхронизированы. Правильно — отмена проведения.
  • ❌ Пустой набор записан без отбора. Для подчинённого регистра Записать() без отбора по регистратору ничего корректно не почистит. Отбор обязателен.
  • ❌ Чистка на рабочей базе в разгар дня. Длинная операция вешает блокировки и обрывает работу пользователей. Делайте в окно, когда никто не работает .
  • ❌ Нет резервной копии. Записи регистра восстановить штатно нельзя — только из бэкапа.
Какой у вас регистр и как его чистить?

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

Можно ли восстановить удалённые записи регистра сведений?
Штатными средствами — нет. Удаление необратимо. Вернуть данные можно только из резервной копии базы, сделанной до очистки. Поэтому бэкап обязателен.
Нужен ли монопольный режим, чтобы очистить регистр?
Для самого удаления — нет, записи стираются и в обычном режиме. Монопольный доступ желателен, чтобы пользователи не вносили новые записи во время чистки, и обязателен для последующего тестирования и исправления базы.
Почему записи появляются снова после удаления?
Вы чистили регистр, подчинённый регистратору, но документ остался проведённым. Любое перепроведение восстанавливает движения. Отмените проведение документа или пометьте его на удаление.
Чем удаление записей отличается от пометки на удаление?
Пометка на удаление — для объектов (документов, элементов справочников). Записи регистра сведений на удаление не помечаются: они удаляются сразу, по отбору набора записей или вместе с движениями документа.
Можно ли очистить регистр запросом в консоли запросов?
Нет. Язык запросов 1С работает только на чтение. Консоль запросов покажет содержимое регистра, но для удаления нужен код — консоль кода или внешняя обработка с набором записей.