|
Как частично удалить записи регистра сведений? | ☑ | ||
|---|---|---|---|---|
|
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
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |