|
Как частично удалить записи регистра сведений? | ☑ | ||
|---|---|---|---|---|
|
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
|
||||
|
17
1сПупс
21.09.26
✎
10:55
|
(15) (16) благодарю!
Подробности&НаСервере Процедура УдалитьЗаписиРСНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод, | ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура, | ШтрихкодыНоменклатуры.Характеристика КАК Характеристика, | ШтрихкодыНоменклатуры.Упаковка КАК Упаковка, | ШтрихкодыНоменклатуры.УТР_Серия КАК УТР_Серия |ИЗ | РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры |ГДЕ | ШтрихкодыНоменклатуры.УТР_Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)"; ТЗ_ЧегоДолжноБытьВРС = Запрос.Выполнить().Выгрузить(); НачатьТранзакцию(); // Создаём набор с отбором и записываем ПУСТОЙ набор — это и есть удаление НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.РасширенныеРежимыЗамещения = Истина; НаборЗаписей.Отбор.Сбросить(); НаборЗаписей.Загрузить(ТЗ_ЧегоДолжноБытьВРС); НаборЗаписей.Записать(РежимЗамещения.Обновление); ////тест //НаборЗаписей.Прочитать(); НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Прочитать(); ОтменитьТранзакцию(); КонецПроцедуры с режимом Обновление не сработало. Ничего не поменялось. Подробности&НаСервере Процедура УдалитьЗаписиРСНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод, | ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура, | ШтрихкодыНоменклатуры.Характеристика КАК Характеристика, | ШтрихкодыНоменклатуры.Упаковка КАК Упаковка, | ШтрихкодыНоменклатуры.УТР_Серия КАК УТР_Серия |ИЗ | РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры |ГДЕ | Не ШтрихкодыНоменклатуры.УТР_Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)"; ТЗ_ЧегоНеДолжноБытьВРС = Запрос.Выполнить().Выгрузить(); НачатьТранзакцию(); // Создаём набор с отбором и записываем ПУСТОЙ набор — это и есть удаление НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.РасширенныеРежимыЗамещения = Истина; //НаборЗаписей.Отбор.Сбросить(); НаборЗаписей.Загрузить(ТЗ_ЧегоНеДолжноБытьВРС); НаборЗаписей.Записать(РежимЗамещения.Удаление); ////тест //НаборЗаписей.Прочитать(); НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей(); НаборЗаписей.Прочитать(); ОтменитьТранзакцию(); КонецПроцедуры а вот с удалением - зашло. |
|||
|
18
Franchiser
21.09.26
✎
11:13
|
(0) можно добавить новое измерение в регистр "ЧтобыУдалить" (булево) и тогда удалить через наборзаписей весь регистр.
|
|||
|
19
Прохожий
21.09.26
✎
14:24
|
(0) Сколько надо сохранить? подправь универсальную выгрузку загрузку, выгрузи в файл полезное, грохни регистр, загрузи полезное.
|
|||
|
20
END
21.09.26
✎
17:26
|
(17) И сколько пор времени заняло? Существенно быстрее?
|
|||
|
21
Прохожий
22.09.26
✎
06:23
|
(18) Смотря сколько оставить.
|
|||
|
22
craxx
22.09.26
✎
09:54
|
(0) Вообще, если оставить надо немного, очень быстро можно сделать следующее
1. создать копию этого регистра, перенести туда нужные записи. 2. очистить регистр исходный полностью (с помощью SQL, например, как советовали выше) 3. перенести в исходный из копии записи обратно |
|||
|
23
Волшебник
22.09.26
✎
09:57
|
(22) или так:
1. Создать копию этого регистра, перенести туда нужные записи. 2. Удалить исходный регистр в конфигураторе 3. Переименовать копию в исходное имя |
|||
|
24
craxx
22.09.26
✎
23:26
|
(23) если база обновляемая - не вариант
новый регистр будет иметь другой идентификатор |
|||
|
25
H A D G E H O G s
22.09.26
✎
23:33
|
(24) В новую версию - с чистой совестью!
|
|||
|
26
1сПупс
23.09.26
✎
08:00
|
(20) да, существенно.
|
|||
|
27
Прохожий
23.09.26
✎
08:32
|
(23) Если распределенка то не факт. Опять же всякие РЛС могут быть завязаны именно на него и регистр сам может иметь РЛС.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |