Как удалить, очистить или изменить запись регистра сведений в 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); // новый ключ
СтарыйМенеджер.Удалить();
НовыйМенеджер.Записать(Истина);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Истина) — замещать ли существующую запись с таким же ключомПериод старую запись нужно явно удалить через Удалить()Массовое удаление по отбору и полная очистка регистра через НаборЗаписей
Когда нужно удалить все записи по одному измерению (например, по конкретной организации или складу), за выбранный период или полностью очистить регистр сведений, используется РегистрСведенийНаборЗаписей.
Главное правило платформы 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С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка