Администрирование · 11 мин
Как удалить записи регистра сведений по отбору в 1С
Как удалить записи регистра сведений в 1С по отбору: менеджер записи, набор записей, запрос и обработка. Примеры кода, риски, проверка результата и типичные ошибки.
Регистр сведений в 1С хранит информацию в виде плоской таблицы: цены номенклатуры, курсы валют, адреса контрагентов, настройки пользователей. Со временем в нём накапливаются устаревшие, ошибочные или дублирующиеся записи, которые мешают работе: отчёты показывают неверные данные, документы подхватывают неактуальные цены. Удалить такие записи можно по отбору — то есть стереть не весь регистр, а только строки, удовлетворяющие заданному условию.
Удаление по отбору — операция необратимая. В отличие от пометки удаления документа, записи регистра сведений стираются физически, без возможности восстановления штатными средствами. Поэтому порядок действий всегда одинаков: сначала копия базы, затем проверка отбора на чтение (сколько записей попадёт под удаление), и только потом само удаление. Ниже разобраны рабочие способы — от простого кода в консоли до обработки для регулярного использования.
Когда нужно удалять записи регистра сведений по отбору
Типичные ситуации: загрузка данных из внешнего источника прошла с ошибкой и в регистре оказались дубли; сотрудник ввёл цены на неверную дату; тестовые записи попали в рабочую базу; регистр заполнился историческими данными, которые больше не нужны, но полная очистка регистра недопустима, так как часть записей актуальна.
Важно отличать удаление по отбору от полной очистки регистра. Полная очистка — это обнуление всей таблицы, она выполняется проще и быстрее, но уничтожает всё. Удаление по отбору требует точного условия: по значению измерения (например, конкретная номенклатура), по периоду (все записи раньше определённой даты) или по комбинации условий.
Способ 1. Удаление через набор записей с отбором
Основной программный способ — работа с набором записей регистра. Логика такая: создаётся набор записей, на его отбор накладываются условия, набор не заполняется данными, и вызывается метод записи. Пустой набор, записанный с отбором, удаляет все строки, попадающие под этот отбор.
Пример кода для удаления записей по конкретному значению измерения:
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(НужнаяНоменклатура);
НаборЗаписей.Записать(Истина);
Параметр Истина в методе Записать() означает замещение существующих записей — именно он и приводит к удалению. Если отбор установлен по нескольким измерениям, удалятся только записи, удовлетворяющие всем условиям одновременно. Для периодического регистра можно дополнительно установить отбор по периоду.
Ключевое ограничение способа: отбор набора записей работает только по измерениям и периоду. Установить условие по ресурсу или реквизиту (например, «удалить все записи, где цена равна нулю») напрямую через отбор набора нельзя — для этого нужен запрос с последующим удалением по ключам записей.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(НужнаяНоменклатура);
НаборЗаписей.Записать(Истина);Способ 2. Удаление по сложному условию через запрос
Когда условие затрагивает ресурсы, реквизиты или требует сравнений («больше», «меньше», «в списке»), сначала запросом выбирают ключи записей, подлежащих удалению, а затем каждую запись удаляют через менеджер записи или группами через набор записей.
Пример: удалить все записи регистра цен, где цена равна нулю.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Цены.Номенклатура КАК Номенклатура,
| Цены.Период КАК Период
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК Цены
|ГДЕ
| Цены.Цена = 0";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Номенклатура);
НаборЗаписей.Отбор.Период.Установить(Выборка.Период);
НаборЗаписей.Записать(Истина);
КонецЦикла;
Такой цикл надёжен, но медленен при большом количестве записей: каждая итерация — отдельная транзакция записи. Если удаляются тысячи строк, лучше группировать удаление по одному ведущему измерению: выбрать запросом уникальные значения измерения и удалять набором по каждому значению. Это сокращает число обращений к базе в разы.
Способ 3. Удаление через консоль кода или внешнюю обработку
Если удаление разовое и прав на разработку нет, используют консоль кода (внешнюю обработку, позволяющую выполнить произвольный код на встроенном языке) либо типовые обработки. В типовых конфигурациях на базе БСП есть инструмент «Групповое изменение реквизитов», но он работает со ссылочными объектами, а не с записями регистров напрямую — для регистров сведений чаще применяют консоль кода или специализированные обработки очистки.
Порядок работы в консоли кода: сначала выполняют запрос на подсчёт записей, попадающих под условие, и сверяют число с ожиданием. Затем выполняют код удаления. После — повторный запрос на подсчёт, чтобы убедиться, что удалилось именно то количество строк, которое планировалось.
- 1Сделайте резервную копию базы или выгрузку в dt
- 2На копии базы выполните запрос-подсчёт записей под отбором и сверьте число с ожиданием
- 3Выполните код удаления на копии и проверьте смежные данные: отчёты, документы, использующие регистр
- 4Повторите операцию в рабочей базе в монопольном режиме или в нерабочее время
- 5Выполните контрольный запрос: записей по условию не должно остаться
Особенности для периодических и подчинённых регистров
Периодический регистр сведений требует аккуратности с отбором по периоду. Установка отбора по периоду в наборе записей означает точное совпадение даты, а не диапазон. Чтобы удалить записи за интервал, нужно либо перебирать периоды через запрос, либо использовать отбор вида «ВидСравнения.БольшеИлиРавно» и «МеньшеИлиРавно» через два элемента отбора — но набор записей поддерживает только равенство, поэтому на практике диапазон обрабатывают запросом с последующим удалением.
Регистр, подчинённый регистратору, нельзя очистить произвольным отбором по измерениям — его записи существуют только в связке с документом. Удаление выполняется по отбору «Регистратор»: пустой набор записывается с отбором по конкретному документу, либо сам документ помечается на удаление, и его движения по регистру стираются автоматически при удалении помеченных объектов.
Сравнение способов удаления
Быстро и просто, но отбор только по измерениям и периоду, и только на равенство. Подходит для точечного удаления по ключу
Гибкое условие по любым полям, включая ресурсы. Медленнее на больших объёмах, требует аккуратности с транзакциями
Не требует изменения конфигурации, подходит администратору для разовой операции. Риск зависит от корректности введённого кода
Единственный корректный путь для подчинённых регистров. Заодно решает вопрос целостности движений документа
Проверка результата и типичные ошибки
После удаления обязательно выполняют контроль. Минимум — повторный запрос с тем же условием: он должен вернуть ноль строк. Дополнительно проверяют функциональные последствия: открывают отчёты и документы, которые читают этот регистр, и убеждаются, что программа не выдаёт ошибок и не подставляет пустые значения туда, где раньше были данные.
Частые ошибки при удалении по отбору: забытый отбор (пустой набор без отбора при записи с замещением очистит весь регистр), удаление в многопользовательском режиме при активных сеансах (возможны блокировки и конфликты транзакций), игнорирование режима «Загрузка = Истина» там, где он нужен, и наоборот — пропуск контроля согласованности данных, который этот режим отключает.
Как проверить результат
Запрос возвращает 0 строк
Записи остались — отбор не сработал или часть строк не попала под условие
Уменьшилось ровно на число удалённых
Уменьшилось сильнее — отбор был шире задуманного
Открываются без ошибок, данные корректны
Пустые значения, ошибки обращения к данным — удалено лишнее
FAQ: частые вопросы об удалении записей регистра сведений
Можно ли удалить записи регистра сведений без программирования?
Штатного интерактивного инструмента «удалить записи по условию» в типовых конфигурациях обычно нет. Если регистр имеет форму списка, можно вручную отобрать строки и удалять их по одной, но при большом объёме это непрактично. Реальный вариант без доработки конфигурации — консоль кода или готовая внешняя обработка, запускаемая через «Файл — Открыть».
Чем отличается Записать(Истина) от Записать() без параметра?
Параметр Истина включает режим замещения: набор полностью заменяет существующие записи в области отбора. Именно поэтому пустой набор с отбором и замещением удаляет данные. Без параметра для регистра сведений поведение зависит от режима записи, и попытка записать пустой набор может завершиться ошибкой.
Удалятся ли записи регистра при удалении документа-регистратора?
Да, для подчинённого регистра: при физическом удалении документа (через «Удаление помеченных объектов») его движения по всем регистрам стираются автоматически. Для независимого регистра сведений документов-регистраторов нет, и записи удаляются только явно.
Как удалить записи старше определённой даты в периодическом регистре?
Напрямую отбором набора записей диапазон задать нельзя — отбор работает на равенство. Нужно запросом выбрать записи с условием «Период < &Дата», а затем в цикле удалять их наборами с отбором по ключу записи либо группировать по измерениям для ускорения.
Что делать, если при удалении возникает ошибка блокировки?
Ошибка «Конфликт блокировок» означает, что другой сеанс читает или изменяет те же данные. Безопасное решение — выполнять удаление в монопольном режиме или в период минимальной активности пользователей. Принудительно завершать чужие сеансы ради операции стоит только после предупреждения пользователей.
Можно ли откатить удаление, если удалили лишнее?
Только восстановлением из резервной копии: записи регистра сведений удаляются физически, корзины и пометки удаления для них не существует. Если копии нет, данные придётся восстанавливать вручную по остаточной информации — отчётам, печатным формам, источникам загрузки.
Что важно запомнить
Удаление по отбору выполняется пустым набором записей с установленным отбором и методом Записать(Истина); сложные условия требуют запроса с циклом. Отбор набора работает только по измерениям и периоду, подчинённые регистры очищаются через регистратор. Перед операцией — копия базы и подсчёт записей, после — контрольный запрос и проверка связанных отчётов.