Удаление строк из таблицы значений по критерию

05.11.08

Разработка - Механизмы платформы 1С

Удаление строк из таблицы значений по критерию
На днях задали вопрос: а как удалить строки из таблицы значений по какому-то условию? вопрос конечно простой, но когда "горит", то... поэтому всегда под рукой следующий алгоритм:
всего=ТЗ.Количествострок();		
сч=1;		

пока сч<=всего цикл		
	

состояние

("Обработка строк: "+строка(сч)+" из "+строка(всего));
ТЗ.Получитьстрокупономеру(сч);
Если   <условие>   тогда

ТЗ.Удалитьстроку(сч);
		

всего = всего -1;
	

Иначе

сч=сч+1;
	
КонецЕсли;	
Конеццикла;
Может кто как-то еще сие выполняет?

См. также

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

В статье расписаны примеры из жизни использования "Виртуального" работника. Разобраны вопросы, возникающие при работе с ним.

28.11.2021    1827    user707242_Gold_karas    18    

5

Механизмы платформы 1С Программист Платформа 1С v7.7 Абонемент ($m)

Пример построения программного кода для достижения функционала обратных вызовов (call back) во внешних обработках исключительно штатными средствами. Тестировалось на платформе 1с77 релиз 027. Конфигурация значения не имеет.

1 стартмани

06.10.2018    7780    Vortigaunt    5    

11

Механизмы платформы 1С Программист Оперативный учет 7.7 Абонемент ($m)

Когда занимаешься разработкой в среде 1С, редко задумываешься о том, что программным кодом ты работаешь с объектной моделью базы данных, а не с самой базой данных. И что это вообще разные вещи. Ты создаешь объекты: документы и справочники, записываешь их - и в базе данных появляются соответствующие записи. Это настолько привычно, что когда сталкиваешься с нетипичным поведением платформы, первым делом думаешь: надо протестировать базу, она битая. В этой статье я хочу разобрать одну интересную ситуацию, которая как раз демонстрирует такое поведение. Описанная ниже ситуация воспроизводится как в файловом, так и в клиент-серверном (SQL) варианте. Тестировалось на версии платформы 1с77 релиз 027.

1 стартмани

16.05.2018    10455    Vortigaunt    26    

5

Механизмы платформы 1С Программист Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    95855    Serginio    116    

188

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

В 1С 8 наличие картинок товаров предусмотрено изначально, а в 7.7 такого нет. Проблема существует и ее исправляют, но это, как правило, частные случаи, касающиеся, например, печати прайса http://infostart.ru/public/289876/ , показу картинок в справочнике номенклатура http://infostart.ru/public/17125/, файловый менеджер картинок товара http://infostart.ru/public/15239/ или просто конфигурации работы с картинками http://infostart.ru/public/21142/ (не стремился дать полный обзор, поэтому не попавшие не обижайтесь :). Что не устроило – информация разбросана по статьям, необходимость дополнительно напрягаться, чтобы это заработало. Здесь я попытался собрать все «до кучи», а так же дать необходимые ссылки для желающих «копнуть вглубь».

1 стартмани

18.11.2014    44802    95    kitminsk    18    

20

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?

24.07.2014    24217    tomvlad    5    

14

Механизмы платформы 1С Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

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

02.07.2012    18940    maxpiter    62    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. noblekey 98 05.11.08 11:21 Сейчас в теме
Можно так
СтруктураОтбора = Новый Структура("Наименование реквизита", Егозначение);// задаем условия
МассивСтрок = ЭтотОбъект.Товары.НайтиСтроки(СтруктураОтбора);
Для Каждого ЭлементМассив Из МассивСтрок Цикл
ЭтотОбъект.Товары.Удалить(ЭлементМассив); //удаляем строки
КонецЦикла;
Santa1; user712426; request4t; kabantus; InJey; Renova-IT; prog1c_vl; avmironov; Rabin; EvgeTrofi; Vary; hottik; Touch_Of_Soul; lenokv_07; ansonat; Rega; futuar; shaykhelov; Sandro1C; rrustam11983; user591389_aska_rabota; olezhe; it-volna.com; ice666999; antonius888; Mechanik21; Valerianich; аколит; Геннадьевич; pauk.; Craig; azat_3; user764709; alexandrmishinn; +34 Ответить
5. shard 281 05.11.08 11:54 Сейчас в теме
(1) под семерку не пойдет ;)
(3) благодарю за ссылку
42. user764709 21.02.19 12:23 Сейчас в теме
(1)
МассивСтрок = ЭтотОбъект.Товары.НайтиСтроки(СтруктураОтбора);
Для Каждого ЭлементМассив Из МассивСтрок Цикл
ЭтотОбъект.Товары.Удалить(ЭлементМассив); //удаляем строки
КонецЦикла;

Очень помогло, спасибо)
43. futuar 19.01.22 08:34 Сейчас в теме
(1) Спасибо! Очень удобный способ. Только чуть уменьшил количество строк:
Для Каждого ЭлементМассив Из ЭтотОбъект.Товары.НайтиСтроки(Новый Структура("Наименование реквизита", Егозначение)) Цикл
ЭтотОбъект.Товары.Удалить(ЭлементМассив); //удаляем строки
КонецЦикла;
2. Vitek 05.11.08 11:31 Сейчас в теме
Эта тема по моему уже затерта до дыр.
Мне больше всего понравился способ от NS.
simuljakr; +1 Ответить
4. Ёпрст 1065 05.11.08 11:46 Сейчас в теме
(2) Мне от TDV больше радует...
3. Ёпрст 1065 05.11.08 11:44 Сейчас в теме
Автор, выкинь свой алгоритм в топку, смотри, как надо:

http://www.sinor.ru/~my1c/knowhow/delstrtz.html
6. shard 281 05.11.08 12:38 Сейчас в теме
проверил код из темы в (3). неожиданно хороший результат по второму набору (все удовлетворяют условию)))). вывод - неплохо будет работать когда процент удаляемых значений мал из-за большого времени отработки строки "ТЗ.Удалитьстроку(сч);"
7. alexk-is 6544 05.11.08 15:26 Сейчас в теме
Я шесть лет назад участвовал в этом конкурсе...
Поэтому есть одно, но существенное замечание. Тест на 10 элементах не показывает ошибки сортировки. Ошибки вылазят на 20 элементах теста. Т.е. изменяется первоначальный порядок строк...

Предлагаю вариант проверки на 20 строках и 2 новых способа от alexk aka alexk-is:

Код
// Прошу прощения на несколько сумбурно организованную программу.
// Она периодически дополняется разными штуками, которые "в начале пути" не предусматривались.
// Переписывать заново нет времени да и особого желания - работает и ладно ...

Перем ТЗ;  // на этой таблице все и проверяем
Перем ТЗРезультаты;         
Перем БылПрерван;
Перем НомерНабора;

//*******************************************
// вспомогательная процедура ROM 
Функция СложитьТаблицы(ТЗ1,ТЗ2)
   Если ТЗ2=0 Тогда
      Возврат ТЗ1;
   КонецЕсли;
   Если ТЗ1=0 Тогда
      Возврат ТЗ2;
   Иначе
      ДоЭтогоСтрок=ТЗ1.КоличествоСтрок();
      Если ТЗ2.КоличествоСтрок()<>0 Тогда
         Для Ном=1 По ТЗ2.КоличествоСтрок() Цикл
            ТЗ1.НоваяСтрока();
         КонецЦикла;
         ТЗ1.Заполнить(ТЗ2,ДоЭтогоСтрок+1);
      КонецЕсли;
      Возврат ТЗ1;
   КонецЕсли;
КонецФункции                                
//*******************************************
Функция УсловиеВыполняется(Значение)
    Возврат ?(Значение<МаксЗнач/2,1,0); 
КонецФункции
//******************************************* // здесь по аналогии добавьте Ваш вариант обработки
Функция ФильтроватьТЗ(Вариант="")         
   Перем ТЗ_СЛУЖ,СтрокКода;
   Перем массив[1000000]; // для NefedovSergey
   СтрокКода=0;    
   Если Вариант="mszsuz" Тогда    // ************************************ mszsuz 18 строк 
      // оптимизированный avb вариант, примечания его же
      КолСтр=ТЗ.КоличествоСтрок();
      ТЗ.НоваяКолонка("СЛУЖ_КОЛ"); //если тип, вообще, не определять работает быстрее
      ТЗ.Выбратьстроки();
      НачСтрока=0;
      Пока ТЗ.Получитьстроку()=1 Цикл
         Если УсловиеВыполняется(ТЗ.К)=1 Тогда
            НачСтрока=НачСтрока+1;
            ТЗ.СЛУЖ_КОЛ=1; //номер строки тоже необязательно
         КонецЕсли;
      КонецЦикла;                      
      ТЗ.Сортировать("СЛУЖ_КОЛ"); //"плюс" похоже не тормозит, но я убрал 
      ТЗ.УдалитьКолонку("СЛУЖ_КОЛ");
      Если НачСтрока=0 Тогда
         ТЗ.УдалитьСтроки(); 
      ИначеЕсли НачСтрока<=КолСтр тогда
         ТЗ.Выгрузить(ТЗ_СЛУЖ,КолСтр-НачСтрока+1); //работает быстрее, если третий параметр не указывать, а здесь его как раз можно опустить 
         ТЗ_СЛУЖ.Выгрузить(ТЗ);
      КонецЕсли; 
      СтрокКода=18;
   ИначеЕсли Вариант="VVS" тогда // ************************************ VVS  
      КолСтр=ТЗ.КоличествоСтрок();
      ТЗ.НоваяКолонка("СЛУЖ_КОЛ","Число",СтрДлина(Строка(КолСтр))+1);
      ТЗ.Выбратьстроки();
      НачСтрока=0;
      Пока ТЗ.Получитьстроку()=1 Цикл
         Если УсловиеВыполняется(ТЗ.К)=1 Тогда
            НачСтрока=НачСтрока+1;
            ТЗ.СЛУЖ_КОЛ=-ТЗ.НомерСтроки;
         КонецЕсли;
      КонецЦикла;
      Если НачСтрока*2<КолСтр Тогда
         ТЗ.Сортировать("-СЛУЖ_КОЛ");
         ТЗ.УдалитьКолонку("СЛУЖ_КОЛ");
         Если НачСтрока=0 Тогда
            ТЗ.УдалитьСтроки();
         ИначеЕсли НачСтрока<КолСтр тогда
            ТЗ.Выгрузить(ТЗ_СЛУЖ,КолСтр-НачСтрока+1,КолСтр);
            ТЗ_СЛУЖ.Выгрузить(ТЗ);
         КонецЕсли;
      Иначе
         ТЗ.Сортировать("+СЛУЖ_КОЛ");
         ТЗ.УдалитьКолонку("СЛУЖ_КОЛ");
         Если НачСтрока=0 Тогда
            ТЗ.УдалитьСтроки();
         ИначеЕсли НачСтрока<КолСтр тогда
            ТЗ.Выгрузить(ТЗ_СЛУЖ,1,НачСтрока);
            ТЗ_СЛУЖ.Выгрузить(ТЗ);
         КонецЕсли;
      КонецЕсли;
      СтрокКода=29;
   ИначеЕсли Вариант="Serpent" Тогда   // 07.06.02 ************************************ Serpent  
      ТЗ_Получ = СоздатьОбъект("ТаблицаЗначений");
      ТЗ.Выгрузить(ТЗ_Получ,1,1);
      ТЗ_Получ.УдалитьСтроки();
      СЗ_Служ = СоздатьОбъект("СписокЗначений");
      НачалоБлока = 0;
      ТЗ.Выбратьстроки();
      Пока ТЗ.Получитьстроку()=1 Цикл
         Если УсловиеВыполняется(ТЗ.К)=1 Тогда
            Если НачалоБлока = 0 Тогда
               // начинаем   новый блок данных
               НачалоБлока = ТЗ.НомерСтроки;
            КонецЕсли;
         Иначе
            // запишем блок данных
            Если НачалоБлока > 0 Тогда
               НомерПервойСтрокиБлока = ТЗ_Получ.КоличествоСтрок() + 1;
               НовыйРазмерТаблицы = ТЗ.НомерСтроки - НачалоБлока + ТЗ_Получ.КоличествоСтрок();
               ТЗ_Получ.КоличествоСтрок(НовыйРазмерТаблицы);
               ТЗ.Выгрузить(ТЗ_Служ,НачалоБлока,ТЗ.НомерСтроки-1);
               ТЗ_Получ.Заполнить(ТЗ_Служ,НомерПервойСтрокиБлока);
               НачалоБлока = 0;
            КонецЕсли;
         КонецЕсли;
      КонецЦикла;
      Если НачалоБлока > 1 Тогда
         // остался последний блок данных -    перенесем его в ТЗ
         НомерПервойСтрокиБлока = ТЗ_Получ.КоличествоСтрок() + 1;
         НовыйРазмерТаблицы = МаксЗнач -   НачалоБлока + ТЗ_Получ.КоличествоСтрок() + 1;
         ТЗ_Получ.КоличествоСтрок(НовыйРазмерТаблицы);
         ТЗ.Выгрузить(ТЗ_Служ,НачалоБлока,МаксЗнач);
         ТЗ_Получ.Заполнить(ТЗ_Служ,НомерПервойСтрокиБлока);
      ИначеЕсли НачалоБлока = 1 Тогда
         // вся ТЗ удовлетворяет условию
         Возврат 35;
      КонецЕсли;
      Если ТЗ_Получ.КоличествоСтрок()=0 Тогда
         ТЗ.УдалитьСтроки(); 
      Иначе
         ТЗ_Получ.Выгрузить(ТЗ);
      КонецЕсли;
      СтрокКода=35;
   ИначеЕсли Вариант="Diamond" Тогда // ************************************ Diamond 6 строк
      Кол=ТЗ.КоличествоСтрок();
      Для А=-Кол По -1 Цикл
         Если УсловиеВыполняется(ТЗ.ПолучитьЗначение(-А,"К"))=0 Тогда
            ТЗ.УдалитьСтроку(-А);
         КонецЕсли;
      КонецЦикла;
      СтрокКода=6;
   ИначеЕсли Вариант="GaninY" Тогда // ************************************ GaninY 14 строк
      ТЗ1=СоздатьОбъект("ТаблицаЗначений");
      ТЗ.Выгрузить(ТЗ1,?(ТЗ.КоличествоСтрок()=0,"",1),?(ТЗ.КоличествоСтрок()=0,"",1));
      ТЗ1.УдалитьСтроки();
      Колонок=ТЗ.КоличествоКолонок();
      ТЗ.ВыбратьСтроки();
      Пока ТЗ.ПолучитьСтроку()=1 Цикл
          Если УсловиеВыполняется(ТЗ.К)=1 Тогда
              ТЗ1.НоваяСтрока();
            Для Нум=1 По Колонок Цикл
                ТЗ1.УстановитьЗначение(ТЗ1.НомерСтроки,Нум,ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,Нум));
            КонецЦикла;
          КонецЕсли;
      КонецЦикла;
      ТЗ=ТЗ1;
      СтрокКода=14;
   ИначеЕсли Вариант="slavic" Тогда // 15.09.2002 ************************************ slavic
      с1=0; 
      с2=0; 
      кк=Тз.КоличествоКолонок(); 
      Тз.ВыбратьСтроки(); 
      Пока Тз.ПолучитьСтроку()=1 Цикл 
         с1=с1+1; 
         Если УсловиеВыполняется(Тз.К)=1 Тогда 
            с2=с2+1; 
            Если с2<с1 Тогда 
               Для к=1 По кк Цикл 
                  Тз.УстановитьЗначение(с2,к,Тз.ПолучитьЗначение(с1,к)); 
               КонецЦикла; 
            КонецЕсли; 
         КонецЕсли; 
      КонецЦикла; 
      Тз.КоличествоСтрок(с2); 
      СтрокКода=16;
   ИначеЕсли Вариант="Rom" Тогда   // 06,06,2002 ************************************ Rom
      ИнтервалыУдаления=СоздатьОбъект("СписокЗначений");
      ИнтервалыСохранения=СоздатьОбъект("СписокЗначений");
      ПерваяПозиция=1;
      УсловиеВыполнено=0;
      ВсегоСтрок=ТЗ.КоличествоСтрок();
      Для Ном=1 По ВсегоСтрок Цикл
         ТекущееУсловие=УсловиеВыполняется(ТЗ.ПолучитьЗначение(Ном,"К"));
         Если УсловиеВыполнено<>ТекущееУсловие Тогда
            // сменился флаг
            Если УсловиеВыполнено=0 Тогда
               // группа удаляемых элементов закончилась
               // Ном - первый не удаляемый
            Иначе
               // группа нормальных элементов закончилась
               // Ном - первый удаляемый
               ИнтервалыСохранения.ДобавитьЗначение(ПерваяПозиция,(Ном-1));
            КонецЕсли;
            ПерваяПозиция=Ном;
            УсловиеВыполнено=ТекущееУсловие;
         КонецЕсли;
      КонецЦикла;
      Если УсловиеВыполнено=0 Тогда
         // группа удаляемых элементов не закончилась
         // Ном - первый не удаляемый
      Иначе
         ИнтервалыСохранения.ДобавитьЗначение(ПерваяПозиция,(ВсегоСтрок));
      КонецЕсли;
      РезТЗ=0;
      ПозицияПо="";
      // теперь скопируем интервалы
      Для Ном=1 По ИнтервалыСохранения.РазмерСписка() Цикл
         ПозицияС=ИнтервалыСохранения.ПолучитьЗначение(Ном,ПозицияПо);
         ПозицияПо=Число(ПозицияПо);
         НоваяТЗ=СоздатьОбъект("ТаблицаЗначений");
         ТЗ.Выгрузить(НоваяТЗ,ПозицияС,ПозицияПо);
         РезТЗ=СложитьТаблицы(РезТЗ,НоваяТЗ);
      КонецЦикла;
      Если РезТЗ=0 Тогда
         ТЗ.УдалитьСтроки();
      Иначе
         РезТЗ.Выгрузить(ТЗ);
      КонецЕсли;  
      СтрокКода=34;
   ИначеЕсли Вариант="Чиканук" Тогда  // 21.06.02
      ГдеНеверный=0;
      ГдеВерный=0;
      ТЗ.НоваяКолонка("СЛУЖ_КОЛ","Число",СтрДлина(Строка(КолСтр))+1);
      СтрокаКолонок="";
      КоличествоКолонок=ТЗ.КоличествоКолонок();
      Для Счт=1 По КоличествоКолонок Цикл
         СтрокаКолонок=СтрокаКолонок+Счт+", ";
      КонецЦикла;
      ТЗ.Выбратьстроки();
      Пока ТЗ.Получитьстроку()=1 Цикл
         Если УсловиеВыполняется(ТЗ.К)=1 Тогда
            ТЗ.СЛУЖ_КОЛ=ТЗ.НомерСтроки;
            ГдеВерный=?(ГдеВерный=0,ТЗ.НомерСтроки,ГдеВерный);
         Иначе
            ГдеНеверный=?(ГдеНеверный=0,ТЗ.НомерСтроки,ГдеНеверный);
         КонецЕсли;
      КонецЦикла;
      Если ГдеВерный=0 Тогда
         ТЗ.УдалитьСтроки();
      ИначеЕсли ГдеНеверный>0 Тогда
//         ТЗ.ВыбратьСТроку();
         ТЗ.Свернуть("СЛУЖ_КОЛ, ",СтрокаКолонок);
//         ТЗ.ВыбратьСТроку();
         Если ГдеНеверный<=ТЗ.КоличествоСтрок() Тогда
            ТЗ.УдалитьСтроку(ГдеНеверный);
         КонецЕсли;
      КонецЕсли;
      ТЗ.УдалитьКолонку("СЛУЖ_КОЛ");
      СтрокКода=26;
   ИначеЕсли Вариант="TDV" Тогда   // 19,09,02
      КонСтрока=Мин(ТЗ.НоваяКолонка("СЛУЖ_КОЛ"), 0);  // (примечание mszsuz: вот такая "оптимизация" началась, ради "красоты" ...)
      ТЗ.ВыбратьСтроки();
      Пока ТЗ.ПолучитьСтроку()=1 Цикл
         Если УсловиеВыполняется(ТЗ.К)=1 Тогда
            КонСтрока=КонСтрока+1;
            ТЗ.СЛУЖ_КОЛ=1;
         КонецЕсли;
      КонецЦикла;                      
      Если (КонСтрока=0) ИЛИ (КонСтрока=ТЗ.КоличествоСтрок()) Тогда
         ТЗ.КоличествоСтрок(КонСтрока);
         ТЗ.УдалитьКолонку("СЛУЖ_КОЛ");
      Иначе
         ТЗ.Сортировать("-СЛУЖ_КОЛ");
         ТЗ.УдалитьКолонку("СЛУЖ_КОЛ");
         ТЗ.Выгрузить(ТЗ_СЛУЖ,,КонСтрока);
         ТЗ=ТЗ_СЛУЖ;
      КонецЕсли;
      СтрокКода=17;                          
   ИначеЕсли Вариант = "alexk v.1" Тогда // ************************************ alexk v.1 18.04.03
      КолСтр = ТЗ.КоличествоСтрок();
      КолКол = ТЗ.НоваяКолонка("СЛУЖ_КОЛ");
      НачСтрока = КолСтр;
      ТЗ.ВыбратьСтроки();
      Пока ТЗ.ПолучитьСтроку() = 1 Цикл
         Если УсловиеВыполняется(ТЗ.К) = 1 Тогда
            ТЗ.СЛУЖ_КОЛ = НачСтрока;
            НачСтрока = НачСтрока - 1;
         КонецЕсли;
      КонецЦикла;
      Если НачСтрока = 0 Тогда
         ТЗ.КоличествоКолонок(КолКол-1);
      ИначеЕсли НачСтрока = КолСтр Тогда
         ТЗ.КоличествоСтрок(0); 
         ТЗ.КоличествоКолонок(КолКол-1);
      Иначе
         ТЗ.Сортировать("-СЛУЖ_КОЛ");
         ТЗ.КоличествоКолонок(КолКол-1);
         ТЗ.Выгрузить(ТЗ_СЛУЖ,,КолСтр - НачСтрока);
         ТЗ = ТЗ_СЛУЖ;
      КонецЕсли; 
      СтрокКода = 21;             
   ИначеЕсли Вариант = "alexk v.2" Тогда // ************************************ alexk v.2 18.04.03
      КолСтр = ТЗ.КоличествоСтрок();
      НачСтрока = 0;
      ТЗ.ВыбратьСтроки();
      Пока ТЗ.ПолучитьСтроку() = 1 Цикл
         Если УсловиеВыполняется(ТЗ.К) = 1 Тогда
            НачСтрока = НачСтрока + 1;
            Массив[НачСтрока] = ТЗ.НомерСтроки;
         КонецЕсли;
      КонецЦикла;
      Если НачСтрока = КолСтр Тогда
      ИначеЕсли НачСтрока = 0 Тогда
         ТЗ.КоличествоСтрок(0);
      ИначеЕсли НачСтрока = Массив[НачСтрока] Тогда
         ТЗ.КоличествоСтрок(НачСтрока);
      ИначеЕсли НачСтрока = КолСтр - Массив[1] + 1 Тогда
         ТЗ.Выгрузить(ТЗ_СЛУЖ, Массив[1]);
         ТЗ = ТЗ_СЛУЖ;
      Иначе
         Кол = ТЗ.НоваяКолонка("СЛУЖ_КОЛ");
         Для А = 1 По НачСтрока Цикл
            ТЗ.УстановитьЗначение(Массив[А], Кол, А);
         КонецЦикла;   
         ТЗ.Сортировать(Кол);
         ТЗ.КоличествоКолонок(Кол - 1);
         ТЗ.Выгрузить(ТЗ_СЛУЖ, КолСтр - НачСтрока + 1);
         ТЗ = ТЗ_СЛУЖ; 
      КонецЕсли;
      СтрокКода = 27;
   ИначеЕсли Вариант = "mech" Тогда // ************************************ mech 19,09,02   
      Нов = СоздатьОбъект("ТаблицаЗначений");
      ТЗ.НоваяКолонка("НЕУдалять","Число");
      ТЗ.ВыбратьСтроки();
      Попытка
         ~Назад:
         ТЗ.ПолучитьСтроку();
         ТЗ.НЕУдалять = УсловиеВыполняется(ТЗ.К);
         ТЗ.ПолучитьСтроку();
         ТЗ.НЕУдалять = УсловиеВыполняется(ТЗ.К);
         Перейти ~Назад;
      Исключение
      КонецПопытки;
      Итоги =  ТЗ.Итог("НеУдалять");
      КолСтрок  = ТЗ.КоличествоСтрок();
      Если Итоги = 0  Тогда
         ТЗ.УдалитьКолонку("НеУдалять");
         ТЗ.УдалитьСтроки();
      ИначеЕсли КолСтрок = Итоги Тогда
         ТЗ.УдалитьКолонку("НеУдалять");
      Иначе
         ТЗ.Сортировать("Неудалять");
         ТЗ.УдалитьКолонку("НеУдалять");
         ТЗ.Выгрузить(Нов,КолСтрок - Итоги + 1,КолСтрок);
         //Нов.Выгрузить(ТЗ);
         ТЗ = Нов;
      КонецЕсли;
      СтрокКода=25;
   ИначеЕсли Вариант="NefedovSergey" Тогда   // Nefedov Sergey 07/11/2002 Nefedov_Sergei@mail.ru
      // Высылаю свой алгоритм, на моей машине, 
      //  он показывает первое место по быстродействию
      //  отладкой особо не занимался, и так хорошо !!!
      // поправку на количесво строк текста считаю глупостью.
      сч=0;    
      Констрока=0;              
      ТЗ.ВыбратьСтроки();       
      Пока ТЗ.ПолучитьСтроку()=1 Цикл   
         сч=сч+1;
         Если УсловиеВыполняется(ТЗ.К)=0 Тогда
            КонСтрока=КонСтрока+1;
            массив[КонСтрока]=сч;
         КонецЕсли;
      КонецЦикла;                      
      Если (КонСтрока=0) ИЛИ (КонСтрока=сч)или ((сч-констрока)=(массив[1]-1)) Тогда
         ТЗ.КоличествоСтрок(сч-КонСтрока);
      ИначеЕсли констрока=массив[констрока] тогда
         ТЗ.Выгрузить(ТЗ_СЛУЖ,констрока+1,);
         ТЗ=ТЗ_СЛУЖ;
      Иначе                        
         ТЗ.НоваяКолонка("СЛУЖ_КОЛ");
         кол=ТЗ.количествоколонок();
         для а=1 по КонСтрока цикл
               ТЗ.установитьзначение(массив[а],кол,1);
         конеццикла;   
         ТЗ.Сортировать("СЛУЖ_КОЛ");
         ТЗ.УдалитьКолонку("СЛУЖ_КОЛ");
         ТЗ.Выгрузить(ТЗ_СЛУЖ,,сч-КонСтрока);
         ТЗ=ТЗ_СЛУЖ; 
      КонецЕсли;
      СтрокКода=26;                     
   ИначеЕсли Вариант="NefedovSergey /NS/" Тогда   //  Nefedov_Sergei@mail.ru   
       ВсегоСтрок=Тз.КоличествоСтрок(ТЗ.КоличествоСтрок()+2); // добавим строки вспомогательные... 
       Тз.УстановитьЗначение(ВсегоСтрок+1,"К",максЗнач); //Пропишем туда неудаляемое и удаляемое значения...   
       Тз.УстановитьЗначение(ВсегоСтрок+2,"К",0); 
       ТЗ.ВыбратьСтроки();  // найдем первую оставляемую строку 
       Пока (ТЗ.ПолучитьСтроку()=1)и(УсловиеВыполняется(ТЗ.К)=0) Цикл   
       КонецЦикла;   
       НачалоПервогоБлока=Тз.НомерСтроки; 
       Если НачалоПервогоБлока>ВсегоСтрок Тогда 
           ТЗ.УдалитьСтроки(); // Значит возвращаемую пустую ТЗ 
       Иначе   // найдем первую удаляемую строку                   
           Пока (ТЗ.ПолучитьСтроку()=1)и(УсловиеВыполняется(ТЗ.К)=1) Цикл   
           КонецЦикла; 
           КонецПервогоБлока=ТЗ.НомерСтроки; 
           Если КонецПервогоБлока>ВсегоСтрок Тогда //До самого конца дошли 
               ТЗ.УдалитьСтроку(ВсегоСтрок+2); 
               ТЗ.УдалитьСтроку(ВсегоСтрок+1); 
               Если началоПервогоБлока>1 тогда 
                   ТЗ.Выгрузить(ТЗ_СЛУЖ,НачалоПервогоБлока); 
                   ТЗ=ТЗ_СЛУЖ; 
               КонецЕсли; 
           Иначе  // найдем начало следующего блока 
               ТЗ_Служ=создатьобъект("ТаблицаЗначений"); 
               ТЗ1=создатьобъект("ТаблицаЗначений"); 
               Пока (ТЗ.ПолучитьСтроку()=1)и(УсловиеВыполняется(ТЗ.К)=0) Цикл   
               КонецЦикла; 
               НачалоОчередногоБлока=ТЗ.НомерСтроки; 
               Если НачалоОчередногоБлока>ВсегоСтрок Тогда //В таблице один блок 
                   Если началопервогоблока>1 тогда 
                       ТЗ.Выгрузить(ТЗ_СЛУЖ,НачалоПервогоБлока,КонецПервогоБлока-1); 
                   Иначе     
                       ТЗ.Выгрузить(ТЗ_СЛУЖ,1,1); 
                       ТЗ_СЛУЖ.Количествострок(КонецПервогоБлока-1); 
                       ТЗ_СЛУЖ.Заполнить(ТЗ); 
                   КонецЕсли; 
                   ТЗ=ТЗ_СЛУЖ; 
               Иначе //Метод количествоСтрок() на уменьшение не использую - он часто работает неверно. 
                   ТЗ.УдалитьСтроку(ВсегоСтрок+2); 
                   ТЗ.УдалитьСтроку(ВсегоСтрок+1); 
                   ТЗ.НоваяКолонка("_Уд"); 
                   ТЗ.Заполнить(1,НачалоПервогоБлока,КонецПервогоБлока-1,"_Уд"); 
                   ТЗ._Уд=1;   
                   колстр=конецпервогоблока-началопервогоблока+1; 
                   Пока ТЗ.Получитьстроку()=1 Цикл 
                       Если УсловиеВыполняется(ТЗ.К)=1 Тогда 
                           ТЗ._Уд=1; 
                           колстр=колстр+1; 
                       КонецЕсли; 
                   КонецЦикла;   
                   ТЗ.Сортировать("-_Уд"); 
                   ТЗ.УдалитьКолонку("_Уд");     
                   ТЗ.Выгрузить(ТЗ_СЛУЖ,1,1); 
                   ТЗ_СЛУЖ.КоличествоСтрок(колстр); 
                   ТЗ_СЛУЖ.Заполнить(ТЗ); 
                   ТЗ=ТЗ_Служ; 
               КонецЕсли; 
           КонецЕсли; 
       КонецЕсли;   
       строкКода=57; 
      
   ИначеЕсли Вариант="Simod" Тогда // mailto:bezrukov@bs.omsk.org
      ТЗ.ПолучитьСтрокуПоНомеру(1);
      п_Условие       = УсловиеВыполняется(ТЗ.К);
      п_Блок          = 1;
      ТЗ.ВыбратьСтроки();
      Пока ТЗ.ПолучитьСтроку() = 1 Цикл
         Если УсловиеВыполняется(ТЗ.К) <> п_Условие Тогда
            Если п_Блок = 3 Тогда
               ТЗ.Фильтр       = 1;
            ИначеЕсли п_Блок = 1 Тогда
               п_НачБлока      = ?(п_Условие = 0, ТЗ.НомерСтроки, 1);  //           Начало блока
               п_КонБлока      = ?(п_Условие = 0, п_НачБлока, ТЗ.НомерСтроки - 1);     // Конец блока
               п_Условие       = ?(п_Условие = 0, 1, 0);
               п_Блок          = 2;
            ИначеЕсли п_Блок = 2 Тогда
               ТЗ.НоваяКолонка("Фильтр", "Число");
               ТЗ.Заполнить(1, п_НачБлока, ?(п_Условие = 0, п_КонБлока, ТЗ.НомерСтроки - 1),"Фильтр");
               ТЗ.Фильтр       = ?(п_Условие = 0, 1, 0);
               п_Условие       = 0;
               п_Блок          = 3;
            КонецЕсли;
         КонецЕсли;
      КонецЦикла;
      Если п_Блок = 1 Тогда
         Если п_Условие = 0 Тогда
            ТЗ.УдалитьСтроки();
         КонецЕсли;
      ИначеЕсли п_Блок = 2 Тогда
         Если п_Условие = 0 Тогда
            ТЗ.КоличествоСтрок(п_КонБлока);
         Иначе
            ТЗ_П    = СоздатьОбъект("ТаблицаЗначений");
            ТЗ.Выгрузить(ТЗ_П, п_НачБлока);
            ТЗ              = ТЗ_П;
         КонецЕсли;
      ИначеЕсли п_Блок = 3 Тогда
         ТЗ_П            = СоздатьОбъект("ТаблицаЗначений");
         ТЗ.Сортировать("-Фильтр");
         п_Итог          = ТЗ.Итог("Фильтр");
         ТЗ.КоличествоКолонок(ТЗ.КоличествоКолонок() - 1);
         ТЗ.Выгрузить(ТЗ_П, 1, 1);
         ТЗ_П.КоличествоСтрок(п_Итог);
         ТЗ_П.Заполнить(ТЗ);
         ТЗ = ТЗ_П;
      КонецЕсли;
      строкКода = 45;
   Иначе            
      Предупреждение("Неизвестный вариант: "+Вариант,3);
   КонецЕсли;
   Возврат СтрокКода;
КонецФункции
//*******************************************
Процедура СформироватьНаборДанных(ТипНабора) 
   // 1 тип значение в ТЗ=Номеру строки
   // 2 тип значение в ТЗ=1 - все удовлетворяют условию
   // 3 тип значение в ТЗ=КоличествоСтрок - ни одно не удовлетворяет условию
   // 4 тип чередуются 1 и КоличествоСтрок
   Если ТипНабора=1 Тогда
      Для нс=1 по МаксЗнач Цикл
         ТЗ.ПолучитьСТрокуПоНомеру(нс);
          ТЗ.К=нс;
      КОнецЦикла;
   ИначеЕсли ТипНабора=2 Тогда
      ТЗ.Заполнить(1);
   ИначеЕсли ТипНабора=3 Тогда
      ТЗ.Заполнить(МаксЗнач);
   ИначеЕсли ТипНабора=4 Тогда
      Для нс=1 по МаксЗнач Цикл
         ТЗ.ПолучитьСТрокуПоНомеру(нс);
          ТЗ.К=?(нс%2=0,1,МаксЗнач);
      КОнецЦикла;
   ИначеЕсли ТипНабора=5 Тогда  // предложил Rom
      // нечетные позиции увеличиваются, четные уменьшаются
      К=3;
      К1=К-1;
      Рез="";
      Для НС1=2 по МаксЗнач+1 Цикл   
         ПоловинаНС=Цел(НС1/2);      
         ТЗ.УстановитьЗначение(НС1-1,"К",?(НС1%2=0,ПоловинаНС,МаксЗнач-ПоловинаНС-К1));
      КонецЦикла;
   ИначеЕсли ТипНабора=6 Тогда // противоположный 1
      Для нс=0 по МаксЗнач-1 Цикл
         ТЗ.ПолучитьСТрокуПоНомеру(нс+1);
          ТЗ.К=МаксЗнач-нс;
      КОнецЦикла;      
   КонецЕсли;                           
   // заполним балласт
   Если ТЗ.КоличествоКолонок()>1 Тогда
      Для нс=1 по ТЗ.КоличествоСтрок() Цикл
         ТЗ.УстановитьЗначение(нс,"ЧБалласт",нс);
         ТЗ.УстановитьЗначение(нс,"СБалласт",Строка(нс));
      КонецЦикла;   
   КонецЕсли;
   // ТЗ.ВыбратьСтроку();  
