К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как очистить регистр сведений в 1С по отбору

Как очистить регистр сведений 1С по отбору: код на встроенном языке, обработки, удаление через набор записей, риски, проверка результата и типичные ошибки.

Очистка регистра сведений по отбору — типовая задача администратора и разработчика 1С: нужно удалить не все записи, а только те, что относятся к конкретному измерению, периоду или значению ресурса. Прямой кнопки «удалить по условию» в типовом интерфейсе нет, поэтому задача решается либо кодом на встроенном языке, либо универсальными обработками, либо штатными средствами вроде групповой обработки справочников и документов.

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

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

Когда требуется очистка по отбору и какие есть способы

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

Доступны четыре подхода. Первый — программный, через набор записей с отбором: самый быстрый и управляемый. Второй — запрос с выборкой и последующее удаление каждой записи: медленнее, но позволяет логировать или дополнительно проверять каждую запись. Третий — универсальные обработки (например, «Групповое изменение реквизитов» из состава БСП или сторонние обработки очистки регистров) — подходят тем, кто не пишет код. Четвёртый — консоль запросов с конструкцией удаления через временные таблицы для анализа объёма перед чисткой.

Сравнение способов очистки

Набор записей с отбором + Записать()

Самый быстрый способ, удаляет все записи под отбор одним обращением. Не подходит, если нужно проверять каждую запись перед удалением.

Запрос + поштучное удаление

Медленнее на больших объёмах, но позволяет логировать, фильтровать по вычисляемым условиям и пропускать отдельные записи.

Универсальные обработки

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

Пометка/удаление регистраторов

Единственный корректный путь для регистров, подчинённых регистратору. Требует аккуратности с самими документами.

Проверка устройства регистра перед очисткой

Первое, что нужно выяснить, — режим записи регистра. Откройте конфигуратор, найдите регистр в ветке «Регистры сведений» и посмотрите свойство «Режим записи». Значение «Независимый» означает, что записи создаются и удаляются самостоятельно — с ним можно работать напрямую. Значение «Подчинение регистратору» означает, что каждая запись привязана к документу, и удалять её в обход документа нельзя.

Второй момент — периодичность. У периодического регистра ключ записи включает поле «Период», поэтому отбор по дате работает штатно. У непериодического регистра условия по времени придётся строить через значения измерений или ресурсов, если дата там хранится.

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

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

Основной приём: создать набор записей, установить отбор по нужным измерениям и записать пустой набор. Платформа при записи сравнивает содержимое набора с тем, что хранится в базе под этим отбором, и удаляет отсутствующие записи. Пустой набор означает «под этим отбором не должно остаться ничего».

Пример кода для удаления записей по конкретному значению измерения «Организация»:

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

Отбор можно комбинировать по нескольким измерениям — каждый элемент отбора сужает выборку. Важный нюанс: если регистр периодический и нужно удалить записи за конкретную дату, отбор устанавливается по полю «Период». Диапазон дат одним отбором набора записей задать нельзя — для диапазона используйте запрос с последующим удалением по ключам записей или цикл по периодам.

Для больших регистров имеет смысл удалять порциями внутри транзакции с контролем времени, чтобы не блокировать работу пользователей надолго. В клиент-серверном варианте массовое удаление одним вызовом может занять минуты и удерживать блокировку таблицы.

Порядок действий при программной очистке
  1. 1
    Сделайте резервную копию базы или выгрузку dt
  2. 2
    Проверьте режим записи регистра и имена измерений в конфигураторе
  3. 3
    Запросом посчитайте, сколько записей попадает под условие
  4. 4
    Напишите код: создать набор записей, установить отбор, записать пустой набор
  5. 5
    Выполните код сначала в копии базы
  6. 6
    Повторите в рабочей базе и проверьте количество оставшихся записей

Удаление через запрос и ключи записей

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

Типовая схема: запросом выбираются значения измерений и период, далее в цикле создаётся менеджер записи, заполняются поля ключа, вызывается Прочитать() и Удалить(). Это медленнее набора записей, но даёт полный контроль: можно посчитать удалённые записи, записать их в журнал, пропустить исключения.

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

Очистка регистра, подчинённого регистратору

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

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

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

Маршрут решения

Как выбрать действие

Регистр независимый, условие — равенство измеренияНабор записей с отбором + Записать() пустого набора
Условие по диапазону дат или по ресурсуЗапрос по ключам записей + удаление через менеджер записи
Регистр подчинён регистраторуОтмена проведения документов или очистка движений с отбором по регистратору
Нет прав на запуск кода и обработокОбратитесь к администратору базы; штатными интерактивными средствами массово по отбору регистр не очистить

Очистка без программирования: обработки и штатные средства

В конфигурациях на Библиотеке стандартных подсистем есть обработка «Групповое изменение реквизитов» — она работает со справочниками и документами, но не чистит регистры сведений напрямую. Для регистров применяют универсальные обработки с диска ИТС или популярные инструменты вроде консоли кода и обработок «Удаление данных с отбором», которые позволяют выбрать регистр, задать условие в конструкторе и выполнить удаление.

Альтернатива без внешних файлов — встроенная консоль запросов (в типовых конфигурациях доступна через функции для технического специалиста, если подсистема включена). Ею можно сначала оценить объём записей под условием, а само удаление выполнить небольшим фрагментом кода через «Выполнить произвольный код» в тех же инструментах разработчика.

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

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

Проверка результата и типичные ошибки

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

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

Ещё одна группа ошибок связана с правами и режимами: пользователь без права «Удаление» на регистр получит исключение; попытка очистки во время регламентных заданий, пишущих в этот регистр, приведёт к конфликту блокировок. Выполняйте массовую чистку в период минимальной нагрузки.

Типичные ошибки
01
Записать пустой набор без установки отбора — очищается весь регистр, а не часть по условию
02
Пытаться установить отбор по ресурсу или реквизиту — отбор возможен только по измерениям, периоду и регистратору
03
Очищать регистр, подчинённый регистратору, в обход документов — движения перестают сходиться с учётом
04
Не сделать резервную копию — удалённые записи невозможно восстановить штатными средствами
05
Игнорировать регистрацию в планах обмена — удаление уйдёт в другие узлы обмена
Контрольные точки

Как проверить результат

Записи под условием
Норма

Запрос с условием возвращает 0 строк

Тревожный признак

Записи остались — отбор не сработал или условие задано неверно

Записи вне условия
Норма

Количество остальных записей совпадает с расчётным до очистки

Тревожный признак

Удалились лишние записи — восстанавливайте из копии

Зависимые отчёты
Норма

Отчёты по регистру открываются и показывают ожидаемые данные

Тревожный признак

Ошибки или пустые данные там, где записи должны были остаться

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

Можно ли очистить регистр сведений по отбору без кода?

Да, с помощью универсальных обработок очистки данных или инструментов разработчика с конструктором отбора. Штатного интерактивного средства «удалить записи регистра по условию» в типовом интерфейсе нет, поэтому без обработок и без кода массовую очистку по отбору выполнить нельзя — только ручное удаление отдельных записей из формы списка регистра.

Что произойдёт, если записать пустой набор без отбора?

Будут удалены все записи регистра (для независимого регистра) или все движения всех регистраторов, если набор создан с отбором по регистратору, который не установлен корректно. Это самая опасная ошибка: всегда проверяйте, что отбор установлен, например выводя значение отбора в сообщение перед записью.

Как удалить записи периодического регистра за диапазон дат?

Отбор набора записей по периоду задаётся только на конкретную дату. Для диапазона используйте запрос: выберите ключи записей с условием «Период МЕЖДУ &Начало И &Конец», затем в цикле удаляйте каждую запись через менеджер записи либо формируйте наборы с отбором по измерениям и периоду.

Уйдёт ли удаление записей в другой узел обмена РИБ?

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

Почему код с отбором выполняется без ошибок, но записи не удаляются?

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

Нужно ли после очистки делать тестирование и исправление базы?

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

Итог

Что важно запомнить

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