Имя: Пароль:
1C
1C 7.7
v7: Удаление строк из ТЧ документа (v7)
0 bazvan
 
07.05.15
20:33
Народ кто нибуть видил или может есть укого обратока которая бы из ТЧ произвольного документа удалила бы строки с определенным условием
1 2S
 
07.05.15
20:35
кто у тебя ник спер?
ЗЫ Выгрузить в ТЗ и твори что хочешь
2 mehfk
 
07.05.15
20:36
У Ёпрст наверняка есть что-то начинающееся с DELETE FROM или около того.
3 bazvan
 
07.05.15
20:37
(1) это для меня слишком сложно я 7.7 уже 11 лет в глаза не видил.
4 bazvan
 
07.05.15
20:37
(2) на инфостарте порылса чето нету не чего али искать не умею
5 2S
 
07.05.15
20:39
выгружаешь в тз и перебором (не тупым, а обратным или по счетчику) удаляешь по условию, потом загружаешь с тз
ВыгрузитьТабличнуюЧасть()
ЗагрузитьТабличнуюЧасть()
6 2S
 
07.05.15
20:40
(3) что-то Вы, батенька, загнули. 11 лет назад (где-то рядом :) )27 релиз вышел
7 bazvan
 
07.05.15
20:40
(5) бррр
8 bazvan
 
07.05.15
20:41
(6) как только вышла 8.0

8.0.4.13   23.10.03
9 XLife
 
07.05.15
20:44
(0) позовите специалиста!))
10 bazvan
 
07.05.15
20:46
(9) дак вот гдежа его найтить то:)
11 2S
 
07.05.15
20:47
надо ценник повышать на 77, имхо
12 RomanYS
 
07.05.15
20:59
Док = СоздатьОбъект("Документ.ТвойДокумент");
Док.НайтиДокумент(ДокСсылка);
инд = Док.КоличествоСтрок();
Пока инд > 0 Цикл
Док.ПолучитьСтрокуПоНомеру(инд);
Если ТвоеУсловие Тогда
Док.Удалитьстроку();
КонецЕсли;
инд = инд -1;
КонецЦикла;
Док.Записать();

что-то типа того
13 bazvan
 
07.05.15
21:01
(12) хммм
14 bazvan
 
07.05.15
21:01
Счас попробуем
15 RomanYS
 
07.05.15
21:03
(14) аккуратнее, операция необратима))
16 bazvan
 
07.05.15
21:16
(12) огромный сенкс, работает
17 bazvan
 
07.05.15
21:17
(15) ну архивов полно
18 Garykom
 
гуру
07.05.15
21:24
ТС а звездочки это что?
19 Garykom
 
гуру
07.05.15
21:24
(18)+ а то я походу что то проспал...
20 ДенисЧ
 
07.05.15
21:25
(19) ты проспал лет 7..
21 Garykom
 
гуру
07.05.15
21:26
(20) да у меня таймаут был на Мисте в то время похоже...
22 bazvan
 
07.05.15
21:31
Блин в снеговике это проще сделать:)
чето я совсем 7.7 забыл
23 Garykom
 
гуру
07.05.15
21:33
(22) неа, прикинь самое простое это обратный цикл по строкам ТЧ (от конца к началу) и получаешь сроку, проверяешь условие и если нуна то удаляешь прикинь да?
24 bazvan
 
07.05.15
21:34
(23) прикин в снеговике все штатными обработками можно сделать
25 Garykom
 
гуру
07.05.15
21:35
(24) прикинь, уже 11 лет как все написано "почти штатное" лежит если надо берешь и делаешь...
26 bazvan
 
07.05.15
21:36
я не кодер, не чего не пишу:)
27 Garykom
 
гуру
07.05.15
21:38
(26) ага тока на мисту пишу...и то редко...и не сам...
28 Эльниньо
 
08.05.15
13:17
Можно воспользоваться изящным алгоритмом некого Эльниньо:

        табнов.выбратьстроки();
        пока табнов.получитьстроку()=1 цикл
            Пока пустоезначение(табнов.кто)=1 Цикл
                табнов.удалитьстроку();
                Если табнов.НомерСтроки = 0 Тогда
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        конеццикла;
29 фобка
 
08.05.15
13:32
(28) не взлетит
30 Масянька
 