КонецПроцедуры
//*******************************************
Функция ТЗ_2_Стр()
   СЗЗамен=СоздатьОбъект("СписокЗначений");
   СЗЗамен.ДобавитьЗначение(" ","");
   СЗЗамен.ДобавитьЗначение("Число","Ч");
   СЗЗамен.ДобавитьЗначение("Строка","С");
   СЗЗамен.ДобавитьЗначение("""","");
   СЗЗамен.ДобавитьЗначение("{Ч,0}","X");
   СЗЗамен.ДобавитьЗначение("БАЛЛАСТ","Б");
   СЗЗамен.ДобавитьЗначение("ТаблицаЗначений","ТЗ");
   ТЗ_2_Стр=ЗначениеВСтроку(ТЗ);
   Для нсСЗЗамен=1 по СЗЗамен.РазмерСписка() Цикл  
      Заменить="";
      Искать=СЗЗамен.ПолучитьЗначение(нсСЗЗамен,Заменить);
      ТЗ_2_Стр=СтрЗаменить(ТЗ_2_Стр,Искать,Заменить);
   КонецЦикла;   
    Возврат ТЗ_2_Стр;
КонецФункции
//*******************************************
Процедура СоздатьТЗ(Балласт=0)
   ТЗ=СоздатьОбъект("ТаблицаЗначений"); 
   ТЗ.НоваяКолонка("К","Число",15,0);
   Если Балласт<>0 тогда
      ТЗ.НоваяКолонка("ЧБАЛЛАСТ","Число",15,0);
      ТЗ.НоваяКолонка("СБАЛЛАСТ","Строка",15,0);
      //ТЗ.НоваяКолонка("ДБАЛЛАСТ","Дата");
   КонецЕсли;   
   ТЗ.КоличествоСтрок(МаксЗнач); 
КонецПроцедуры   
//******************************************* 
Процедура ВсеАвторы(Ф)
   Для нс=1 по СЗВарианты.РазмерСписка() Цикл
      СЗВарианты.Пометка(нс,ф);
   КонецЦикла;   
КонецПроцедуры   
//*******************************************
Функция ПолучитьСекунды()
   Возврат _GetPerformanceCounter();
КонецФункции   
// **************************************
Процедура График_Диаграмма1(Диаграмма)
   БылПрерван=1;
   ТЗРезультаты.КоличествоСтрок(0);
   Диаграмма.Обновление(0);
   Для НомерВарианта=1 по СЗВарианты.РазмерСписка() Цикл
      Если СЗВарианты.Пометка(НомерВарианта)=0 Тогда
         Продолжить;
      КонецЕсли;   
      Автор=СокрЛП(""+СЗВарианты.ПолучитьЗначение(НомерВарианта));
      ТЗРезультаты.НоваяСтрока();
      ТЗРезультаты.Автор=Автор;
      Диаграмма.УстановитьИмяСерии(ТЗРезультаты.КоличествоСтрок(),Автор);
      сообщить("************ Вариант "+Автор,"i");
      Для НомерНабора=1 по СЗНаборыДанных.РазмерСписка() Цикл  
         Если СЗНаборыДанных.Пометка(НомерНабора)=0 тогда
            Продолжить;
         КонецЕсли;                                          
         Набор="Набор "+НомерНабора;
         Диаграмма.УстановитьИмяТочки(НомерНабора,Набор);
//         сообщить("Набор: "+ТипНабора,"i");
//         сообщить("Заполнение ... ","i");
         СоздатьТЗ(1);
         СформироватьНаборДанных(НомерНабора);
//         сообщить("Фильтр ... ","i");
         ВремяВыполненияНабора=ПолучитьСекунды();
         СтрокКода=ФильтроватьТЗ(Автор); 
//         ТЗ.ВыбратьСТроку();
         ВремяВыполненияНабора=(ПолучитьСекунды()-ВремяВыполненияНабора)*?(РасчетПроизводительности=1,СтрокКода,1);
         Диаграмма.УстановитьЗначение(НомерНабора, ТЗРезультаты.КоличествоСтрок(), ВремяВыполненияНабора,Автор+", "+Набор+": "+ВремяВыполненияНабора+?(РасчетПроизводительности=1," оч."," ед.врем."));
         ТЗРезультаты.ОбщееВремяВыполнения=ТЗРезультаты.ОбщееВремяВыполнения+ВремяВыполненияНабора;         
         сообщить(Набор+" обрабатывался: "+ВремяВыполненияНабора+?(РасчетПроизводительности=1," оч."," ед.врем."));
      КонецЦикла;             
      сообщить("************ Всего выполнялось: "+ТЗРезультаты.ОбщееВремяВыполнения+?(РасчетПроизводительности=1," оч."," ед.врем."));
   КонецЦикла;
   Диаграмма.Обновление(1);
   БылПрерван=0;
КонецПроцедуры
// **************************************
Процедура График_Диаграмма2(Диаграмма) // общий итог
   БылПрерван=1;
   Диаграмма.Обновление(0);
   ТЗРезультаты.Сортировать("-ОбщееВремяВыполнения");
   Для НомерВарианта=1 по ТЗРезультаты.КоличествоСтрок() Цикл
      ТЗРезультаты.ПолучитьСТрокуПоНомеру(НомерВарианта);
      Автор=ТЗРезультаты.Автор;
      ОбщееВремяВыполнения=ТЗРезультаты.ОбщееВремяВыполнения;
      Диаграмма.УстановитьИмяСерии(НомерВарианта,Автор);
      Диаграмма.УстановитьИмяТочки(1,"Общее время выполнения");
      Диаграмма.УстановитьЗначение(1, НомерВарианта, ОбщееВремяВыполнения,Автор+": "+ОбщееВремяВыполнения);
   КонецЦикла;
   Диаграмма.Обновление(1);
   БылПрерван=0;
КонецПроцедуры
//*******************************************
Процедура Сформировать()
   Если фОчиститьОкноСообщений=1 тогда
      ОчиститьОкноСообщений();
   КонецЕсли;   
   сообщить("Начало тестирования на "+МаксЗнач+" элементов в ТЗ ...","!");
      Т = СоздатьОбъект("Таблица");
   Т.ИсходнаяТаблица("График");
   Т.ВывестиСекцию("Диаграмма");
   Если БылПрерван=0 Тогда
      Т.ВывестиСекцию("Результаты");    
   КонецЕсли;
   Если БылПрерван=1 Тогда
      сообщить("Тестирование было прервано.","!");
       Предупреждение("Тестирование было прервано!","!");
   Иначе
      сообщить("Тестирование завершено!","!");
      Т.Опции(0, 0, 4, 0, "ОпцииПечатиДиаграмма");
      Т.ТолькоПросмотр(1);
      Т.Показать("Результаты тестирования");
   КонецЕсли;
КонецПроцедуры
//*******************************************
Процедура ПриОткрытии()
   сообщить("Проверка участников ...","i");
   МаксЗнач = 20; // проверяем на 20 элементах
   //МаксЗнач = 10; // проверяем на 10 элементах
   Для НомерНабора=1 по 6 Цикл
      СЗНаборыДанных.ДобавитьЗначение("Набор "+НомерНабора);СЗНаборыДанных.Пометка(СЗНаборыДанных.РазмерСписка(),1); 
      Если МаксЗнач = 20 Тогда
         Если НомерНабора=1 Тогда
            // "{1,2,3,4,5,6,7,8,9}";
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,1},{Ч,2},{Ч,3},{Ч,4},{Ч,5},{Ч,6},{Ч,7},{Ч,8},{Ч,9}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,1},{Ч,2},{Ч,3},{Ч,4},{Ч,5},{Ч,6},{Ч,7},{Ч,8},{Ч,9}}},{СБ,СБ,1,0,2,{С,},,0,{{С,1},{С,2},{С,3},{С,4},{С,5},{С,6},{С,7},{С,8},{С,9}}}}}}";
         ИначеЕсли  НомерНабора=2 Тогда
            // "{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}";   
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,1},{Ч,2},{Ч,3},{Ч,4},{Ч,5},{Ч,6},{Ч,7},{Ч,8},{Ч,9},{Ч,10},{Ч,11},{Ч,12},{Ч,13},{Ч,14},{Ч,15},{Ч,16},{Ч,17},{Ч,18},{Ч,19},{Ч,20}}},{СБ,СБ,1,0,2,{С,},,0,{{С,1},{С,2},{С,3},{С,4},{С,5},{С,6},{С,7},{С,8},{С,9},{С,10},{С,11},{С,12},{С,13},{С,14},{С,15},{С,16},{С,17},{С,18},{С,19},{С,20}}}}}}";
         ИначеЕсли  НомерНабора=3 Тогда
            // "{}";
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{}},{ЧБ,ЧБ,1,0,1,X,,2,{}},{СБ,СБ,1,0,2,{С,},,0,{}}}}}";
         ИначеЕсли  НомерНабора=4 Тогда
            // "{1,1,1,1,1,1,1,1,1,1}";
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,2},{Ч,4},{Ч,6},{Ч,8},{Ч,10},{Ч,12},{Ч,14},{Ч,16},{Ч,18},{Ч,20}}},{СБ,СБ,1,0,2,{С,},,0,{{С,2},{С,4},{С,6},{С,8},{С,10},{С,12},{С,14},{С,16},{С,18},{С,20}}}}}}";
         ИначеЕсли  НомерНабора=5 Тогда
            // "{1,2,3,4,5,6,7,8,9,9,8}";
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,1},{Ч,2},{Ч,3},{Ч,4},{Ч,5},{Ч,6},{Ч,7},{Ч,8},{Ч,9},{Ч,9},{Ч,8}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,1},{Ч,3},{Ч,5},{Ч,7},{Ч,9},{Ч,11},{Ч,13},{Ч,15},{Ч,17},{Ч,18},{Ч,20}}},{СБ,СБ,1,0,2,{С,},,0,{{С,1},{С,3},{С,5},{С,7},{С,9},{С,11},{С,13},{С,15},{С,17},{С,18},{С,20}}}}}}";
         ИначеЕсли  НомерНабора=6 Тогда
            // "{9,8,7,6,5,4,3,2,1}";
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,9},{Ч,8},{Ч,7},{Ч,6},{Ч,5},{Ч,4},{Ч,3},{Ч,2},{Ч,1}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,12},{Ч,13},{Ч,14},{Ч,15},{Ч,16},{Ч,17},{Ч,18},{Ч,19},{Ч,20}}},{СБ,СБ,1,0,2,{С,},,0,{{С,12},{С,13},{С,14},{С,15},{С,16},{С,17},{С,18},{С,19},{С,20}}}}}}";
         КонецЕсли;
      Иначе
         Если НомерНабора=1 Тогда
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,1},{Ч,2},{Ч,3},{Ч,4}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,1},{Ч,2},{Ч,3},{Ч,4}}},{СБ,СБ,1,0,2,{С,},,0,{{С,1},{С,2},{С,3},{С,4}}}}}}"; // "{1,2,3,4}";
         ИначеЕсли  НомерНабора=2 Тогда
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,1},{Ч,2},{Ч,3},{Ч,4},{Ч,5},{Ч,6},{Ч,7},{Ч,8},{Ч,9},{Ч,10}}},{СБ,СБ,1,0,2,{С,},,0,{{С,1},{С,2},{С,3},{С,4},{С,5},{С,6},{С,7},{С,8},{С,9},{С,10}}}}}}"; // "{1,1,1,1,1,1,1,1,1,1}";   
         ИначеЕсли  НомерНабора=3 Тогда
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{}},{ЧБ,ЧБ,1,0,1,X,,2,{}},{СБ,СБ,1,0,2,{С,},,0,{}}}}}"; // "{}";   
         ИначеЕсли  НомерНабора=4 Тогда
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,1},{Ч,1},{Ч,1},{Ч,1},{Ч,1}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,2},{Ч,4},{Ч,6},{Ч,8},{Ч,10}}},{СБ,СБ,1,0,2,{С,},,0,{{С,2},{С,4},{С,6},{С,8},{С,10}}}}}}"; // "{1,1,1,1,1}";  
         ИначеЕсли  НомерНабора=5 Тогда         
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,1},{Ч,2},{Ч,3},{Ч,4},{Ч,4},{Ч,3}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,1},{Ч,3},{Ч,5},{Ч,7},{Ч,8},{Ч,10}}},{СБ,СБ,1,0,2,{С,},,0,{{С,1},{С,3},{С,5},{С,7},{С,8},{С,10}}}}}}"; // "{1,2,3,4,4,3}";
         ИначеЕсли  НомерНабора=6 Тогда         
            Правильно="{ТЗ,2,{0,,0,0,0,,2,{{К,К,1,0,0,X,,2,{{Ч,4},{Ч,3},{Ч,2},{Ч,1}}},{ЧБ,ЧБ,1,0,1,X,,2,{{Ч,7},{Ч,8},{Ч,9},{Ч,10}}},{СБ,СБ,1,0,2,{С,},,0,{{С,7},{С,8},{С,9},{С,10}}}}}}"; // "{4,3,2,1}";
         КонецЕсли;
      КонецЕсли;
      Для НомерВарианта=1 по СЗВарианты.РазмерСписка() Цикл
         СоздатьТЗ(1); 
         СформироватьНаборДанных(НомерНабора);
         Автор=СЗВарианты.ПолучитьЗначение(НомерВарианта);
         состояние("Проверка участников на "+НомерНабора+" наборе: "+Автор);
         ФильтроватьТЗ(Автор);
         //ТЗ.ВыбратьСтроку(,""+Автор+" "+НомерНабора);
         ТоЧтоПолучилось=ТЗ_2_Стр();
         //Сообщить(ТоЧтоПолучилось);
         Если ТоЧтоПолучилось<>Правильно тогда                                                       
            сообщить("");
            сообщить("Участник "+Автор+" не правильно обрабатывает набор данных "+НомерНабора,"!!!");
            сообщить("При 20 элементах должно быть: ");
            сообщить(Правильно);
            сообщить("______________, а получилось: ");
            сообщить(ТоЧтоПолучилось); 
            СЗВарианты.Пометка(НомерВарианта,0);  
         КОнецЕсли;   
      КонецЦикла;   
   КонецЦикла;   
   сообщить("Проверка завершена.","i");
   МаксЗнач=20000; 
КонецПроцедуры
// **********************************
фОчиститьОкноСообщений=1;
ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("К","Число",15,0);

ТЗРезультаты=СоздатьОбъект("ТаблицаЗначений");
ТЗРезультаты.НоваяКолонка("Автор");
ТЗРезультаты.НоваяКолонка("ОбщееВремяВыполнения","Число",10);                         
// -->
// СЗВарианты.ДобавитьЗначение("VVS");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);       // ИСКЛЮЧЕН 15,09,2002: С ОШИБКОЙ!
// СЗВарианты.ДобавитьЗначение("Чиканук");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);  // ИСКЛЮЧЕН 15,09,2002: С ОШИБКОЙ!
// СЗВарианты.ДобавитьЗначение("Diamond");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);  // ИСКЛЮЧЕН 15,09,2002: САМЫЙ МЕДЛЕННЫЙ ИЗ РАБОТАЮЩИХ
// СЗВарианты.ДобавитьЗначение("GaninY");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);   // 20,09,2002: ИСКЛЮЧЕН КАК МЕДЛЕННЫЙ 
// СЗВарианты.ДобавитьЗначение("Rom");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);      // 20,09,2002: ИСКЛЮЧЕН КАК МЕДЛЕННЫЙ 

СЗВарианты.ДобавитьЗначение("mszsuz");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);
СЗВарианты.ДобавитьЗначение("Serpent");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);
СЗВарианты.ДобавитьЗначение("slavic");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);
СЗВарианты.ДобавитьЗначение("TDV");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);         // ДОБАВЛЕН 19,09,2002
СЗВарианты.ДобавитьЗначение("alexk v.1");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);       // ДОБАВЛЕН 19,09,2002
СЗВарианты.ДобавитьЗначение("alexk v.2");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);       // ДОБАВЛЕН 19,09,2002
СЗВарианты.ДобавитьЗначение("mech");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);        // ДОБАВЛЕН 19,09,2002 
СЗВарианты.ДобавитьЗначение("NefedovSergey");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);  // ДОБАВЛЕН 13,11,2002 
СЗВарианты.ДобавитьЗначение("NefedovSergey /NS/");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);  // ДОБАВЛЕН 05,10,2004 
СЗВарианты.ДобавитьЗначение("Simod");СЗВарианты.Пометка(СЗВарианты.РазмерСписка(),1);  // ДОБАВЛЕН 27,06,2006 
Показать полностью
12. O-Planet 6443 12.11.08 23:38 Сейчас в теме
(7) 0_о Это релиз для NASA метода удаления строк из таблиц?
Santa1; fsmn; InJey; aleksae; indefinitumX; TheOldGuard; olezhe; Symbiat; TariK; mark_oilbass; Moonlitolga; Gadzhalik; dachnik; bgxz; корум; smirnovserg.s@gmail.com; artfa; Мах; +18 Ответить
26. binx 172 12.10.14 19:49 Сейчас в теме
(12) O-Planet,
ТЗСтроки = ТЗ.НайтиСтроки(ПараметрыОтбора);
Для каждого СтрокаУдаления Из ТЗСтроки Цикл
      ТЗ.Удалить(СтрокаУдаления);
КонецЦикла;

27. Cooler 22 12.10.14 20:10 Сейчас в теме
8. tsd 105 09.11.08 09:34 Сейчас в теме
а не проще таблицу с конца обходить?

всего=ТЗ.Количествострок();

пока всего > 0 цикл
ТЗ.Получитьстрокупономеру(Всего);
Проверка условий ....

Всего = Всего -1;
КонецЦикла;
zastep; корум; ekomova; bow; +4 Ответить
9. alexk-is 6544 09.11.08 10:05 Сейчас в теме
(8) В коде проще, но не быстрее. Самый быстрый и "правильный" из известных мне "alexk v.2"
А самый простой по коду ниже:
Код
Для Индекс = -ТЗ.КоличествоСтрок() По -1 Цикл
    ТЗ.ПолучитьСтрокуПоНомеру(-Индекс);
    Если <ПроверкаУсловий> Тогда
        ТЗ.УдалитьСтроку();
    КонецЕсли;
КонецЦикла;
Показать полностью
Bessondo; Rega; user613407_vladzvn; simgo83; akmich; bendarik; nofear; insurgut; by_1Cnik; tatoshka0403; freeek; Slypower; feniks_pro90; Бывалый77; bigmalex; leonidt84; CratosX; ya.Avoronov; wolfsoft; Fiz; +20 Ответить
40. insurgut 208 10.02.18 15:36 Сейчас в теме
(9) т.к. очень часто использую ваш алгоритм, когда нужно удалить строки по условию в ТЧ за один проход и постоянно переделываю его под 8-ку, то позволю себе выложить чуть измененный код, чтобы в дальнейшем копировать его без переделки :)

Для Индекс = -Объект.ТЗ.Количество()+1 По 0 Цикл
    Если Объект.ТЗ[-Индекс].Значение = <Условие> Тогда
        Объект.ТЗ.Удалить(-Индекс);
    КонецЕсли;
КонецЦикла;
user1316759; InJey; dammit666; perepetulichka; shaykhelov; Огонек; Bozhevilnoe; Divedition; simgo83; Mechanik21; CratosX; nofear; +12 Ответить
10. 12.11.08 21:47 Сейчас в теме
Если скорость не очень важна, то можно юзать универсальную функцию из библиотеки функций.

//fixin 200707072
//Удаляет строки таблицы значений по условию
//ТЗ - таблица значений
//Код - код проверки условия, например "Р=Стр.Статья<>П"
//П - один или несколько (структура) параметров
//При проверке условия в переменную Р нужно вернуть результат (истина - удалять, ложь - не удалять),
// при этом доступна текущая строка СТР и переданный параметр Т.
Функция обУдалитьСтрокиТЗПоУсловию(ТЗ, Код, П=Неопределено) Экспорт
Всего=ТЗ.Количество();
Для Инд=1 По Всего Цикл
Поз=Всего-Инд;
Стр=ТЗ[Поз];
Р=ложь;
Выполнить(Код);
Если Р=истина Тогда
ТЗ.Удалить(Поз);
КонецЕсли;
КонецЦикла;
11. alexk-is 6544 12.11.08 22:58 Сейчас в теме
(12) Кроме того, что при удалении строки переписывается все последующие строки, так тут еще и компиляция "Код" в цикле.
...еще один образец того "как делать не надо"...
13. maljaev 789 13.11.08 09:02 Сейчас в теме
Вот мой вариант фильтрации ТЗ по одному или нескольким условиям. Довольно быстрый, но не самый быстрый. По крайней мере несколько лет пользуюсь только им - хватает...

Код
// процедура фильтрует таблицу в соответствии с таблицей условий
Процедура ФильтроватьТаблицу(Таблица,Условия)
   Если Таблица.КоличествоСтрок()=0 Тогда
      Возврат;
   КонецЕсли;
   КоличествоКолонок=Таблица.КоличествоКолонок();
   Результирующая=СоздатьОбъект("ТаблицаЗначений");
   Промежуточная=СоздатьОбъект("ТаблицаЗначений");
   Таблица.Выгрузить(Результирующая,1,1);
   Результирующая.КоличествоСтрок(0);
   Таблица.ВыбратьСтроки();
   Пока Таблица.ПолучитьСтроку()=1 Цикл
      СоответствуетУсловию=1;
      Условия.ВыбратьСтроки();
      Пока Условия.ПолучитьСтроку()=1 Цикл
         Значение=Условия.Значение;
         Если Шаблон("["+Условия.Шаблон+"]")="0" Тогда
            СоответствуетУсловию=0;
            Прервать;
         КонецЕсли;
      КонецЦикла;
      Если СоответствуетУсловию=1 Тогда
         Таблица.Выгрузить(Промежуточная,Таблица.НомерСтроки,Таблица.НомерСтроки);
         Результирующая.НоваяСтрока();
         Результирующая.Заполнить(Промежуточная,Результирующая.НомерСтроки,Результирующая.НомерСтроки);
      КонецЕсли;
   КонецЦикла;
   Результирующая.Выгрузить(Таблица);
КонецПроцедуры // ФильтроватьТаблицу

// функция создает и возвращает таблицу с одним значением условия
Функция ВернутьПростоеУсловие(Условие,Значение="")
   Условия=СоздатьОбъект("ТаблицаЗначений");
   Условия.НоваяКолонка("Шаблон");
   Условия.НоваяКолонка("Значение");
   Условия.НоваяСтрока();
   Условия.Шаблон=Условие;
   Условия.Значение=Значение;
   Возврат Условия;
КонецФункции // ВернутьПростоеУсловие
Показать полностью


Примеры ислользования:

Код
// очистить ТЗ от строк с нулевой суммой
ФильтроватьТаблицу(ТЗ,ВернутьПростоеУсловие("?(Таблица.Сумма=0,0,1)"));

// очистить ТЗ по заданному сотруднику, фирме, и с окладом более 5000 рублей
Условия=ВернутьПростоеУсловие("?(Таблица.Сотрудник=Значение,1,0)",ВыбСотрудник);
Условия.НоваяСтрока();
Условия.Заполнить(ВернутьПростоеУсловие("?(Таблица.Фирма=Значение,1,0)",ВыбФирма),Условия.НомерСтроки,Условия.НомерСтроки);
Условия.НоваяСтрока();
Условия.Заполнить(ВернутьПростоеУсловие("?(Таблица.Оклад>5000,1,0)"),Условия.НомерСтроки,Условия.НомерСтроки);
ФильтроватьТаблицу(ТЗ,Условия);
Показать полностью
Светлый ум; +1 Ответить
14. maljaev 789 13.11.08 09:09 Сейчас в теме
В последнем примере комментарий неверно сформулировал. Надо читать так:
Код
// отфильтровать ТЗ по заданному сотруднику, фирме, и с окладом более 5000 рублей
Показать полностью
15. Vitek 13.11.08 09:21 Сейчас в теме
Статья стала полезной однако, после того как отцы комментов накидали :)
Плюс!
perepetulichka; +1 Ответить
16. PlatonStepan 38 28.05.09 03:31 Сейчас в теме
Можно фильтровать ТЗ по точному значению
//ПараметрыОтбора = новый Структура;
//ПараметрыОтбора.Вставить(сИмя,сЗнач);
//где сИмя - колонка, сЗнач - значение отбора
ТЗ = ТЗ.Скопировать(ПараметрыОтбора);
tatoshka0403; Светлый ум; Alexey_A; DennyPhilord; frost_a; rayastar; yuraskas; rhtr; mikmike; igyo; +10 Ответить
17. SunShinne 633 10.06.11 16:31 Сейчас в теме
Спасибо! Очень помогло. Обычный способ в 1С действительно глючит
18. CheBurator 2712 11.06.11 01:31 Сейчас в теме
какой-такой "обычный" способ..?
.я тут вчера кучу времени убил.. - две ТЗ, вроде как одинаковые даже по составу данных (колонки артикул и колво, сортируем по Артикул), сравниваю путем преобразования в строку... ан нет.. то что совершенно одинаково видится как визуальная ТЗ - при ЗначениеВстроку(ТЗ) - получается совсем не отсортированной!
19. CheBurator 2712 11.06.11 01:33 Сейчас в теме
пользуюсь вот такими...
//******************************************************************************
// ОчисткаТЗ()
// Параметры: ТЗ, которую надо очистить
// В ТЗ д.б. Колонки с идентификаторами "НадоУдалить" и "ОПС" (оригинальный порядок строк)
// Описание: очищает ТЗ от ненужных строк
Процедура глОчисткаТЗ(ТЗдляЧистки, ОПС="+ОПС", КолонкаУдалить="НадоУдалить", Режим=0) Экспорт

Попытка НадоУдалить = ТЗдляЧистки.Итог(КолонкаУдалить);
Исключение Возврат;
КонецПопытки;

ТЗКС = ТЗдляЧистки.КоличествоСтрок();
Если Режим <> 0 Тогда
Сообщить("> ["+ТекущееВремя()+"]: *** удаляем "+НадоУдалить+" из "+ТЗКС+" ****");
КонецЕсли;

Если НадоУдалить <= 0 Тогда Возврат; КонецЕсли;

Если НадоУдалить >= ТЗКС Тогда
ТЗдляЧистки.УдалитьСтроки();
Иначе
ТЗРаб = СоздатьОбъект("ТаблицаЗначений");
ТЗдляЧистки.Выгрузить(ТЗРаб);
ТЗРаб.Сортировать("+"+КолонкаУдалить);
ТЗРаб.Выгрузить(ТЗдляЧистки,1,ТЗКС-НадоУдалить);
ТЗРаб = 0;
КонецЕсли;
Если ОПС = "###" Тогда Возврат; КонецЕсли; //сортировать не надо
//восстановим оригинальный порядок строк
ТЗдляЧистки.Сортировать(ОПС);
КонецПроцедуры //глОчисткаТЗ()
20. CheBurator 2712 11.06.11 01:33 Сейчас в теме
//------------------------------------------------------------------------------------
Функция глОтобратьПоКолонке(ТЗВход,Колонка,Значение) Экспорт
//возвращает отобранную ТЗ
Перем ТЗ, ТЗВрем;
ТЗВход.Выгрузить(ТЗ);
ТЗ.Сортировать(Колонка+"*"); //по внутр значению
НомСтр = 0;
Если ТЗ.НайтиЗначение(Значение, НомСтр, Колонка) = 0 Тогда
//нет такого значения
ТЗ.УдалитьСтроки();
Возврат ТЗ;
Иначе
//найдем строку, в которой уже не встречается Значение
ТЗКС = ТЗ.КоличествоСтрок();
Для счСтрок = НомСтр По ТЗКС Цикл
Если ТЗ.ПолучитьЗначение(счСтрок, Колонка) <> Значение Тогда
//нужное значение есть до пред.строки
НомСтр2 = счСтрок - 1;
Прервать;
КонецЕсли;
Если счСтрок = ТЗКС Тогда
//нужное значение встречается до конца таблицы
НомСтр2 = ТЗКС;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ТЗВрем = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ТЗВрем,НомСтр,НомСтр2); //выгрузим только строки с нужным значением
Возврат ТЗВрем;
КонецФункции //глОтобратьПоКолонке()
Parazyte; +1 Ответить
21. Luck_DMST 24 17.10.13 10:26 Сейчас в теме
Ну а как же простое удаление?
Например, почистить список контрагентов от которых не было оплаты
НайденныеСтроки = ОплатаФакт.НайтиСтроки(Новый Структура("Сумма", 0));
Для каждого СтрокаТЧ Из НайденныеСтроки Цикл
   ОплатаФакт.Удалить(СтрокаТЧ);
КонецЦикла;
ivnik; orfos; +2 Ответить
22. Parazyte 37 21.10.13 22:02 Сейчас в теме
(21) Luck_DMST, эт ты обознался, тут люди за семёрку гутарят.

Вообще на Мисте ИМХО наилучший вариант


А вот еще один правильный алгоритм, предложенный Wlad:

ТабЗнач.Выбратьстроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
Пока (<условие>) и (ТабЗнач.НомерСтроки<>0) Цикл
ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей
КонецЦикла;
КонецЦикла;

23. shard 281 22.10.13 00:19 Сейчас в теме
(22) Parazyte, а на быстродействие проверяли?
25. Luck_DMST 24 22.10.13 08:19 Сейчас в теме
(22) Простите, на заголовок не обратил внимания т.к. открыты были только комментарии и как раз занимался удалением строк в ТЗ
44. user1879509 01.12.22 01:21 Сейчас в теме
(21) а если условие отбора, не «ноль», а то что меньше ста?Как тут выкрутится?
24. Parazyte 37 22.10.13 08:18 Сейчас в теме
Нет, но это будет играть роль имхо при оооочень больших таблицах
28. Sanario 27 08.04.15 13:07 Сейчас в теме
29. FraerFFSG 13.07.15 17:54 Сейчас в теме
У меня
Для каждого Элемент из ВыборРода Цикл
НайденныеСтроки = ТЗВесьОтчет.НайтиСтроки(Новый Структура("РодВагона", ВыборРода));
Для каждого Строка Из НайденныеСтроки Цикл
   ТЗВесьОтчет.Удалить(Строка);
КонецЦикла;
КонецЦикла;

ВыборРода = Список значений


НЕ РАБОТАЕТ ни один ВАРИАНТ!
30. shard 281 14.07.15 16:17 Сейчас в теме
(29) FraerFFSG, обратите внимание на 16й комментарий.
по коду - может быть надо
Для каждого Элемент из ВыборРода Цикл
НайденныеСтроки = ТЗВесьОтчет.НайтиСтроки(Новый Структура("РодВагона", Элемент));
31. SLukin 47 18.04.16 16:21 Сейчас в теме

			
СтрокиПоКонтрагенту = ТЧДокумента.Скопировать();
			
Индекс = СтрокиПоКонтрагенту.Количество() - 1; 
Пока Индекс >= 0 Цикл 
	Если СтрокиПоКонтрагенту[Индекс].Договор.ТипДоговора = Перечисления.ТипыДоговоров.СПоставщиком Тогда 
		СтрокиПоКонтрагенту.Удалить(Индекс); 
	КонецЕсли; 
	Индекс = Индекс - 1; 
КонецЦикла;
Показать
user1090556; user705522_constantin_h; +2 Ответить
32. Qwest_IS 26.04.16 17:35 Сейчас в теме
А Запрос к ТЗ это плохо?
36. alex-l19041 8 18.10.16 09:57 Сейчас в теме
33. feka88 1 24.06.16 12:30 Сейчас в теме
Сделал вот так:
КолСтрок = ТаблицаПользователей.Количество();        
	СчетчикСтрок = 1;        

	Пока СчетчикСтрок < КолСтрок Цикл   	    

		СтрокаТЗ = ТаблицаПользователей.Получить(СчетчикСтрок);
		
		ПараметрыПоискаСтрок = Новый Структура;
		ПараметрыПоискаСтрок.Вставить("ИдентификаторПользователяИБ", СтрокаТЗ.ИдентификаторПользователяИБ);
		МассивСтрок = ТаблицаПользователей.НайтиСтроки(ПараметрыПоискаСтрок);
		КолОдинаковых = МассивСтрок.Количество();
		
		Если   КолОдинаковых > 1   Тогда

			ТаблицаПользователей.Удалить(СчетчикСтрок);
			КолСтрок = КолСтрок -1;  

		Иначе 
			СчетчикСтрок = СчетчикСтрок+1;
		    
		КонецЕсли; 
		
	Конеццикла;
Показать
34. AnnaKalacheva 6 18.10.16 08:52 Сейчас в теме
Мне больше всего нравится такой вариант

УдалитьТП=Новый Массив;
	Для каждого Строка из ТЗ_ТП Цикл
		Если Строка.Валюта.Код<>"974" Тогда
			УдалитьТП.Добавить(Строка);
		КонецЕсли;
	КонецЦикла;
	
	Для каждого Строка из УдалитьТП Цикл
		ТЗ_ТП.Удалить(Строка);
	КонецЦикла;
Показать


В массив собираем все, что нужно удалить с любыми условиями, потом удаляем. Или отбором формируем массив из элементов, которые нужно удалить.
LomayaZakat; klaus38; dadel; Ksant; buy_sale; jif; Papilion; alex-l19041; +8 Ответить
35. AnnaKalacheva 6 18.10.16 09:41 Сейчас в теме
Еще вариант

Сч=0;
	Пока Сч < ТЗ.Количество() Цикл
		Если ТЗ[Сч].Номер=1 Тогда
			 ТЗ.Удалить(Сч);
		 Иначе
			 Сч=Сч+1;
		 КонецЕсли;
	КонецЦикла;
Показать
37. alex-dp 16.12.16 12:44 Сейчас в теме
Здесь в Результат ишется 0 в поле Количество и удаляет все Количество=0 :

НайденнаяСтрока = Результат.Найти(0, "Количество");
Пока НайденнаяСтрока <> Неопределено Цикл
Результат.Удалить(НайденнаяСтрока);
НайденнаяСтрока = Результат.Найти(0, "Количество");
КонецЦикла;

как по мне самый понятный вариант.
38. Sph1nX 01.06.17 19:04 Сейчас в теме
Вот было б замечательно, если б 1С додумались сделать функцию "НайтиСтроки" без обязательного параметра "ПараметрыОтбора", для выгрузки всех ссылок на строки в массив. Или, в крайнем случае, создали б отдельную функцию.
39. shard 281 01.06.17 22:42 Сейчас в теме
(38) в три строки можно такое решить: добавить колонку, заполнить ее к примеру истиной, вызвать найтистроки по этой колонке с отбором по истине. вот только зачем...
41. dobrynin.i.s 92 31.12.18 23:51 Сейчас в теме
Я просто выгружаю нужные столбцы из таблицы по отбору
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Обработать", истина);
НоменклатураБазы=Объект.НоменклатураБазы.Выгрузить(ПараметрыОтбора,"Колонка1,Колонка2,....,КолонкаN");
45. user635667 26.06.23 12:20 Сейчас в теме
Ну и что в итоге, народ. Какой способ самый быстрый ??? Мне надо обойти таблицу в которой 5 тыс строк и по условию удалить из нее лишнее.
Оставьте свое сообщение