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

Справочники и Данные · 11 мин

1С: как удалить запись из регистра сведений

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

Регистр сведений в 1С хранит данные в разрезе измерений: курсы валют, цены номенклатуры, адреса контрагентов, настройки обмена. Записи такого регистра нередко нужно удалить — из-за ошибочного ввода, дублей, устаревших значений или для очистки перед загрузкой новых данных. Способ удаления зависит от типа регистра (подчинён регистратору или независимый, периодический или нет) и от объёма данных.

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

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

Определяем тип регистра перед удалением

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

Независимый регистр сведений позволяет удалять отдельные записи напрямую — вручную или кодом. Регистр, подчинённый регистратору, заполняется движениями документов: записи в нём нельзя удалить по отдельности, они исчезают при отмене проведения или пометке удаления документа-регистратора.

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

Удаление записи вручную через форму списка

Самый простой случай — независимый регистр и одна-две ошибочные записи. Откройте регистр: в пользовательском режиме через раздел, где он опубликован, или универсально — через «Все функции» (включается в параметрах запуска тонкого клиента: Сервис → Параметры → «Отображать команду Все функции»), затем «Регистры сведений» → нужный регистр.

В списке найдите запись, установите на неё курсор и нажмите Delete или кнопку «Удалить» на панели. Платформа запросит подтверждение, после чего запись исчезнет физически — без пометки на удаление и без возможности отката.

Если список большой, используйте отбор (Ctrl+F или кнопка «Найти»), чтобы быстро выйти на нужную строку по значению измерения. Для периодических регистров проверьте дату записи — визуально похожие строки могут относиться к разным периодам.

Программное удаление через набор записей

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

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

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

НаборЗаписей.Записать(); // записи по этой номенклатуре удалены

Для периодического регистра добавьте отбор по периоду, иначе удалятся записи по измерению за все даты:

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

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

НаборЗаписей.Отбор.Период.Установить(ДатаКурса);

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

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

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

Удаление записей запросом и через менеджер записи

Язык запросов 1С не имеет инструкции DELETE — данные изменяются только объектными методами. Поэтому запрос используют для выборки ключей записей, а удаляют в цикле через менеджер записи или набором записей.

Через менеджер записи

Менеджер записи подходит для удаления одной конкретной строки по полному ключу:

МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Валюта = ВалютаСсылка;

МенеджерЗаписи.Период = ДатаКурса;

МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда

МенеджерЗаписи.Удалить();

КонецЕсли;

Проверка Выбран() важна: если записи с таким ключом нет, вызов Удалить() на непрочитанном менеджере может привести к непредсказуемому поведению или ошибке.

Выборка запросом и удаление в цикле

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

bsl
Запрос = Новый Запрос("ВЫБРАТЬ Период, Валюта ИЗ РегистрСведений.КурсыВалют ГДЕ Период < &Граница");
Запрос.УстановитьПараметр("Граница", ДатаГраницы);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
    Набор.Отбор.Валюта.Установить(Выборка.Валюта);
    Набор.Отбор.Период.Установить(Выборка.Период);
    Набор.Записать();
КонецЦикла;

Полная очистка регистра

Если нужно удалить все записи регистра, достаточно записать пустой набор без отбора:

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

НаборЗаписей.Записать(); // регистр полностью очищен

Тот же результат даёт команда «Удалить все» в форме списка при выделении всех строк, но программный способ быстрее и не зависит от ограничений интерфейса на выделение. Для регистра, подчинённого регистратору, полная очистка кодом невозможна — только удаление всех документов-регистраторов, что обычно недопустимо для учётных данных.

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

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

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

Нужно удалить 1–2 записи независимого регистраУдалите вручную через форму списка (Все функции → Регистры сведений)
Записей много, условие отбора простое (одно измерение)Используйте набор записей с отбором и Записать() пустого набора
Условие сложное, нужна предварительная выборкаЗапросом выберите ключи, удаляйте в цикле наборами записей
Регистр подчинён регистраторуНайдите и отмените проведение документа-регистратора, прямое удаление невозможно
Нужно очистить регистр полностьюЗапишите пустой набор без отбора, предварительно сделав выгрузку базы

Работа в типовых конфигурациях и через обработки

В типовых решениях (Бухгалтерия, Управление торговлей, ERP) многие регистры сведений доступны из интерфейса: «Курсы валют», «Цены номенклатуры», «Штрихкоды номенклатуры». Удаление там выполняется стандартно — через список регистра. Часть регистров скрыта от пользователя и доступна только через «Все функции» под правами администратора.

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

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

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

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

Если удаление выполнялось кодом, полезно до записи пустого набора выполнить НаборЗаписей.Прочитать() и вывести НаборЗаписей.Количество() — так вы заранее узнаете, сколько строк попадёт под удаление. Нулевое значение означает, что отбор не сработал и удалять нечего; неожиданно большое — что условие задано неверно.

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

Контрольные точки

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

Список регистра с отбором по условию удаления
Норма

Записей нет

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

Строки остались — отбор в коде не совпал с реальными значениями

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

Уменьшилось ровно на число удалённых

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

Регистр пуст или уменьшился сильнее — задеты лишние данные

Работа смежных механизмов (цены, курсы, обмены)
Норма

Документы и обмены работают штатно

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

Ошибки пересчёта или рассинхронизация — восстановите данные из копии

Итог

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

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

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

Почему команда «Удалить» в списке регистра недоступна?

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

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

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

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

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

Что будет, если вызвать Записать() у набора без отбора?

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

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

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

Безопасно ли удалять записи во время работы пользователей?

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