Программирование в 1С

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

Коротко

Для точечного удаления или изменения одной записи независимого регистра сведений используйте РегистрыСведений.ИмяРегистра.СоздатьМенеджерЗаписи(): заполните все измерения и Период (для периодического регистра), вызовите Прочитать(), проверьте Если МенеджерЗаписи.Выбран() Тогда и вызовите МенеджерЗаписи.Удалить() либо измените ресурсы и выполните МенеджерЗаписи.Записать(Истина).

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

МенеджерЗаписи и НаборЗаписей: чем отличаются и что выбрать

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

Для программного изменения и удаления записей платформа предоставляет два прикладных объекта:

  • РегистрСведенийМенеджерЗаписи.<Имя> (создаётся методом СоздатьМенеджерЗаписи()) — работает строго с одной записью и доступен только для независимых регистров сведений. Позволяет прочитать, перезаписать или удалить конкретную строку по полному ключу (все измерения + Период для периодического регистра).
  • РегистрСведенийНаборЗаписей.<Имя> (создаётся методом СоздатьНаборЗаписей()) — универсальный объект для работы с выборкой записей по произвольному отбору. Доступен как для независимых регистров, так и для регистров, подчинённых регистратору. Именно через НаборЗаписей выполняется массовое удаление по одному измерению, полная очистка регистра и удаление движений документа.

Как удалить одну запись независимого регистра через СоздатьМенеджерЗаписи()

Если регистр сведений независимый и вам известны значения всех его измерений (и точная дата Период, если регистр периодический), самый быстрый и экономный по памяти способ удалить запись — использовать РегистрСведенийМенеджерЗаписи. Он обращается в СУБД к одной конкретной строке без формирования коллекции набора записей.

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

// 1. Удаление одной записи периодического независимого регистра сведений
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период   = Дата(2026, 3, 15);
МенеджерЗаписи.Валюта   = СсылкаНаВалютуUSD;

// Считываем запись из БД по ключу (Период + Измерения)
МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда
    МенеджерЗаписи.Удалить();
КонецЕсли;

// 2. Удаление одной записи непериодического независимого регистра
МенеджерЦены = РегистрыСведений.ЦеныНоменклатурыПоставщиков.СоздатьМенеджерЗаписи();
МенеджерЦены.Контрагент   = СсылкаНаПоставщика;
МенеджерЦены.Номенклатура = СсылкаНаТовар;
МенеджерЦены.Прочитать();

Если МенеджерЦены.Выбран() Тогда
    МенеджерЦены.Удалить();
КонецЕсли;
РегистрСведенийМенеджерЗаписи
СоздатьМенеджерЗаписи()только для независимых регистров сведений
Прочитать()ищет запись по значениям измерений и Период; если не найдена — очищает поля
Выбран()Истина, если запись найдена в БД или записана
Удалить()удаляет запись из БД через внутреннюю запись пустого НаборЗаписей по ключу
→ РегистрСведенийМенеджерЗаписи

Как изменить существующую запись регистра сведений программно

Здесь различаются два сценария: изменение ресурсов и реквизитов записи (когда измерения и период остаются прежними) и изменение ключевых полей (самого измерения или даты Период).

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

// Сценарий А: изменяем ресурсы и реквизиты (ключ записи не меняется)
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = Дата(2026, 3, 15);
МенеджерЗаписи.Валюта = СсылкаНаВалютуUSD;
МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда
    МенеджерЗаписи.Курс      = 92.45;
    МенеджерЗаписи.Кратность = 1;
    // Замещать = Истина перезапишет найденную строку по тому же ключу
    МенеджерЗаписи.Записать(Истина);
КонецЕсли;

// Сценарий Б: нужно изменить ключ записи (Период или измерение) без дубля
НачатьТранзакцию();
Попытка
    СтарыйМенеджер = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
    СтарыйМенеджер.Период = Дата(2026, 3, 15);
    СтарыйМенеджер.Валюта = СсылкаНаВалютуUSD;
    СтарыйМенеджер.Прочитать();

    Если СтарыйМенеджер.Выбран() Тогда
        НовыйМенеджер = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
        ЗаполнитьЗначенияСвойств(НовыйМенеджер, СтарыйМенеджер);
        НовыйМенеджер.Период = Дата(2026, 3, 16); // новый ключ

        СтарыйМенеджер.Удалить();
        НовыйМенеджер.Записать(Истина);
    КонецЕсли;
    ЗафиксироватьТранзакцию();
Исключение
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;
МенеджерЗаписи.Записать(<Замещать>)
ЗамещатьБулево (по умолчанию Истина) — замещать ли существующую запись с таким же ключом
Смена ключапри изменении измерения или Период старую запись нужно явно удалить через Удалить()
→ (процедура)
В типовых конфигурациях (ERP, КА, БП 3.0, ЗУП 3.1) у регистра сведений может быть 6–10 измерений и подписки на события при записи. Чтобы не проверять все измерения вручную через Конфигуратор, откройте ИИ Консоль кода 1С: агент сам прочитает метаданные вашей базы, проверит режим записи регистра и сгенерирует готовую внешнюю обработку или код для безопасного изменения и очистки записей.

Массовое удаление по отбору и полная очистка регистра через НаборЗаписей

Когда нужно удалить все записи по одному измерению (например, по конкретной организации или складу), за выбранный период или полностью очистить регистр сведений, используется РегистрСведенийНаборЗаписей.

Главное правило платформы 1С 8.3 при очистке через набор записей: перед удалением не нужно вызывать НаборЗаписей.Прочитать() и НаборЗаписей.Очистить(). Когда вы создаёте новый объект СоздатьНаборЗаписей(), коллекция записей в нём уже пуста (Количество() = 0). При вызове НаборЗаписей.Записать(Истина) с параметром Замещать = Истина (он установлен по умолчанию) платформа выполняет в БД команду удаления всех существующих строк, удовлетворяющих установленному НаборЗаписей.Отбор, и записывает на их место содержимое набора (то есть 0 строк). Вызов Прочитать() перед очисткой только зря потянет тысячи записей с сервера БД в оперативную память сервера 1С.

// 1. Удаление всех записей регистра по отбору (по одному измерению)
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидЦен.Установить(СсылкаНаВидЦенЗакупочная);

// Прочитать() НЕ вызываем! Пустой набор с Замещать = Истина
// сразу удалит из БД все записи, где ВидЦен = СсылкаНаВидЦенЗакупочная
НаборЗаписей.Записать(Истина);

// 2. Полная очистка независимого регистра сведений (удаление ВСЕХ записей)
НаборПолнойОчистки = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьНаборЗаписей();
// Отбор не устанавливаем — пустой набор заместит всю таблицу регистра
НаборПолнойОчистки.Записать(Истина);
НаборЗаписей.Записать(<Замещать>)
Отбор.<Имя>.Установить()включает фильтр на равенство по измерению, Период или Регистратор
ЗамещатьБулево (по умолчанию Истина) — удаляет в БД строки по Отбор и записывает набор
ОбменДанными.Загрузкапри значении Истина отключает проверки и типовые подписки БСП
→ (процедура)

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

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

Обращаться к набору записей подчинённого регистра можно двумя способами: через свойство ДокументОбъект.Движения.<ИмяРегистра> (удобно внутри обработки проведения или внешней обработки при работе с объектом документа) либо напрямую через менеджер регистра РегистрыСведений.<ИмяРегистра>.СоздатьНаборЗаписей() с установкой Отбор.Регистратор.Установить(СсылкаНаДокумент).

// Способ 1. Полное удаление движений документа по подчинённому регистру сведений
НаборДвижений = РегистрыСведений.ЦеныНоменклатурыДокументов.СоздатьНаборЗаписей();
НаборДвижений.Отбор.Регистратор.Установить(СсылкаНаДокументУстановкиЦен);
// Пустой набор при Записать(Истина) удалит все строки этого регистратора
НаборДвижений.Записать(Истина);

// Способ 2. Чтение и выборочное удаление/изменение строк конкретного регистратора
Набор = РегистрыСведений.ЦеныНоменклатурыДокументов.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокументУстановкиЦен);
Набор.Прочитать();

// Обходим с конца коллекции, если удаляем отдельные строки в цикле
Индекс = Набор.Количество() - 1;
Пока Индекс >= 0 Цикл
    Запись = Набор[Индекс];
    Если Запись.Цена = 0 Тогда
        Набор.Удалить(Индекс); // удаляем строку с нулевой ценой из набора
    Иначе
        Запись.Цена = Окр(Запись.Цена * 1.05, 2); // меняем ресурс
    КонецЕсли;
    Индекс = Индекс - 1;
КонецЦикла;

Набор.Записать(Истина);
Подчинённый НаборЗаписей
Отбор.Регистратор.Установить()обязательный отбор по документу-регистратору перед вызовом Записать()
Набор.Удалить()принимает индекс или объект РегистрСведенийЗапись; изменения фиксируются в БД при Записать()
→ (процедура)

Как удалить записи по сложному условию (по ресурсу, реквизиту или списку)

Свойство НаборЗаписей.Отбор у регистра сведений позволяет фильтровать записи только по ведущим ключевым полям: измерениям, Период, Регистратор и Активность. Попытка установить отбор набора записей по ресурсу или обычному реквизиту регистра вызовет ошибку, так как этих полей в коллекции НаборЗаписей.Отбор нет.

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

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   ЦеныПоставщиков.Период КАК Период,
    |   ЦеныПоставщиков.Контрагент КАК Контрагент,
    |   ЦеныПоставщиков.Номенклатура КАК Номенклатура
    |ИЗ
    |   РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныПоставщиков
    |ГДЕ
    |   ЦеныПоставщиков.Цена <= 0";

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

