gifts2017

[CLEAN] Быстрая очистка ТЗ от ненужных строк

Опубликовал Сергей (Che) Коцюра (CheBurator) в раздел Программирование - Практика программирования

Зачастую надо очистить ТЗ от "ненужных" строк. Очистку строк проводим просто: не делаем ТЗ.УдалитьСтроку() - это будеть съедать 90% времени обработки, а применяем накопленный опыт и исследования, проведенные хорошими людьми (в частности, на proclub.ru) - и получаем быструю очистку ТЗ.

Зачастую надо очистить ТЗ от "ненужных" строк. Очистку строк проводим не так просто, как нам сразу хочется: не делаем ТЗ.УдалитьСтроку() - это будет съедать 90% времени обработки, а применяем накопленный опыт и исследования, проведенные хорошими людьми (в частности, на proclub.ru) - и получаем быструю очистку ТЗ.

Порядок действий:
1. Добавляем в ТЗ колонку "НадоУдалить" ( число, 1) - сюда записываем 1 если данную строку следует убрать из ТЗ и 0 - если надо оставить (если такая колонка уже есть, но с другим именем - пойдет и она). Установка данного флажка происходит во время обхода ТЗ в цикле (вопрос быстрой установки данного флажка пока не обсуждаем - в каждом конкретном случае применяем нужный нам алгоритм)
2. вызываем процедуру очистки ТЗ:

глОчисткаТЗ(ТЗ, ОПС="###", "НадоУдалить")


В результате получаем очищенную от ненужных строк ТЗ.
В текстовом файле приведена процедура, которую следует вставить в глобальный модуль. В описании процедуры - подробная информация о составе и назначении передаваемых параметров.

Процедура универсальная, можно использовать в любой конфигурации.
Спасибо всем, кто нас учит/учил.

Сделал давно, практически с малыми изменениями (или без таковых - уже не помню) по материалам http://1c.proclub.ru/modules/mydownloads/personal.php?lid=1419&cid=110 - Конкурс: самый быстрый вариант удаления ненужных строк из Таблицы Значений., автор: mszsuz, http://1c.proclub.ru/userinfo.php?uid=2823


Если понравилось/пригодилось - не забываем плюсовать рейтинг.

Скачать файлы

Наименование Файл Версия Размер
очистка ТЗ 142
.txt 1,76Kb
25.09.09
142
.txt 1,76Kb Бесплатно

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Михаил (mdzen) 22.06.06 10:36
Просто и со вкусом.
Спасибо автору.
2. Че Бурашка 22.06.06 11:00
Вообщем-то это трудно назвать авторством, ибо это не я придумал - это, так сказать, общенациональное достояние, оформленное в процедуру.
Буду выкладывать и впредь мелкие и большие полезные процедуры и приемы программирования.
3. Шайехов Алмаз Ольфатович Шайехов (Diamond) 18.07.06 20:28
Помню на hippo этот "конкурс". Сколько вариантов было?
4. Сhe Burashka (CheBurator) 18.07.06 22:06
Вариантов было много, этот самый быстрый. Обработка с о сравнение разных конкурсных вариантов лежит на проклабе.
Можно еще его чуток ускорить если вместо ТЗ.Выгрузить() использовать ТЗ.Заполнить ()- так, по крайней мере, утверждается в той же конкурсной обработке - смотрите на проклабе.
5. Sergey (ra9000) 09.11.06 16:37
У меня Таблица занимает 120'000 строк 15 колонок
Строка "ТЗРаб.Сортировать("+"+КолонкаУдалить);" - работает убийственно долго... :(
Пришлось написать код в 7 строк для удаления ненужной строки, и для удаления всех остальных кроме нужных в 15 строк.
На больших объемах производительность увеличилась в разы...:)
6. Sergey (ra9000) 09.11.06 16:40
стр="";
знач1=тзтт.получитьзначение(тзтт.текущаястрока(),тзтт.текущаяколонка());
пока тзтт.НайтиЗначение((знач1),стр,тзтт.текущаяКолонка())=1 цикл
тзтт.удалитьстроку(стр);
стр="";
конеццикла;
7. Сhe Burashka (CheBurator) 09.11.06 17:31
Хотелось бы узнать - сколько строк ты удаляешь из своей ТЗ в 120'000 строк?
попробуй удали 100'000 строк и замерь время выполнения по своему алгоритму и по оригинальному.
с интересом жду результата...
9. Сhe Burashka (CheBurator) 12.12.06 22:09
10. MacLEOD (MacLEOD) 27.02.09 14:19
А вот так:

Для т = -ТЗ.КоличествоСтрок() По -1 Цикл
ТЗ.ПолучитьСтрокуПоНомеру(-т);
Если ТЗ.НеНадо = 1 Тогда
ТЗ.УдалитьСтроку(-т);
КонецЕсли;
КонецЦикла;

И вообще - не надо для этого в ТЗ проставлять "1", сразу условие проверяем и все.
11. Алексей Плутенко (Noy) 27.02.09 14:24
(10) ты просто не сталкивался с большими ТЗ
12. Сhe Burashka (CheBurator) 27.02.09 14:34
13. DarkAn DarkAn (DarkAn) 17.08.09 14:08
(10) Удаление по строкам уже давно доказано что работает МЕДЛЕННО!! надо делать все одним разом. как в примере. Производительность твоей обработки будет тормозить линейным способом и напрямую зависить от количества записей. А предложеннеым алгоритмом при добавлении еще 100 000 строк замедления будут незначительными :)

я сам реализацию этого алгоритма увидел года 3 назад, на проклабе, с тех пор только им и пользуюсь :) чуть геморней, зато работает ух как быстро.

PS(офф топ) Тут столкнулся с такой проблемой, всегда думал что "выгрузить в ТЗ" работает быстро, но в ЗиК понял, что не совсем. В частности выгрузка проводок (2к сотров) делается более 9 часов и весь тормоз именно из-за "Выгрузить", все руки не доходят разобраться с этой бедой, притом проблема точно связана с переходящими отпусками. хотя отчет по проводкам формируется всего 15-20 мин. :(
14. Сергей (Che) Коцюра (CheBurator) 17.08.09 14:52
(13) вместо Откуда.Выгрузить(Куда);
пользуйся Куда.Заполнить(Откуда....)
.
опять же выгрузка проводок откуда куда? в хмлфайл?
2 тыс сотрудников - это прямым перебором построчным выгрузить можно быстро...
15. Артур Аюханов (artbear) 17.08.09 16:17
(0) 1. Правило хорошего тона - все-таки выкладывать ссылку на исходную разработку :)
ЗЫ или проклаб на ИС во врагах сидит? :)
Если враги, можно в личку ссылку напомнить - за давностью лет ссылку утерял :)

ЗЗЫ интересно, в 8 кто-нибудь подобное тестил?
16. Сергей (Che) Коцюра (CheBurator) 17.08.09 16:26
нет, не во врагах.
в проклабе найти еще сложнее чем на Исе по-моему... кто знает ссылку - сообщите, пристегнй
17. DarkAn DarkAn (DarkAn) 17.08.09 16:45
(14) Ну то что 2к сотров это еще не значит что в ТЗ 2к строк ;). Ладно попробую через Загрузить, посмотрим что выйдет :)
18. Артур Аюханов (artbear) 18.08.09 07:44
(16) Главное - знать, что искать :)
Первый же результат по "конкурс на удаление строк из таблицы значений"
http://1c.proclub.ru/modules/mydownloads/personal.php?lid=1419&cid=110