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

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

Как удалить запись регистра сведений с отбором в 1С

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

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

Способ удаления зависит от режима регистра. Для независимого регистра сведений записи удаляются напрямую через набор записей. Для регистра, подчинённого регистратору, записи можно удалить только через документ-регистратор — либо очисткой его движений, либо пометкой документа на удаление. Попытка удалить запись подчинённого регистра напрямую приведёт к ошибке.

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

Как устроено удаление записей регистра сведений

Физически запись регистра сведений идентифицируется комбинацией измерений (и периода — для периодических регистров). Удалить «одну строку» в 1С нельзя в прямом смысле: платформа работает с набором записей. Механика такова — вы создаёте набор записей регистра, накладываете отбор, который точно указывает на нужную запись или группу записей, и записываете пустой набор. Платформа удаляет из таблицы всё, что попадает под отбор.

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

Удаление одной записи программным кодом

Базовый сценарий для независимого регистра сведений выглядит так: создаётся менеджер набора записей, в отбор добавляются значения измерений, набор записывается без чтения. Пример для регистра «КурсыВалют»:

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

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

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

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

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

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

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

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

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

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

bsl
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(ТоварСсылка);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
    НаборЗаписей.Очистить();
    НаборЗаписей.Записать();
КонецЕсли;

Удаление группы записей по условию

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

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

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

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

"ВЫБРАТЬ Рег.Номенклатура, Рег.ТипЦен

|ИЗ РегистрСведений.ЦеныНоменклатуры КАК Рег

|ГДЕ Рег.Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", ТоварСсылка);

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

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

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

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

Набор.Отбор.ТипЦен.Установить(Выборка.ТипЦен);

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

КонецЦикла;

Для массовых операций выполняйте удаление в транзакции: при ошибке на середине пакета база не останется в частично очищенном состоянии. Учитывайте, что в клиент-серверном варианте длинные транзакции создают блокировки — большие пакеты лучше разбивать на порции.

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

Удаление без программирования

Редактор записей регистра

В режиме предприятия многие регистры сведений доступны для просмотра через командный интерфейс или меню «Все функции» (включается в параметрах). Открыв список регистра, можно установить отбор стандартной кнопкой «Ещё — Настроить список», найти нужную запись и удалить её клавишей Delete или командой контекстного меню. Это подходит для единичных правок, но не для пакетной очистки.

Типовые и внешние обработки

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

Сравнение вариантов

Набор записей с отбором

Точечное и пакетное удаление кодом; требует доступа к конфигуратору или внешней обработке, зато полный контроль

Редактор списка в режиме предприятия

Подходит для единичных записей; неудобен при большом количестве и недоступен для скрытых регистров

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

Быстрый отбор и удаление без написания кода; риск ошибочного отбора, нужны полные права

Пометка регистратора на удаление

Единственный корректный путь для регистров, подчинённых регистратору, когда нужно убрать и документ

Особенности и ограничения

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

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

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

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

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

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

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

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

Запрос с тем же отбором после удаления
Норма

Возвращает 0 строк

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

Записи остались — отбор не сработал или нет прав на изменение

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

Разница равна числу записей под отбором

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

Удалено больше, чем показывал Прочитать() — отбор был шире ожидаемого

Связанные отчёты и формы
Норма

Данные отображаются без ошибок

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

Пустые значения там, где запись нужна — удалили лишнее, восстанавливайте из копии

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

Можно ли удалить запись регистра сведений через SQL-запрос напрямую?

Технически таблица регистра доступна в СУБД, но прямые изменения в обход платформы нарушают лицензионные ограничения и могут привести к рассогласованию служебных данных. Используйте штатные механизмы платформы — набор записей или обработки.

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

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

Почему после удаления записи она снова появляется?

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

Можно ли отменить удаление записи регистра?

Штатной команды отката нет. Восстановить данные можно только из резервной копии или архивной выгрузки. Поэтому перед массовым удалением копия базы обязательна.

Чем отличается Очистить() от Записать() пустого набора?

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

Итог

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

Записи регистра сведений удаляются записью пустого набора с отбором: по измерениям для независимого регистра и по регистратору для подчинённого. Всегда проверяйте отбор через Прочитать(), делайте резервную копию и помните про обмен данными — удаление необратимо.