Имя: Пароль:
1C
 
Как частично удалить записи регистра сведений?
0 1сПупс
 
18.09.26
10:30
Коллеги, доброго дня! Записей очень много (миллионы), через МенеджерЗаписи удаление будет проходить долго, поэтому решил использовать НаборЗаписей.

Но когда попробовал через набор записей, почему-то не канает... Видимо через Установить нельзя передавать массив?

&НаСервере
Процедура УдалитьЗаписиРСНаСервере()

	НачатьТранзакцию();
	Попытка

		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	ШтрихкодыНоменклатуры.Номенклатура КАК ШтрихкодНоменклатура,
		|	ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
		|	ШтрихкодыНоменклатуры.УТР_Серия КАК УТР_Серия
		|ИЗ
		|	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
		|ГДЕ
		|	НЕ ШтрихкодыНоменклатуры.УТР_Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
		|	И НЕ ШтрихкодыНоменклатуры.УТР_Серия ЕСТЬ NULL";
		
		РезультатЗапроса = Запрос.Выполнить();
		
		Выборка = РезультатЗапроса.Выбрать();
		
		Штрихкоды = Новый Массив;
		Пока Выборка.Следующий() Цикл
			Штрихкоды.Добавить(Выборка.Штрихкод);
		КонецЦикла;
		
		Если Штрихкоды.Количество() = 0 Тогда
			Сообщить("Нечего удалять.");
			Возврат;
		КонецЕсли;
		
		Порция = 500;
		ОбщееКоличество = Штрихкоды.Количество();
		Обработано = 0;
		МассивПорция500= Новый Массив;
		
		Пока Обработано<>ОбщееКоличество Цикл
		
			//взять в новый массив 500 первых элементов массива и удалить их из массива Штрихкоды
			МассивПорция500.Добавить(Штрихкоды[Обработано]);
			Обработано = Обработано+1;
			
			Если МассивПорция500.Количество()=500 Тогда
			
				// 3. Создаём набор с отбором по Штрихкоду
				НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
				НаборЗаписей.Отбор.Штрихкод.Установить(МассивПорция500); // передаём массив значений
				
				//тест
				НаборЗаписей.Прочитать();
				
				// 4. Записываем ПУСТОЙ набор с этим отбором — это и есть удаление
				НаборЗаписей.Записать();
				
				МассивПорция500.Очистить();
			
			КонецЕсли;
			
		КонецЦикла;
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;	
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЗаписиРС(Команда)
	УдалитьЗаписиРСНаСервере();
КонецПроцедуры



на строке //тест
                НаборЗаписей.Прочитать(); пусто
1 YFedor
 
18.09.26
09:22
НаборЗаписей.Отбор.Штрихкод.Установить(МассивПорция500);

Сдается мне, что там отбор только по равно может быть, нужно в СП почитать
2 Ненавижу 1С
 
гуру
18.09.26
09:23
читать конечно при удалении не надо. А удалять придется отдельными наборами

Если УТР_Серия это измерение - то просто записать набор по этому измерению

условие
И НЕ ШтрихкодыНоменклатуры.УТР_Серия ЕСТЬ NULL
бесполезное
3 Timon1405
 
18.09.26
09:27
вайбкодинг, итоги...
4 Ненавижу 1С
 
гуру
18.09.26
09:28
(3) код пахнет фиксиным
5 mikecool
 
18.09.26
09:37
переходить на новые платформы, недавно же завезли апдейт по табличке(или как он там зовется) без всяких отборов
6 H A D G E H O G s
 
18.09.26
09:38
Еще и NULL ы ищет, где не надо. Ненавижу1С, настало твоё время!
7 Ненавижу 1С
 
гуру
18.09.26
09:41
(6) слоупок, см (2)
8 Ёпрст
 
гуру
18.09.26
10:16
Автору еще никто не сказал, что запрос там не нужен, как и транзакция ?
9 Ёпрст
 
гуру
18.09.26
10:17
Хотя, если УТР_Серия  - не измерение, то нужен.
(0) УТР_Серия  - что это ? Измерение/ресурс/реквизит ?
10 1сПупс
 
18.09.26
10:17
(2) в том то и дело что УТР_Серия это Ресурс.
конечно перед удалением не читаю (//тест
                НаборЗаписей.Прочитать();) только для проверки.
11 Ненавижу 1С
 
гуру
18.09.26
10:20
(10) тогда либо все читаем/удаляем и пишем
Либо только удаляем, смотря чего больше
12 ptiz
 
18.09.26
10:35
(0) Простым delete в SQL делай. Только на копии. Очень хороший пример для входа в "прямые запросы".
13 shuhard
 
18.09.26
10:41
(12) +100500
чистить массированные РГ сведений на стороне 1С 100% извращение
14 АнализДанных
 
18.09.26
11:26
(0)
В последних вересиях платформы для РС появились дополнительные режимы записи наборов. Не знаю как они переварят твои "миллионы" записей, но именно для этого этот функционал и создавался.
Выгрузи весь регистр в таблицу значение, в которой удалены ненужные строки, и с помощью свойств
- РасширенныеРежимыЗамещения
- РежимЗамещения
одним махом запиши все на регистр.
Пример:

НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.РасширенныеРежимыЗамещения = Истина;
НаборЗаписей.Отбор.Сбросить();
НаборЗаписей.Загрузить(ТаблицаШК_с_УдаленнымиЗначениями);
НаборЗаписей.Записать(РежимЗамещения.Обновление);
15 АнализДанных
 
18.09.26
11:28
или даже проще, тебе надо "РежимЗамещения.Удаление". Передай в набор только удаляемые строки. И также одной записью из всего регистра удалятся только те, что ты передашь в набор.
16 Мультук
 
гуру
18.09.26
11:47
Вроде как с примерами разжевано

https://infostart.ru/1c/articles/2508120/
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший