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

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

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

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

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

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

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

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

Ключевое свойство такого регистра — режим записи «Подчинение регистратору». Каждая запись содержит обязательный реквизит «Регистратор», а набор записей всегда имеет отбор по этому реквизиту. Физически данные хранятся порциями: одна порция — один регистратор. Именно поэтому платформа не позволяет удалить строку «сама по себе»: минимальная единица операции — весь набор записей одного документа.

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

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

Подготовка: что сделать перед очисткой

Первое и обязательное действие — резервная копия. Для файловой базы достаточно скопировать файл 1Cv8.1CD при отсутствии активных сеансов, для клиент-серверной — выполнить выгрузку через конфигуратор (Администрирование → Выгрузить информационную базу) или средствами СУБД. Очистка регистра — необратимая операция, и откатить её можно только восстановлением копии.

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

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

Способ 1: очистка набором записей по одному регистратору

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

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

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

НаборЗаписей.Записать(Истина);

Параметр Истина в методе Записать означает замещение существующих записей: поскольку набор пустой, все строки по этому регистратору удаляются. Без параметра или с параметром Ложь для подчиненного регистра запись пустого набора также удалит строки, но явное указание Истина считается более надежной практикой.

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

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

Способ 2: пакетная очистка по списку регистраторов через запрос

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗЛИЧНЫЕ

| Таблица.Регистратор КАК Регистратор

|ИЗ

| РегистрСведений.ИмяРегистра КАК Таблица

|ГДЕ

| Таблица.Регистратор.Дата < &ДатаГраницы";

Запрос.УстановитьПараметр("ДатаГраницы", ДатаГраницы);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);

НаборЗаписей.Записать(Истина);

КонецЦикла;

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

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

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

Способ 3: полная очистка всего регистра

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

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

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

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

Набор записей по одному регистратору

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

Запрос + цикл по регистраторам

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

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

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

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

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

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

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

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

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

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

Типичные ошибки при самостоятельной очистке:

Типичные ошибки
01
Попытка удалить записи через Удалить() у менеджера записи — для подчиненного регистратора это не работает так, как ожидается; нужен набор записей с отбором по регистратору
02
Очистка без резервной копии — при ошибке в условии отбора удаляются лишние данные без возможности восстановления
03
Забытый отбор по регистратору в цикле — набор записывается без отбора, что может привести к некорректной работе или очистке не тех данных
04
Очистка регистра при проведенных документах без изменения логики — после перепроведения записи появляются снова, и работа выполняется впустую
05
Выполнение очистки в рабочее время на клиент-серверной базе — конфликты блокировок и отвалившиеся сеансы пользователей
Контрольные точки

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

Количество записей в регистре
Норма

Совпадает с ожиданием: ноль при полной очистке или расчетный остаток при частичной

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

Записей больше или меньше ожидаемого — проверить условия отбора и журнал регистрации

Список регистраторов с записями
Норма

Остались только те регистраторы, которые не входили в очистку

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

Присутствуют регистраторы из списка очистки — повторить операцию по ним

Поведение при перепроведении документа
Норма

Записи не появляются, если регистр исключен из движений

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

Записи формируются снова — регистр не снят с движений документа

FAQ

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

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

Чем очистка подчиненного регистра отличается от очистки независимого?

Независимый регистр сведений можно очищать по произвольным отборам (по измерениям, периоду) и даже удалять отдельные записи. Подчиненный регистратору очищается только наборами записей целиком по каждому регистратору — отбор возможен только по реквизиту «Регистратор».

Удалятся ли записи регистра, если пометить документ на удаление?

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

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

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

Опасно ли очищать регистр при работающих пользователях?

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

Записи появились снова после очистки — почему?

Наиболее вероятная причина — документы-регистраторы были перепроведены (вручную, групповым перепроведением или обменом данными), а регистр остался в списке их движений. Чтобы записи не возвращались, снимите регистр с движений соответствующих документов в конфигураторе или измените обработку проведения.

Итог

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

Регистр сведений, подчиненный регистратору, очищается только наборами записей с отбором по регистратору: пустой набор с Записать(Истина) удаляет все строки регистратора. Для массовой очистки сначала выбирают регистраторы запросом, затем перебирают их в цикле. Обязательны резервная копия, контрольный запрос после операции и проверка, что регистр снят с движений документов — иначе записи вернутся при перепроведении.