Удаление записей из регистра сведений: способы и риски
Содержание
Самый надёжный способ очистить регистр сведений
в 1С 8.3 — записать пустой набор записей средствами встроенного языка. Для независимого регистра это одна строка НаборЗаписей.Записать() без отбора, и таблица очищается целиком. Через интерфейс пользователя регистр сведений не чистят: кнопки «удалить всё» там нет, записи либо подчинены документу-регистратору, либо заполняются обработками.
Ниже — рабочие варианты: штатный код, внешние обработки, прямой запрос к СУБД и разбор, чем они отличаются в файловой и клиент-серверной базе. Сразу оговорюсь: прямое удаление из регистра сведений необратимо, движения документов и остатки по ним не восстановятся автоматически. Перед любой массовой очисткой делайте резервную копию базы .
Как устроен регистр сведений и почему это важно для очистки
Регистр сведений хранит данные в таблице с измерениями, ресурсами и реквизитами. От того, как он объявлен в конфигурации, зависит способ удаления.
- 🔹 Независимый регистр (режим записи «Независимый») — записи живут сами по себе, их пишут обработки или код. Очищается произвольно: весь регистр или по отбору измерений.
- 🔹 Подчинённый регистратору (режим записи «Подчинение регистратору») — каждая запись привязана к документу. Удалить её напрямую нельзя: она уходит вместе с движениями документа.
Посмотреть режим можно в конфигураторе: Общие → Регистры сведений → <ваш регистр> → свойство «Режим записи». Либо по наличию стандартного реквизита Регистратор — если он есть, регистр подчинённый.
Для подчинённого регистра чаще правильнее не чистить его напрямую, а отменить проведение или пометить на удаление сами документы — тогда платформа сама уберёт их движения и сохранит согласованность данных.
Штатная очистка через набор записей (встроенный язык)
Это основной и безопасный метод. Он работает одинаково в файловой и клиент-серверной базе и не ломает внутренние структуры платформы.
Полная очистка независимого регистра. Создаём пустой набор записей и записываем его без отбора — замещение по умолчанию включено, поэтому вся таблица обнуляется:
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Записать(); // пустой набор без отбора замещает всю таблицу регистра
Удаление по отбору. Если нужно убрать записи только по одному значению измерения, задаём отбор перед записью:
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(ВыбраннаяНоменклатура);
НаборЗаписей.Записать(); // удалит записи только по этой номенклатуре
Подчинённый регистратору. Отбор задаётся по Регистратор. Чтобы снять движения одного документа:
НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НаборЗаписей.Записать();
Чтобы очистить подчинённый регистр целиком, перебираем все документы-регистраторы и чистим по каждому:
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ Регистратор
|ИЗ РегистрСведений.ШтрихкодыНоменклатуры");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Записать();
КонецЦикла;
Выполнить такой код можно в консоли кода (внешней обработке «Исполнение произвольного кода»), в модуле обработки на сервере или в обработчике события. ⚠️ Запускать очистку лучше в монопольном режиме или когда с базой не работают пользователи — иначе параллельная запись в тот же регистр даст блокировки.
Два момента, из-за которых код часто ведёт себя «не так»:
- 🔸 Замещение включено по умолчанию. Метод
Записать()без параметра работает какЗаписать(Истина)— он замещает все записи по текущему отбору. Если передатьЗаписать(Ложь), набор добавится к существующим, и очистки не произойдёт. Для удаления параметр всегда оставляйте по умолчанию илиИстина. - 🔸 Отбор сужает область записи. Платформа замещает только те строки, что попадают под установленный отбор. Чем шире отбор, тем больше удалится; пустой отбор у независимого регистра означает «вся таблица».
Проверить результат удобно до и после — одним запросом с КОЛИЧЕСТВО(*) по тому же регистру. Если число до операции и после совпало, запись не затронула нужные строки — почти всегда дело в отборе или в подчинении регистратору.
Очистка через внешние обработки и консоли
Писать код вручную каждый раз необязательно — под задачу есть готовые инструменты.
- 🛠 Консоль запросов — только читает данные, удалять ею нельзя. Годится, чтобы заранее оценить объём: сколько записей и по каким измерениям лежит в регистре.
- 🛠 Обработки удаления/замещения записей — внешние обработки
.epf, где вы выбираете регистр из списка метаданных и отбор, а удаление выполняется тем же набором записей под капотом. Удобны, когда нужно почистить несколько регистров подряд без правки кода. - 🛠 Групповое перепроведение/отмена проведения документов (
Все функции → Стандартные → Проведение документов) — косвенный способ очистить подчинённые регистры: снимаете проведение у пачки документов, их движения уходят.
Открыть список стандартных обработок: Главное меню → Все функции → Стандартные. Если пункта «Все функции» нет, включите его в Сервис → Параметры → флажок отображения команды «Все функции».
Чтобы не ошибиться с методом, пройдите по короткой развилке.
НаборЗаписей.Записать(). Одна операция очищает таблицу целиком.Отбор по измерению. Удалятся только попавшие под отбор.Регистратор.Прямое удаление записей через SQL-запрос к СУБД
Иногда регистр настолько велик, что штатная запись набора идёт часами. Тогда администраторы обращаются к таблице напрямую через DELETE в СУБД. Это крайняя мера.
Имя физической таблицы в базе не совпадает с именем регистра — платформа хранит их под служебными именами вроде _InfoRg1234. Получить соответствие можно встроенной функцией прямо из 1С:
Структура = ПолучитьСтруктуруХраненияБазыДанных();
// в колонке ИмяТаблицыХранения — физическое имя таблицы регистра в СУБД
Дальше в SQL Server Management Studio или в консоли PostgreSQL выполняется DELETE FROM или TRUNCATE TABLE по найденному имени.
Прямое изменение таблиц 1С в СУБД не поддерживается фирмой 1С и снимает гарантию корректной работы. Платформа кеширует данные, хранит у регистров служебные поля и версии — после ручного DELETE возможны расхождения, пока не перезапустите рабочие процессы и не сбросите кеш сеансов.
Если всё же идёте этим путём — соблюдайте порядок, который убережёт от потери базы:
В файловой базе прямого SQL нет: данные лежат в закрытом формате 1Cv8.1CD, стандартных средств правки таблиц там не предусмотрено. Для файлового варианта остаётся штатный набор записей из встроенного языка.
Чем отличается очистка в файловой и клиент-серверной базе
Логика встроенного языка одинакова, но поведение «под капотом» и доступные инструменты различаются.
| Что сравниваем | Файловый вариант | Клиент-серверный вариант |
|---|---|---|
| Хранилище | один файл 1Cv8.1CD | таблицы в MS SQL / PostgreSQL |
| Набор записей (код) | работает штатно | работает штатно |
Прямой DELETE в СУБД | недоступен | доступен (на свой риск) |
| Монопольный режим | ставится через «Тестирование и исправление» или запуск с параметром | через консоль кластера (сеансы, блокировка регламентных заданий) |
| Большие объёмы | медленнее, файл может заметно вырасти | быстрее, есть TRUNCATE |
После массового удаления в файловой базе размер 1Cv8.1CD сам не уменьшится. Чтобы файл «сжался», выполните Администрирование → Тестирование и исправление с реструктуризацией. В клиент-серверной базе место освобождает обслуживание средствами самой СУБД.
Диагностика: почему записи не удаляются и как это проверить
Если после записи набора данные остались на месте — ищите причину по шагам.
- 🔸 Отбор был задан не по тому измерению. Если установить отбор по полю, которого нет в ключе, платформа может записать набор мимо нужных строк. Сверьте имена измерений в конфигураторе.
- 🔸 Регистр подчинён регистратору. Пустая запись без отбора по
Регистратордля такого регистра не очистит всё — нужен перебор регистраторов (код выше). - 🔸 Транзакция откатилась. Ошибка в обработчике
ПередЗаписью/ПриЗаписимодуля набора записей отменяет всю операцию. Смотрите текст ошибки. - 🔸 Блокировка другим сеансом. Если регистр в этот момент пишет другой пользователь или фоновое задание, запись встанет в ожидание или упадёт по таймауту.
Основной источник фактов — журнал регистрации: Администрирование → Журнал регистрации (в технической конфигурации — через конфигуратор). Отфильтруйте по вашему сеансу и времени запуска, ищите события ошибок записи.
Для глубокого разбора блокировок и таймаутов в клиент-серверной базе подключают технологический журнал (logcfg.xml в каталоге conf сервера). Он фиксирует события транзакций и взаимоблокировок. Включайте его точечно под конкретный диагностический прогон — журнал пишет много и быстро растёт.
Отдельная частая ситуация — очистка «зависает» на большом регистре. Запись набора идёт в одной транзакции, и чем больше строк, тем дольше удержание блокировки и выше риск её эскалации на всю таблицу. Разбивайте массовую очистку на порции: отбирайте запросом ключи партиями по несколько тысяч и пишите пустые наборы по каждой партии. Так транзакции короткие, а другие сеансы меньше ждут.
Автоматизация: регулярная очистка регламентным заданием
Если регистр служит кешем или временным хранилищем и его нужно периодически обнулять, вынесите очистку в регламентное задание.
- В конфигураторе создайте регламентное задание и свяжите его с процедурой общего модуля (
Повторное использование — Не используется, выполнение на сервере). - В процедуре выполните запись пустого набора записей — тот же код, что и для ручной очистки.
- Задайте расписание: ночью или в окно наименьшей нагрузки, чтобы не пересекаться с работой пользователей.
Процедура ОчиститьВременныйРегистр() Экспорт
Набор = РегистрыСведений.ВременныеДанные.СоздатьНаборЗаписей();
Набор.Записать();
ЗаписьЖурналаРегистрации("Обслуживание.ОчисткаРегистра",
УровеньЖурналаРегистрации.Информация, , , "Регистр очищен по расписанию");
КонецПроцедуры
В клиент-серверной базе управляйте такими заданиями через консоль кластера: там видно, что задание отработало, и можно временно заблокировать регламентные задания на время обслуживания. В файловой базе регламентное задание выполняется только при запущенном сеансе, поэтому для фоновой чистки обычно поднимают отдельную сессию или переносят логику в клиент-серверный вариант.
Для очистки «старше N дней» не удаляйте всё подряд: сначала запросом отберите устаревшие строки по дате, а затем пишите пустые наборы по этим ключам. Так регламентное задание не тронет актуальные данные.
Частые вопросы
Можно ли очистить регистр сведений в режиме 1С:Предприятие, без конфигуратора?
Удаление записи из регистра можно отменить?
DELETE необратимы. Вернуть данные можно только из резервной копии, поэтому её делают до операции.Почему пустая запись не очищает подчинённый регистратору регистр целиком?
Регистратор платформа не знает, чьи движения замещать. Нужен перебор всех регистраторов в цикле.Безопасно ли чистить регистр через DELETE в SQL?
Уменьшится ли размер базы после очистки?
1Cv8.1CD сожмётся только после тестирования и исправления с реструктуризацией.