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