08.05.15
13:46
(26) Однако, RomanYS ты должен 1 (одну) звезду :))))))
31 Эльниньо
 
08.05.15
14:08
(29) Очередной критикан из крутых спецов.
Обоснуй.
Хотя... вместо обоснования услышу извинения. Не в 1-й раз
32 Garykom
 
гуру
08.05.15
14:19
(31) да работает оно работает, просто сдвижка происходит индексов строк при удалении,
минус это оно возиожно тормознее обратного цикла чуть чуть

и большой минус условие приходится в цикл заворачивать
33 Эльниньо
 
08.05.15
14:31
(32) В чём минус использования Пока вместо Если?
34 Злопчинский
 
08.05.15
14:36
а как в снеговике штатно отсортировать ТЧ дока по реквизиту любой вложенности для реквизита тч
например - есть в ТЧ реквизит "номенклатура"
хочу отсторитровать по Номенклатура.Сертификат.ОрганВыдавшийСертификат.Код
???
35 Garykom
 
гуру
08.05.15
15:09
(33) к примеру отсутствие "Иначе" или "ИначеЕсли" ))
36 Garykom
 
гуру
08.05.15
15:09
(34) запросом... с записью результата обратно в ТЧ дока
37 ДенисЧ
 
08.05.15
15:10
(34) Запросом, разумеется.
38 mehfk
 
08.05.15
15:11
(34) Было же уже.
39 mehfk
 
08.05.15
15:13
40 Эльниньо
 
08.05.15
15:13
(35) Речь об удалении строк ТЗ/ТЧ по условию.
Причём тут  "Иначе" или "ИначеЕсли"?
41 Garykom
 
гуру
08.05.15
15:15
(40) А как сделать скажем
...
Иначе
табнов.НоваяСтрока();
...
КонецЕсли;
42 Эльниньо
 
08.05.15
15:19
(41) Речь об удалении строк ТЗ/ТЧ по условию.
об удалении строк ТЗ/ТЧ по условию.
об удалении строк
43 Garykom
 
гуру
08.05.15
15:22
(42) ааа...об удалении строк по условию...и как я это не заметил то?!

а где условие то? где оно условие Если...Тогда...КонецЕсли; ?

ЗЫ ))
44 Эльниньо
 
08.05.15
15:30
(43) Вот на этом и тупили все спецы, сходу отвергшие алгоритм.
Это банальная зашоренность.

Пока чё делает?
А делает она ту же Если, только не пропускает подряд идущие строки, удовлетворяющие условию.
45 palpetrovich
 
08.05.15
15:56
(44) молодец, чё :)
46 Эльниньо
 
08.05.15
16:02
(45) Это из серии:
Если Флаг = 1 Тогда
Флаг = 0;
Иначе
Флаг = 1;
КонецЕсли;

Флаг = 1 - Флаг;
47 bazvan
 
08.05.15
16:10
(34) хм есть одна странность. Поля в ТЧ можно добавить (те которые через точку, но вот сортировки по ним не срабатывают
48 palpetrovich
 
08.05.15
16:10
(46) кста результаты для 100000 строк ТЗ с условием
Пока ТЗ.Значение%2 = 0 Цикл
Алгоритм Эльниньо, время 2145
Алгоритм ОбратныйЦикл, время 2503
Алгоритм Получитьстрокупономеру, время 2351
Алгоритм Эльниньо, время 1931
Алгоритм ОбратныйЦикл, время 2100
Алгоритм Получитьстрокупономеру, время 2237
Алгоритм Эльниньо, время 1793
Алгоритм ОбратныйЦикл, время 2206
Алгоритм Получитьстрокупономеру, время 2278
:)
49 palpetrovich
 
08.05.15
16:11
(47) ну, наверное потому-как "через точку" - эт другие таблицы уже
50 Эльниньо
 
08.05.15
16:12
(47) * - сортировать по внутреннему значению
51 bazvan
 
08.05.15
16:16
(49) ну как бе да.
Но добавить можно на форму все что угодно
52 bazvan
 
08.05.15
16:18
(50) в снеговике на упр форма можно все что через точку повытаскивать на форму без изменения формы в конфигураторе.
Грубо говоря комментарий к договору можно вытащить (в пользовательском режиме) или коментарий к номенклатуре в ТЧ или например МОЛа у склада
53 Масянька
 
08.05.15
16:20
(52) Звезду отдай :)
54 bazvan
 
08.05.15
16:21
Хотя не МОЛа не дает, так как это не реквизит склада
55 Garykom
 
гуру
08.05.15
16:27
(48) "не верю" в смысле надо бы глянуть что там у вас за алгоритмы

и где удаление строк с добавлением нужных из ТЗ?
56 palpetrovich
 
08.05.15
16:33
(55) верю, неверю ...развели тут ромашку панимаш :)

Перем ТЗисх;
Процедура ПриОТкрытии()
    ТЗисх = СоздатьОбъект("ТаблицаЗначений");
    ТЗисх.НоваяКолонка("Значение", "Число", 2, 0);
    Для Инд = 1 По 100000 Цикл
        ТЗисх.НоваяСтрока();
        ТЗисх.Значение = Инд;
    КонецЦикла;
КонецПроцедуры // ПриОТкрытии
Процедура Сформировать()
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗисх.Выгрузить(ТЗ);
    //ТЗ.ВыбратьСтроку(,"Уаляем четные строки");
    нач = _GetPerformanceCounter();
    ТЗ.выбратьстроки();
    Пока ТЗ.получитьстроку()=1 Цикл
        Пока ТЗ.Значение%2 = 0 Цикл // четное
            ТЗ.удалитьстроку();
            Если ТЗ.НомерСтроки = 0 Тогда
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;    
    кон = _GetPerformanceCounter();
    кон = кон - нач;
    Сообщить("Алгоритм Эльниньо, время " + кон);
    //ТЗ.ВыбратьСтроку(,"Результат");
КонецПроцедуры
Процедура ОбратныйЦикл()
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗисх.Выгрузить(ТЗ);
    нач = _GetPerformanceCounter();
    Для Индекс = -ТЗ.КоличествоСтрок() По -1 Цикл
        ТЗ.ПолучитьСтрокуПоНомеру(-Индекс);
        Если ТЗ.Значение%2 = 0 Тогда
            ТЗ.УдалитьСтроку();
        КонецЕсли;
    КонецЦикла;    
    кон = _GetPerformanceCounter();
    кон = кон - нач;
    Сообщить("Алгоритм ОбратныйЦикл, время " + кон);
КонецПроцедуры // ОбратныйЦикл
Процедура Получитьстрокупономеру()
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗисх.Выгрузить(ТЗ);
    всего = ТЗ.Количествострок();        
    сч=1;        
    нач = _GetPerformanceCounter();
    Пока сч <= всего Цикл        
        ТЗ.Получитьстрокупономеру(сч);
        Если ТЗ.Значение%2 = 0 тогда
            ТЗ.Удалитьстроку(сч);
            всего = всего - 1;
        Иначе
            сч=сч+1;
        КонецЕсли;    
    Конеццикла;
    кон = _GetPerformanceCounter();
    кон = кон - нач;
    Сообщить("Алгоритм Получитьстрокупономеру, время " + кон);
КонецПроцедуры // ОбратныйЦикл
57 palpetrovich
 
08.05.15
16:35
+(56) млин, ашипка, "2" - маловато будет  :)
ТЗисх.НоваяКолонка("Значение", "Число", 2, 0);
    Для Инд = 1 По 100000 Цикл
58 palpetrovich
 
08.05.15
16:37
(55) прав, с учетом (56), для 10000
Алгоритм Эльниньо, время 726
Алгоритм ОбратныйЦикл, время 520
Алгоритм Получитьстрокупономеру, время 814
Алгоритм Эльниньо, время 710
Алгоритм ОбратныйЦикл, время 525
Алгоритм Получитьстрокупономеру, время 757
Алгоритм Эльниньо, время 678
Алгоритм ОбратныйЦикл, время 542
Алгоритм Получитьстрокупономеру, время 814
59 Эльниньо
 
08.05.15
16:38
(55) Грамотнее отделить мух от котлет.
Сначала удалить. Потом добавить.
60 Garykom
 
гуру
08.05.15
16:39
(58) во!
61 Garykom
 
гуру
08.05.15
16:41
(59) хорош уже, алгоритма то иная

1 копируем нужные в ТЗ
2 док.УдалитьСтроки();
3 добавляем все из ТЗ
62 Эльниньо
 
08.05.15
16:47
(61) Мдяяя...
63 palpetrovich
 
08.05.15
16:50
короче так, Эльниньо, ну тебя, разводильщик  :)

Процедура КопироватьвТЗ()
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗисх.Выгрузить(ТЗ);
    ТЗрез = СоздатьОбъект("ТаблицаЗначений");
    ТЗрез.НоваяКолонка("Значение", "Число", 9, 0);
    нач = _GetPerformanceCounter();
    ТЗ.выбратьстроки();
    Пока ТЗ.получитьстроку()=1 Цикл
        Если ТЗ.Значение%2 <> 0 Тогда
            ТЗрез.НоваяСтрока();
            ТЗрез.Значение = ТЗ.Значение;
        КонецЕсли;
    КонецЦикла;    
    кон = _GetPerformanceCounter();
    кон = кон - нач;
    Сообщить("Алгоритм КопироватьвТЗ, время " + кон);
КонецПроцедуры


Алгоритм ОбратныйЦикл, время 518
Алгоритм Эльниньо, время 712
Алгоритм Получитьстрокупономеру, время 806
Алгоритм КопироватьвТЗ, время 235
Алгоритм ОбратныйЦикл, время 509
Алгоритм Эльниньо, время 755
Алгоритм Получитьстрокупономеру, время 795
Алгоритм КопироватьвТЗ, время 253
Алгоритм ОбратныйЦикл, время 480
Алгоритм Эльниньо, время 743
Алгоритм Получитьстрокупономеру, время 737
Алгоритм КопироватьвТЗ, время 247
64 Эльниньо
 
08.05.15
16:55
(63) Я не говорил, что мой алгоритм самый быстрый. Я сказал - изящный.
Он в своё время не прошёл конкурс на лучший алгоритм из-за скорости.
Для ТЗ в пределах 10000 строк - самое то.
65 RomanYS
 
08.05.15
17:02
(44)  (64) интересно, то, что ТЗ при удалении строки позиционируется на следующую строку - это задокументированное поведение?
Просто, например, выборки из справочников/документов в клюшках падали, если в их обходе удалить элемент
66 Эльниньо
 
08.05.15
17:06
(65) Незадокументированное, но вполне логичное.
Иначе или вылет из цикла и бесконечный
67 Garykom
 
гуру
08.05.15
17:09
(65) Вы не знаете известную в 77 фишку с "ВыбратьПоНаименованию"?

Штатный "НайтиПоНаименованию" только 1-го находит а дубли то как?

Так есть замечательный хак с транзакцией, найти, удалить и снова найти ))
68 RomanYS
 
08.05.15
17:49
(66) если бы 1с делала все "как логичнее", может и форума бы этого не было.
А вот "иначе" бывает часто...
69 Злопчинский
 
08.05.15
18:12
(36) то есть штатно или почти "штатно" - нельзя.. пичалька.. так я и думал.. дутый дотком этот снеговик...
70 Злопчинский
 
08.05.15
18:15
ТЗ.Значение%2
весьма тормозная операция кстати
71 vladimirmir2012
 
09.05.15
06:37
Делаю так /не мой способ, но понравился/.

VpTemp = "";

докНачислениеИзноса.ВыгрузитьТабличнуюЧасть( VpTemp );

итзТаб01 = СоздатьОбъект( "ИндексированнаяТаблица" );

итзТаб01.Загрузить( VpTemp, "", ""   );

итзТаб01.НоваяКолонка( "flNoDel" );

Далее в цикле по строкам из итзТаб01 устанавливаю флаг flNoDel в единицу для строк, которые не нужно удалять
/и подсчитываю их количество cntNoDel/

итзТаб01.Сортировать( "flNoDel" );

тзРезульт = СоздатьОбъект( "ТаблицаЗначений" );

итзТаб01.Выгрузить( тзРезульт, 1, cntNoDel );

докНачислениеИзноса.УдалитьСтроки();
  
докНачислениеИзноса.ЗагрузитьТабличнуюЧасть(  
  тзРезульт
);
72 vladimirmir2012
 
09.05.15
06:42
(71) Не флаг flNoDel устанавливаю в единицу для строк, которые нужно удалить.
Ну вообщем можно сказать привел только идею, а детали - за вами ...
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший