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