Регистр сведений 1с

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


от

Комментарии

Добавить комментарий