НачатьТранзакцию();
Попытка
    Пока Выборка.Следующий() Цикл
        МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатурыПоставщиков.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.Период       = Выборка.Период;
        МенеджерЗаписи.Контрагент   = Выборка.Контрагент;
        МенеджерЗаписи.Номенклатура = Выборка.Номенклатура;
        МенеджерЗаписи.Прочитать();
        Если МенеджерЗаписи.Выбран() Тогда
            МенеджерЗаписи.Удалить();
        КонецЕсли;
    КонецЦикла;
    ЗафиксироватьТранзакцию();
Исключение
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;

Ниже приведена сводная таблица выбора объекта и метода в зависимости от режима записи регистра и задачи:

Задача Режим записи регистра Объект 1С 8.3 Нужен ли Прочитать() Ключевой метод
Удалить 1 конкретную запись по полному ключу Независимый РегистрСведенийМенеджерЗаписи Да (плюс проверка Выбран()) МенеджерЗаписи.Удалить()
Изменить ресурсы/реквизиты 1 записи по ключу Независимый РегистрСведенийМенеджерЗаписи Да (плюс проверка Выбран()) МенеджерЗаписи.Записать(Истина)
Удалить все записи по одному измерению или периоду Независимый РегистрСведенийНаборЗаписей Нет (сразу запись пустого набора) Отбор.Измерение.Установить(...) + Записать(Истина)
Полностью очистить независимый регистр сведений Независимый РегистрСведенийНаборЗаписей Нет НаборЗаписей.Записать(Истина) без отборов
Очистить все движения документа по регистру Подчинение регистратору РегистрСведенийНаборЗаписей Нет Отбор.Регистратор.Установить(Док) + Записать(Истина)
Изменить или выборочно удалить часть строк документа Подчинение регистратору РегистрСведенийНаборЗаписей Да (читаем движения документа) Модификация строк в коллекции + Записать(Истина)

Частые ошибки при удалении и изменении записей регистра сведений

  • Вызов НаборЗаписей.Прочитать() и НаборЗаписей.Очистить() перед полным удалением по отбору. Если в регистре миллион записей, Прочитать() выгрузит их все в оперативную память сервера 1С только ради того, чтобы следующей строкой очистить коллекцию. Пустой СоздатьНаборЗаписей() с установленным отбором и вызовом Записать(Истина) удаляет записи сразу на уровне СУБД без чтения.
  • Попытка вызвать СоздатьМенеджерЗаписи() у регистра, подчинённого регистратору. Платформа выбросит исключение Метод объекта не обнаружен (СоздатьМенеджерЗаписи). Для подчинённых регистров используйте только СоздатьНаборЗаписей() с отбором по Регистратор.
  • Не заполнено свойство Период в МенеджерЗаписи периодического регистра. Если регистр периодический (даже с периодичностью «В пределах дня»), Период входит в ключ записи. Без точного значения Период метод Прочитать() не найдёт запись, и Выбран() вернёт Ложь.
  • Попытка изменить измерение или Период через МенеджерЗаписи.Записать(Истина) без удаления старой строки. При смене любого измерения или периода меняется ключ записи: метод Записать(Истина) создаст новую строку по новому ключу, а старая строка останется в регистре.
  • Установка отбора в НаборЗаписей.Отбор с видом сравнения, отличным от Равно, перед вызовом Записать(). При записи набора записей платформа требует, чтобы все активные элементы отбора имели ВидСравнения.Равно. При попытке записать набор с отбором ВСписке или Интервал возникнет ошибка записи набора.
  • Удаление элементов коллекции НаборЗаписей в прямом цикле Для Каждого или по возрастающему индексу. При вызове Набор.Удалить(Запись) индексы оставшихся строк смещаются, из-за чего цикл пропускает соседние строки или падает по выходу за границу индекса. Обходите коллекцию при удалении с конца или складывайте удаляемые строки во временный массив.

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

Как полностью очистить регистр сведений в 1С 8.3 программно?

Для полной очистки независимого регистра сведений создайте пустой набор записей методом РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей() и сразу вызовите НаборЗаписей.Записать(Истина), не устанавливая никаких отборов и не вызывая метод Прочитать(). Так как параметр Замещать по умолчанию равен Истина, пустой набор записей удалит все существующие записи из таблицы регистра в базе данных.

Почему при изменении измерения в МенеджерЗаписи старая запись не перезаписывается, а дублируется?

В регистре сведений измерения и Период образуют уникальный ключ записи. Когда вы считываете запись через МенеджерЗаписи.Прочитать(), меняете значение измерения и вызываете Записать(Истина), платформа ищет в базе строку уже по новому ключу, не находит её и вставляет новую запись, оставляя старую строку нетронутой. Чтобы изменить измерение без дубля, сначала удалите старую запись методом МенеджерЗаписи.Удалить() и затем запишите новую строку с обновлённым измерением.

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

У регистров сведений с режимом записи «Подчинение регистратору» нет метода СоздатьМенеджерЗаписи(), поэтому удаление выполняется через РегистрСведенийНаборЗаписей. Создайте набор вызовом РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей(), установите обязательный отбор НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент) и вызовите НаборЗаписей.Записать(Истина) — все движения указанного документа по этому регистру будут удалены.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 0,1 млн токенов на 2 дн.

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка