Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Обход ТЗ с удалением строки по условию

Обход ТЗ с удалением строки по условию
Я
   lirt82
 
19.09.17 - 17:53
Есть ТаблицаЗначений в ней 2 колонки, одна Пометка тип Булево, вторая имя документа, делаю обход этой таблицы с удалением строк где Пометка = Ложь, но в результате выполнения кода все равно получаю таблицу без изменении. Пните:)
Для каждого Стр Из ТЗ Цикл
    Если Стр.Пометка = Ложь Тогда
        ТЗ.Удалить(Стр);
    КонецЕсли;
КонецЦикла;
    
ДокиРезультат = ТЗ.Скопировать();
 
 
   lirt82
 
1 - 19.09.17 - 17:54
т.е. в таблице ДокиРезультат должен получить все доки у которых пометка = Истина
   igork1966
 
2 - 19.09.17 - 17:55
(0) Через одну скорее удаляет а не "все равно получаю таблицу без изменении"
   RS2017
 
3 - 19.09.17 - 17:56
возможно выборка сбивается "Для каждого Стр Из ТЗ Цикл" после первого удаления. Либо обходи по индексу, либо "найтистроки" - а дальше "для каждого"
   Михаил Козлов
 
4 - 19.09.17 - 17:57
(0) Не смущает, что ТЗ после удаления изменится?
   RS2017
 
5 - 19.09.17 - 17:57
КУдалению = ТЗ.Найтистроки(Новый Структура("Пометка", Ложь));
Для каждого Стр Из КУдалению  Цикл
    ТЗ.Удалить(Стр);
КонецЦикла;
   lirt82
 
6 - 19.09.17 - 18:01
(5) получилось, через НайтиСтроки
   vde69
 
7 - 19.09.17 - 18:02
общий подход такой..., но можно проще как в (5)

мУдалить = Новый Массив;

Для каждого Стр Из ТЗ Цикл 
    Если Стр.Пометка = Ложь Тогда
        мУдалить.Добавить(Стр);
    КонецЕсли;
КонецЦикла;

Для каждого Стр Из мУдалить Цикл 
    ТЗ.Удалить(Стр);
КонецЦикла;
   RS2017
 
8 - 19.09.17 - 18:02
(6) еще лучше 
ДокиРезультат = ТЗ.Скопировать(Новый Структура("Пометка", Истина));
))))
   lirt82
 
9 - 19.09.17 - 18:05
(8) лаконичнее:-)
   RS2017
 
10 - 19.09.17 - 18:06
(9) слегка
   Serginio1
 
11 - 19.09.17 - 19:09
Или через цикл с Конца.
сч=Тз.КоличествоСтрок()-1;

Пока сч>-1 Цикл
  стр=Тз[сч];

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

Либо  http://catalog.mista.ru/public/371762/
Функция НайтиПоУсловию(Тз,Условие,Список="",Модуль="") Экспорт
Массив = новый массив;
 Для каждого Стр из Тз Цикл
   Если Вычислить(Условие) Тогда
     массив.Добавить(стр)
   КонецЕсли
 КонецЦикла;
возврат массив
КонецФункции
   Serginio1
 
12 - 19.09.17 - 19:10
Функция НайтиПоУсловию(Тз,Условие,Список="",Модуль="") Экспорт
Массив = новый массив;
 Для каждого Стр из Тз Цикл
   Если Вычислить(Условие) Тогда
     массив.Добавить(стр)
   КонецЕсли
 КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции

Где
// Примеры использования

//тз=НайтиПоУсловию(тз,"Стр.Колонка1<20 и Стр.Колонка2>500");
//  или

//Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок("Иванов,Сидоров,Петров");

//Рез=НайтиПоУсловию(тз,"Список.Найти(стр.ФизЛицо)<>Неопределено");


//Или


//Рез=НайтиПоУсловию(тз,"Найти(Врег(стр.Значение),Врег(""акф""))>0");


//Рез=НайтиПоУсловию(тз,"Модуль.ФункцияСравнения(Стр,Список)",МассивСтруктур,ЭтотОбъект);


//То есть в модуле обработки должна быть функция

//  Функция ФункцияСравнения(стр,МассивСтруктур) Экспорт
   Serginio1
 
13 - 19.09.17 - 19:11
В твоем случае

тз=НайтиПоУсловию(тз,"Стр.Пометка");
   Филиал-msk
 
14 - 19.09.17 - 19:25
(13) Я предлагаю для решения такой сложной задачи написать внешнюю компоненту. Причем  она должна будет работать и на Линукс, и на x64 и в веб-клиенте на макос. А то вдруг?
   Филиал-msk
 
15 - 19.09.17 - 19:29
Хотя постойте... Кому ж я это пишу? (:

Список тем форума
Рекламное место пустует  Рекламное место пустует
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.