Удаление записей из регистра сведений: способы и риски

· 9 мин

Содержание

Самый надёжный способ очистить регистр сведений в 1С 8.3 — записать пустой набор записей средствами встроенного языка. Для независимого регистра это одна строка НаборЗаписей.Записать() без отбора, и таблица очищается целиком. Через интерфейс пользователя регистр сведений не чистят: кнопки «удалить всё» там нет, записи либо подчинены документу-регистратору, либо заполняются обработками.

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

Как устроен регистр сведений и почему это важно для очистки

Регистр сведений хранит данные в таблице с измерениями, ресурсами и реквизитами. От того, как он объявлен в конфигурации, зависит способ удаления.

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

Посмотреть режим можно в конфигураторе: Общие → Регистры сведений → <ваш регистр> → свойство «Режим записи». Либо по наличию стандартного реквизита Регистратор — если он есть, регистр подчинённый.

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

Штатная очистка через набор записей (встроенный язык)

Это основной и безопасный метод. Он работает одинаково в файловой и клиент-серверной базе и не ломает внутренние структуры платформы.

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

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

Удаление по отбору. Если нужно убрать записи только по одному значению измерения, задаём отбор перед записью:

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

Подчинённый регистратору. Отбор задаётся по Регистратор. Чтобы снять движения одного документа:

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

Чтобы очистить подчинённый регистр целиком, перебираем все документы-регистраторы и чистим по каждому:

