|
Удаление данных (определенных строк) из документа 1С 8.2 | ☑ | ||
---|---|---|---|---|
0
rs1c
15.03.12
✎
13:59
|
Доброго времени суток.
Есть большая база с учетными данными серийных номеров (за 400000 записей). Серийный номер вносится документом и дальше проходит процедуру обработки. Что нужно сделать: 1. Есть список серийных номеров (можем грузануть из экселя не вопрос) 2. Нужно по параметру (есть гарантия или нет) из этого списка сделать отбор и все что не попадает под гарантию (серийники)просто удалить из документов прошлых периодов. Все что с оставшимися делать я уже знаю. Прошу в общем то совета и мыслей как это реализовать на очень большом объеме данных. База SQl с оперативкой и процом проблем нет. Важно время исполнения, так как процедура не совсем разовая. Заранее спасибо!!! |
|||
1
Wobland
15.03.12
✎
14:00
|
хм... с другого конца зайти не пробовал? не добавлять ненужные данные
|
|||
2
rs1c
15.03.12
✎
14:01
|
Требуется зачистить базу от доков, чтоб поменьше была, а то раздулась.
|
|||
3
Ахиллес
15.03.12
✎
14:03
|
(2) И в чем трудность возникла? Что уже сделал, что не получилось?
|
|||
4
rs1c
15.03.12
✎
14:04
|
Сейчас есть механизм удаления данных, но скорость обработки 100 серийников за 5 часов, ну совсем что то не так я написал.
Вот и прошу посоветовать гуру как лучше это все реализовать. |
|||
5
Wobland
15.03.12
✎
14:05
|
(4) >100 серийников за 5 часов
мужик! я так не смогу |
|||
6
rs1c
15.03.12
✎
14:07
|
Вот так вот удаляю.
К = 0; Для каждого Строки Из Номера Цикл К = К +1; Выборка = Документы.РеализацияТоваров.Выбрать(); Пока Выборка.Следующий() Цикл // Цикл получения ссылок на документ Документ = Выборка.Ссылка; // Ссылка получена нужно обработать табличную часть Для каждого Стр Из Документ.Товар Цикл // Цикл обработки табличной части Если СокрЛП(Строки.Номер) = СокрЛП(Стр.SNKEY)Тогда ДокОбъект = Документ.ПолучитьОбъект(); // Ищем строку для удаления ПараметрыОтбора = Новый Структура; ПараметрыОтбора.Вставить("SNKEY", Стр.SNKEY); НайденныеСтроки = ДокОбъект.Товар.НайтиСтроки(ПараметрыОтбора); ДокОбъект.Товар.Удалить(НайденныеСтроки[0]); // Если удалили то запишем документ ДокОбъект.Записать(РежимЗаписиДокумента.Запись,РежимПроведенияДокумента.Неоперативный); КонецЕсли; КонецЦикла; // Цикл обработки табличной части КонецЦикла; // Цикл получения ссылок на документ Состояние("Обработано номеров в реализации: " + К + " Обрабатываем документ: "+Документ); КонецЦикла; ЭлементыФормы.УдаленыИзРеализации.Значение = Истина; |
|||
7
rs1c
15.03.12
✎
14:08
|
Верю, что код просто ... без слов.
|
|||
8
Wobland
15.03.12
✎
14:09
|
(6) так я и думал - записываешь после каждого удаления
|
|||
9
rs1c
15.03.12
✎
14:10
|
Суть то удаления верна? что нужно оптимизировать чтоб ускорить?
|
|||
10
rbcvg
15.03.12
✎
14:10
|
(9) запись после цикла делать?
|
|||
11
Wobland
15.03.12
✎
14:10
|
на вот для примера. какашками не кидаться, написано на коленке для почти одного раза
Процедура КнопкаВыполнитьНажатие(Кнопка) док=ДокументУстановкиЦен.ПолучитьОбъект(); й=док.Товары.Количество()-1; Пока й>=0 Цикл Состояние(""+й+"/"+док.Товары.Количество()); стр=док.Товары.Получить(й); Если стр.ЦенаВРознице=0 Тогда док.Товары.Удалить(й); КонецЕсли; й=й-1; КонецЦикла; Попытка док.Записать(); Сообщить("документ записан"); Исключение Сообщить("ошибка записи"); КонецПопытки; КонецПроцедуры |
|||
12
Wobland
15.03.12
✎
14:11
|
Найти(), НайтиСтроки() покури
|
|||
13
Ахиллес
15.03.12
✎
14:12
|
(4) Чувак, если у тебя документы проводятся по регистрам, то нужно делать запрос к регистру. Это раз.
Во вторых удалять только часть документа это... эээ... как бы не совсем методологически правильно. Ну и в третьих. Само по себе количество учётных данных ни на что по гамбургскому счёту не влияет. Если ты думаешь, что обрезка базы решит какие то твои проблемы, то скорее всего ошибаешься. |
|||
14
fisher
15.03.12
✎
14:13
|
1) не нужно записывать документ после удаления каждой его строки
2) документы записывать в транзакции пачками по сотне (скажем). Вообще, оптимальное количество операций в транзакции подбирается экспериментально под производительность сервака. |
|||
15
rs1c
15.03.12
✎
14:16
|
Спасибо Вам за советы.
Буду оптимизировать, "Wobland" - спасибо за пример. |
|||
16
fisher
15.03.12
✎
14:19
|
И цикл обхода мне сильно не нравится. Сейчас у тебя один док может обрабатываться неоднократно, а проведение - самая длительная операция.
Я бы загнал все номера во временную таблицу и одним запросом получил все доки и строки, которые надо удалить. А потом быстренько пробежался с учетом уже вышесказанного. |
|||
17
spu79
15.03.12
✎
14:30
|
А может разделить мух и котлеты? Сначала запросом (пусть даже по табл. частям) сделать выборку документов где встречаются "не нужные" номера, а потом уже обрабатывать их табл. части? p.s. номера не нужных строк этот же запрос тоже может вернуть и поиск не нужен.
|
|||
18
rs1c
15.03.12
✎
14:37
|
Я сейчас попробовал сделать:
1. Установил конкретный интервал обработки документов (дата начала и дата конца) 2. Сделал выборку доков и все что мне нужно чисто запросом. Как показал эксперемент эта процедура бежит за 2 минут 100 серийников. 3. Получается нужно теперь только удалить ненужные строки в известных и отобранных документах (обработать их табличную часть.) |
|||
19
spu79
15.03.12
✎
15:09
|
Покажи запрос...все равно как-то долго получается
|
|||
20
rs1c
15.03.12
✎
15:16
|
Я уже нашел баг почему так долго выборка идет, поправил и все секунды пролетает.
Сейчас мозгую удаление строк из табличных частей отобранных документов. |
|||
21
rs1c
15.03.12
✎
15:18
|
Я помозгую, если не получится или будет долго то я выложу код на обсуждение.
|
|||
22
Wobland
15.03.12
✎
18:13
|
(20) читал (12)?
|
|||
23
Киборг
15.03.12
✎
18:27
|
а почему нельзя найти сразу в таблице Документы.РеализацияТоваров.Товар только нужные ссылки и строки?
|
|||
24
fisher
15.03.12
✎
22:31
|
(22) Зачем? Еще в запросе получить номера нужных строк и удалять их по номерам с конца.
|
|||
25
Fragster
гуру
15.03.12
✎
22:42
|
пц! получить запросом номера всех строк, сгруппированных по документу, удалить в документах по индексу с конца...
|
|||
26
Fragster
гуру
15.03.12
✎
22:42
|
ну чота я слоупок
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |