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

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

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

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

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

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

Либо  http://catalog.mista.ru/public/371762/

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

Где
// Примеры использования
//тз=НайтиПоУсловию(тз,"Стр.Колонка1<20 и Стр.Колонка2>500");
//  или
//Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок("Иванов,Сидоров,Петров");

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

//Или

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

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

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

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