Имя: Пароль:
1C
1С v8
Удаление данных (определенных строк) из документа 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
ну чота я слоупок
Программист всегда исправляет последнюю ошибку.