Запрос = Новый Запрос(
    "ВЫБРАТЬ РАЗЛИЧНЫЕ Регистратор
    |ИЗ РегистрСведений.ШтрихкодыНоменклатуры");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
    Набор.Записать();
КонецЦикла;

Выполнить такой код можно в консоли кода (внешней обработке «Исполнение произвольного кода»), в модуле обработки на сервере или в обработчике события. ⚠️ Запускать очистку лучше в монопольном режиме или когда с базой не работают пользователи — иначе параллельная запись в тот же регистр даст блокировки.

Два момента, из-за которых код часто ведёт себя «не так»:

  • 🔸 Замещение включено по умолчанию. Метод Записать() без параметра работает как Записать(Истина) — он замещает все записи по текущему отбору. Если передать Записать(Ложь), набор добавится к существующим, и очистки не произойдёт. Для удаления параметр всегда оставляйте по умолчанию или Истина.
  • 🔸 Отбор сужает область записи. Платформа замещает только те строки, что попадают под установленный отбор. Чем шире отбор, тем больше удалится; пустой отбор у независимого регистра означает «вся таблица».

Проверить результат удобно до и после — одним запросом с КОЛИЧЕСТВО(*) по тому же регистру. Если число до операции и после совпало, запись не затронула нужные строки — почти всегда дело в отборе или в подчинении регистратору.

Очистка через внешние обработки и консоли

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

  • 🛠 Консоль запросов — только читает данные, удалять ею нельзя. Годится, чтобы заранее оценить объём: сколько записей и по каким измерениям лежит в регистре.
  • 🛠 Обработки удаления/замещения записей — внешние обработки .epf, где вы выбираете регистр из списка метаданных и отбор, а удаление выполняется тем же набором записей под капотом. Удобны, когда нужно почистить несколько регистров подряд без правки кода.
  • 🛠 Групповое перепроведение/отмена проведения документов (Все функции → Стандартные → Проведение документов) — косвенный способ очистить подчинённые регистры: снимаете проведение у пачки документов, их движения уходят.

Открыть список стандартных обработок: Главное меню → Все функции → Стандартные. Если пункта «Все функции» нет, включите его в Сервис → Параметры → флажок отображения команды «Все функции».

Чтобы не ошибиться с методом, пройдите по короткой развилке.

Какой у вас регистр и что нужно удалить?

Прямое удаление записей через SQL-запрос к СУБД

Иногда регистр настолько велик, что штатная запись набора идёт часами. Тогда администраторы обращаются к таблице напрямую через DELETE в СУБД. Это крайняя мера.

Имя физической таблицы в базе не совпадает с именем регистра — платформа хранит их под служебными именами вроде _InfoRg1234. Получить соответствие можно встроенной функцией прямо из 1С:

Структура = ПолучитьСтруктуруХраненияБазыДанных();
// в колонке ИмяТаблицыХранения — физическое имя таблицы регистра в СУБД

Дальше в SQL Server Management Studio или в консоли PostgreSQL выполняется DELETE FROM или TRUNCATE TABLE по найденному имени.

Прямое изменение таблиц 1С в СУБД не поддерживается фирмой 1С и снимает гарантию корректной работы. Платформа кеширует данные, хранит у регистров служебные поля и версии — после ручного DELETE возможны расхождения, пока не перезапустите рабочие процессы и не сбросите кеш сеансов.

Если всё же идёте этим путём — соблюдайте порядок, который убережёт от потери базы:

Прямое удаление через SQL — чек-лист безопасности
Выполнено: 0 / 5

В файловой базе прямого SQL нет: данные лежат в закрытом формате 1Cv8.1CD, стандартных средств правки таблиц там не предусмотрено. Для файлового варианта остаётся штатный набор записей из встроенного языка.

Чем отличается очистка в файловой и клиент-серверной базе

Логика встроенного языка одинакова, но поведение «под капотом» и доступные инструменты различаются.

Что сравниваемФайловый вариантКлиент-серверный вариант
Хранилищеодин файл 1Cv8.1CDтаблицы в MS SQL / PostgreSQL
Набор записей (код)работает штатноработает штатно
Прямой DELETE в СУБДнедоступендоступен (на свой риск)
Монопольный режимставится через «Тестирование и исправление» или запуск с параметромчерез консоль кластера (сеансы, блокировка регламентных заданий)
Большие объёмымедленнее, файл может заметно вырастибыстрее, есть TRUNCATE

После массового удаления в файловой базе размер 1Cv8.1CD сам не уменьшится. Чтобы файл «сжался», выполните Администрирование → Тестирование и исправление с реструктуризацией. В клиент-серверной базе место освобождает обслуживание средствами самой СУБД.

Диагностика: почему записи не удаляются и как это проверить

Если после записи набора данные остались на месте — ищите причину по шагам.

  • 🔸 Отбор был задан не по тому измерению. Если установить отбор по полю, которого нет в ключе, платформа может записать набор мимо нужных строк. Сверьте имена измерений в конфигураторе.
  • 🔸 Регистр подчинён регистратору. Пустая запись без отбора по Регистратор для такого регистра не очистит всё — нужен перебор регистраторов (код выше).
  • 🔸 Транзакция откатилась. Ошибка в обработчике ПередЗаписью/ПриЗаписи модуля набора записей отменяет всю операцию. Смотрите текст ошибки.
  • 🔸 Блокировка другим сеансом. Если регистр в этот момент пишет другой пользователь или фоновое задание, запись встанет в ожидание или упадёт по таймауту.

Основной источник фактов — журнал регистрации: Администрирование → Журнал регистрации (в технической конфигурации — через конфигуратор). Отфильтруйте по вашему сеансу и времени запуска, ищите события ошибок записи.

Для глубокого разбора блокировок и таймаутов в клиент-серверной базе подключают технологический журнал (logcfg.xml в каталоге conf сервера). Он фиксирует события транзакций и взаимоблокировок. Включайте его точечно под конкретный диагностический прогон — журнал пишет много и быстро растёт.

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

Диагностика: выберите симптом

Автоматизация: регулярная очистка регламентным заданием

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

  1. В конфигураторе создайте регламентное задание и свяжите его с процедурой общего модуля (Повторное использование — Не используется, выполнение на сервере).
  2. В процедуре выполните запись пустого набора записей — тот же код, что и для ручной очистки.
  3. Задайте расписание: ночью или в окно наименьшей нагрузки, чтобы не пересекаться с работой пользователей.
Процедура ОчиститьВременныйРегистр() Экспорт
    Набор = РегистрыСведений.ВременныеДанные.СоздатьНаборЗаписей();
    Набор.Записать();
    ЗаписьЖурналаРегистрации("Обслуживание.ОчисткаРегистра",
        УровеньЖурналаРегистрации.Информация, , , "Регистр очищен по расписанию");
КонецПроцедуры

В клиент-серверной базе управляйте такими заданиями через консоль кластера: там видно, что задание отработало, и можно временно заблокировать регламентные задания на время обслуживания. В файловой базе регламентное задание выполняется только при запущенном сеансе, поэтому для фоновой чистки обычно поднимают отдельную сессию или переносят логику в клиент-серверный вариант.

Для очистки «старше N дней» не удаляйте всё подряд: сначала запросом отберите устаревшие строки по дате, а затем пишите пустые наборы по этим ключам. Так регламентное задание не тронет актуальные данные.

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

Можно ли очистить регистр сведений в режиме 1С:Предприятие, без конфигуратора?
Да. Конфигуратор нужен, только чтобы посмотреть структуру и режим записи. Сама очистка выполняется кодом в пользовательском режиме — через внешнюю обработку исполнения кода или штатную обработку удаления.
Удаление записи из регистра можно отменить?
Нет. Запись пустого набора и прямой DELETE необратимы. Вернуть данные можно только из резервной копии, поэтому её делают до операции.
Почему пустая запись не очищает подчинённый регистратору регистр целиком?
Потому что запись набора действует в разрезе регистратора. Без отбора по Регистратор платформа не знает, чьи движения замещать. Нужен перебор всех регистраторов в цикле.
Безопасно ли чистить регистр через DELETE в SQL?
Это не поддерживается 1С и может разойтись с кешем платформы и связанными данными. Применяйте только на больших объёмах, с резервной копией, без пользователей и с последующим перезапуском рабочих процессов.
Уменьшится ли размер базы после очистки?
В клиент-серверной базе место освобождает обслуживание СУБД. В файловой базе файл 1Cv8.1CD сожмётся только после тестирования и исправления с реструктуризацией.