Программисту 1с в работе не редко нужно очистить регистр сведений от записей. В этой заметке разберу примеры очистки различных вариантов регистров сведений.
Регистр сведений — объект конфигурации, позволяющий хранить произвольные данные в разрезе нескольких измерений. Например, в регистре сведений можно хранить цены в разрезе номенклатуры и виде цен, или курсы валют в разрезе валюты.
Очистка регистра сведений без регистратора
Что бы удалить все записи из регистра достаточно написать две строчки кода.
- Выбрать регистр сведений для удаления.
- Создать набор записей.
- Записать пустой набор записей.
НаборЗаписей = РегистрыСведений.СтатусыЗаданий.СоздатьНаборЗаписей(); НаборЗаписей.Записать();
Удаление записей в независимом регистре сведений с отбором. В примере удаляются все записи из регистра сведений «СтатусыЗаданий» по определенной организации.
- Считаем что в переменную Орг установлена нужная для очистки организация.
- Создаем набор записей.
- Устанавливаем отбор по организации.
- Записываем пустой набор данных.
Орг = ...; НаборЗаписей = РегистрыСведений.СтатусыЗаданий.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Организация.Установить(Орг); НаборЗаписей.Записать();
Удаление записей из регистра сведений подчиненного регистратору
Для очистки регистра сведений подчиненного регистратору в отборе обязательно указывать регистратор, в остальном работает так же как удаление записей в регистре сведений с отбором.
ДокументРегистратор = Документы.УстановкаЦенНоменклатуы.... НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(ДокументРегистратор); НаборЗаписей.Записать();
Удаление записей из регистра сведений подчиненного регистратору с дополнительным отбором
Для удаления части записей из регистра сведений в пределах одного регистратора нужно сделать отбор по регистратору, а потом отобрать записи для удаления. Например если мы хотим удалить из регистра цены только по определенной номенклатуре. Важно помнить, что при перепроведении документа удаленные записи появятся снова.
В этом примере установив отбор по регистратору, я добавляю обход полученных записей и создаю список записей подходящих по условию, а после удаляю их из набора. Набор записывается уже без этих записей.
НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(ДокументРегистратор); //обязательно для подчиненных регистров НаборЗаписей.Прочитать(); спЗаписиКоторыеНадоУдалить = Новый СписокЗначений; Для Каждого Запись Из НаборЗаписей Цикл Если [условие для удаления записи] Тогда спЗаписиКоторыеНадоУдалить.Добавить(Запись); КонецЕсли; //[условие] КонецЦикла; Для Каждого тЗапись Из спЗаписиКоторыеНадоУдалить Цикл НаборЗаписей.Удалить(тЗапись.Значение); КонецЦикла; НаборЗаписей.Записать();
Удаление записей из регистра с большим количеством записей
В больших высоконагруженных базах бывает необходимо удалить миллионы или даже десятки миллионов записей, очень часто перечисленные выше способы вылетают с ошибкой памяти или не могут выполнится по другим причинам.
В этом примере я выберу все записи которые нужно удалить запросом, а потом буду удалять по одной, это позволит не блокировать таблицу на долгое время и не потреблять много памяти за один раз.
Запрос = Новый Запрос("ВЫБРАТЬ | ЦеныНоменклатуры.Регистратор |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры | ГДЕ Условие"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор); НаборЗаписей.Записать(); КонецЦикла;
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.