Удаление записей из регистра сведений в 1С 8.3
Содержание
Очистить регистр сведений в 1С 8.3 можно тремя способами. Если регистр независимый — удалить записи прямо в его списке (когда разрешено редактирование) или программно пустым набором записей. Если регистр подчинён регистратору — отменить проведение документов, которые его заполнили: записи уйдут вместе с движениями.
Перед любым удалением из регистра сведений сделайте резервную копию и, по возможности, выполняйте операцию, когда в базе нет пользователей. Удаление записей необратимо, а восстановить их штатными средствами не получится. Ниже разберём каждый метод, когда он применим и что проверить после очистки.
Какие бывают регистры сведений и что это меняет
От вида регистра зависит способ удаления. Путать их — главная причина, почему «записи не удаляются» или появляются снова.
- 📄 Независимый регистр — записи вводятся вручную или кодом, напрямую. Пример:
КурсыВалют, прайс-листы, настройки по организациям. Такой регистр можно редактировать как справочник. - 🔗 Регистр, подчинённый регистратору — записи создаёт документ при проведении. Удалить их отдельно нельзя: они живут и умирают вместе с движениями документа.
- 🕒 Периодический регистр — у записи есть поле
Период(или привязка к регистратору). Периодичность влияет на отбор, но не на способ удаления.
Как определить вид, не заходя в Конфигуратор: откройте форму списка регистра. Если видите колонку Регистратор — регистр подчинён документам. Если её нет, а строки можно добавлять кнопкой — регистр независимый.
Служебные регистры (кэш, обмен данными, версионирование) обычно не показаны в интерфейсе. К ним добираются через Главное меню → Все функции → Регистры сведений.
Как открыть регистр через «Все функции»
Если нужного регистра нет в разделах программы, включите команду «Все функции»:
- Нажмите кнопку главного меню — стрелка вниз в левом верхнем углу (интерфейс «Такси»).
- Откройте
Настройки → Параметры. - Поставьте галочку Отображать команду «Все функции» и нажмите
ОК. - Теперь
Главное меню → Все функции → Регистры сведенийпокажет полный список.
Этот путь работает в типовых конфигурациях на платформе 8.3 с интерфейсом «Такси». Для открытия регистров прав обычного пользователя обычно недостаточно — нужны административные.
Удаление записей вручную в списке регистра
Самый простой способ — для независимого регистра, у которого в конфигурации разрешено редактирование.
- Откройте список регистра (из раздела программы или через
Все функции). - Выделите строки: одну — мышью, несколько — с зажатым
Ctrl, весь диапазон —Shift. - Нажмите клавишу
Deleteили команду удаления в командной панели списка. - Подтвердите удаление.
Если строки не выделяются и кнопки удаления нет, значит для этого регистра не включено интерактивное редактирование (свойство задаётся в Конфигураторе). Тогда остаётся программный способ.
Ручное удаление подходит, когда записей немного — десятки, максимум сотни. Чистить так регистр на миллионы строк бессмысленно: это долго и даёт нагрузку на блокировки. К тому же удалять строки по одной утомительно и легко ошибиться — снести нужные записи вместе с лишними. Для больших объёмов и для регулярной очистки переходите к программному способу: там отбор задаётся точно и повторяемо.
Если в списке есть колонка Регистратор, вручную строки удалить не выйдет — они защищены документом. Переходите к следующему способу.
Очистка через отмену проведения документов
Записи, подчинённые регистратору, очищаются не из регистра, а со стороны документа. Отмените проведение — движения по всем регистрам (и сведений, и накопления) исчезнут.
- Откройте список документов нужного вида.
- Выделите документы, движения которых надо убрать.
- В контекстном меню или в меню
Ещёвыберите команду отмены проведения. - Документ останется в базе, но его записи во всех регистрах будут удалены.
Чтобы убрать движения массово по периоду, удобнее групповая обработка документов: отбираете документы по виду и датам и снимаете проведение разом. В типовых конфигурациях такая обработка вызывается из раздела администрирования или через Все функции → Обработки. Она пройдёт по выбранным документам и очистит их движения во всех регистрах сразу — это быстрее, чем открывать каждый документ вручную.
Групповую отмену проведения тоже лучше делать, когда пользователи не работают: пока обработка идёт по сотням документов, затронутые регистры заблокированы, и чужие операции с ними встанут в очередь.
Повторное проведение документа вернёт записи обратно. Если задача — очистить регистр насовсем, документы придётся либо не проводить, либо пометить на удаление. Просто снять проведение недостаточно: любой пользователь может перепровести документ и наполнить регистр снова.
Программная очистка набором записей
Универсальный способ для больших объёмов и служебных регистров — код во внешней обработке. Работает с любым видом регистра.
Ключевая идея: пустой набор записей, записанный с отбором, удаляет записи по этому отбору. Для независимого регистра отбор ставят по измерениям, для подчинённого — по регистратору.
Очистить весь независимый регистр (пример на КурсыВалют, у него одно измерение Валюта):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Курсы.Валюта КАК Валюта
|ИЗ
| РегистрСведений.КурсыВалют КАК Курсы";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
Набор.Отбор.Валюта.Установить(Выборка.Валюта);
Набор.Записать(); // набор пустой, записи по отбору удаляются
КонецЦикла;
Подставьте имя своего регистра и его измерения. Если измерений несколько, в отбор ставят каждое — именно поэтому сначала запросом выбирают РАЗЛИЧНЫЕ комбинации измерений, а потом очищают их по одной.
Удалить записи одного регистратора (подчинённый регистр):
Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Записать();
Метод Записать() без параметров замещает прежние записи по отбору. Набор пустой — значит старые записи стираются, а новых нет. Это и есть удаление.
Когда измерений несколько, отбор ставят по всем сразу. Запрос выбирает уникальные комбинации, цикл очищает их по одной:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Организация КАК Организация,
| Т.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ИмяРегистра КАК Т";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.Организация.Установить(Выборка.Организация);
Набор.Отбор.Номенклатура.Установить(Выборка.Номенклатура);
Набор.Записать();
КонецЦикла;
Если нужно удалить не весь регистр, а записи старше определённой даты (периодический регистр), добавьте в запрос условие по полю Период и отбирайте вместе с измерениями только устаревшие строки. Так чистят, например, накопившуюся за годы историю, оставляя свежие записи.
Код выполняют не в консоли запросов, а в консоли кода или внешней обработке. Запускайте очистку порциями, если строк миллионы: собирайте по несколько сотен наборов, оборачивайте их в НачатьТранзакцию() / ЗафиксироватьТранзакцию() и фиксируйте группами. Так вы не разрастите журнал транзакций и не упрётесь в длительные блокировки.
Прямое удаление строк в таблицах SQL на уровне СУБД делать нельзя: 1С это не поддерживает, нарушается целостность базы, а при обновлении структуры данные могут «поехать». Все операции только через объектную модель — набор записей.
Почему консоль запросов не чистит регистр
Распространённое заблуждение: «удалю записи через консоль запросов». Язык запросов 1С умеет только читать данные — операторов УДАЛИТЬ или ОЧИСТИТЬ в нём нет. Консоль запросов покажет, что лежит в регистре, но ничего не сотрёт.
Поэтому связка такая:
- Консоль запросов — чтобы найти и оценить, что удалять: сколько записей, по каким измерениям, за какой период.
- Консоль кода (внешняя обработка) — чтобы выполнить само удаление набором записей.
Консоль кода берут из набора инструментов разработчика (внешние обработки на диске ИТС). Если готового инструмента нет, достаточно создать внешнюю обработку с модулем и вставить в неё код из примеров выше.
Что проверить после очистки регистра
Удаление записей из регистра сведений может задеть то, что от них зависит. Проверьте после очистки:
| Что смотреть | Зачем |
|---|---|
| Отчёты и формы, читающие регистр | Не опустели ли данные там, где они нужны |
| Документы-регистраторы | Если чистили подчинённый регистр напрямую — документ и регистр рассинхронизированы |
| Остатки и взаиморасчёты | Если регистр влиял на расчёты (например, цены, настройки учёта) |
| Тестирование и исправление базы | После массового удаления — на предмет битых ссылок |
Если вы удаляли записи подчинённого регистра минуя документ (кодом по отбору на регистратор, не отменяя проведение), документ будет считать себя проведённым, а движений не будет. Такой разнобой лечится перепроведением документа. Чтобы его не было, подчинённые регистры всегда чистят через отмену проведения, а не напрямую.
Для контроля целостности в монопольном режиме выполняют тестирование и исправление информационной базы. Монопольный доступ нужен именно для этой операции, а не для самого удаления записей.
Отдельно оцените нагрузку на зависимые механизмы. Если регистр участвовал в автоподстановке значений (цены, скидки, настройки по контрагентам), после очистки новые документы начнут заполняться пустыми данными — пользователи увидят это сразу. Поэтому перед массовой чисткой независимого регистра стоит убедиться, что данные там действительно устарели, а не используются в ежедневной работе.
Хороший приём — прогнать очистку сначала на копии рабочей базы. Разверните свежий бэкап в отдельную базу, выполните код, откройте ключевые отчёты и документы. Если всё корректно, повторите на рабочей базе в окно без пользователей.
Как не допустить разрастания регистров сведений
Чаще всего «очистить регистр » хотят из-за того, что он распух и тормозит базу. Разрастаются обычно служебные регистры:
- 🗂 Версионирование объектов — хранит историю изменений. На активных базах это нередко самая тяжёлая таблица, от нескольких до десятков гигабайт. Глубину хранения версий настраивают в разделе администрирования (версионирование / история изменений).
- 🔄 Регистры обмена данными — накапливают изменения для узлов РИБ и синхронизаций. Если узел отключён, а регистрация изменений по нему продолжает копиться, таблица растёт без пользы. Чистятся, когда обмен давно не выполняется или узел выведен.
- ⚡ Регистры кэша и служебных данных — заполняются автоматически в фоне, их можно периодически очищать своей обработкой без риска для учётных данных.
Чтобы не чистить вручную раз в полгода:
- настройте регламентное задание, которое удаляет устаревшие записи по своему алгоритму;
- ограничьте срок хранения версий и истории изменений;
- отключите версионирование для объектов, где оно не нужно;
- следите за размером базы — рост на десятки гигабайт часто даёт именно история и обмены.
Частые ошибки при очистке регистров
- ❌ Снял проведение — думал, записи ушли навсегда. Перепроведение документа вернёт их. Для окончательной очистки документ не проводят или помечают на удаление.
- ❌ Удалил записи подчинённого регистра кодом, не трогая документ. Регистр и документ рассинхронизированы. Правильно — отмена проведения.
- ❌ Пустой набор записан без отбора. Для подчинённого регистра
Записать()без отбора по регистратору ничего корректно не почистит. Отбор обязателен. - ❌ Чистка на рабочей базе в разгар дня. Длинная операция вешает блокировки и обрывает работу пользователей. Делайте в окно, когда никто не работает .
- ❌ Нет резервной копии. Записи регистра восстановить штатно нельзя — только из бэкапа.