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

Регистр сведений — объект конфигурации, позволяющий хранить произвольные данные в разрезе нескольких измерений. Например, в регистре сведений можно хранить цены в разрезе номенклатуры и виде цен, или курсы валют в разрезе валюты.

Очистка регистра сведений без регистратора

Что бы удалить все записи из регистра достаточно написать две строчки кода.

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

Удаление записей в независимом регистре сведений с отбором. В примере удаляются все записи из регистра сведений «СтатусыЗаданий» по определенной организации.

  • Считаем что в переменную Орг установлена нужная для очистки организация.
  • Создаем набор записей.
  • Устанавливаем отбор по организации.
  • Записываем пустой набор данных.
Орг = ...;

НаборЗаписей = РегистрыСведений.СтатусыЗаданий.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Организация.Установить(Орг);
НаборЗаписей.Записать();

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

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

ДокументРегистратор = Документы.УстановкаЦенНоменклатуы....

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

Удаление записей из регистра сведений подчиненного регистратору с дополнительным отбором

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

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

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

спЗаписиКоторыеНадоУдалить = Новый СписокЗначений;
Для Каждого Запись Из НаборЗаписей Цикл
    Если [условие для удаления записи] Тогда
        спЗаписиКоторыеНадоУдалить.Добавить(Запись);
    КонецЕсли; //[условие]
КонецЦикла;

Для Каждого тЗапись Из спЗаписиКоторыеНадоУдалить Цикл
    НаборЗаписей.Удалить(тЗапись.Значение);
КонецЦикла;

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

Удаление записей из регистра с большим количеством записей

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

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

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

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