|   |   | 
| 
 | 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 устанавливаю в единицу для строк, которые нужно удалить.
 Ну вообщем можно сказать привел только идею, а детали - за вами ... | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |