Имя: Пароль:
1C
1С v8
v8: Цикл удаление из ТЧ не удаляет все с первого раза
0 geka-geka
 
12.11.13
09:26
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник,
        |    ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.ВидРасчета
        |ПОМЕСТИТЬ НаНачалоМесяца
        |ИЗ
        |    РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(&ПериодРегистрации, ) КАК ПлановыеНачисленияРаботниковОрганизацийСрезПоследних
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    НаНачалоМесяца.Сотрудник КАК Сотрудник,
        |    НаНачалоМесяца.ВидРасчета
        |ИЗ
        |    НаНачалоМесяца КАК НаНачалоМесяца
        |ГДЕ
        |    НаНачалоМесяца.ВидРасчета = &ВидРасчета
        |
        |УПОРЯДОЧИТЬ ПО
        |    Сотрудник";

    Запрос.УстановитьПараметр("ВидРасчета", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.СдельнаяОплата);
    Запрос.УстановитьПараметр("ПериодРегистрации", ДокументОбъект.ПериодРегистрации);

    
    ТЗ = Запрос.Выполнить().Выгрузить();
    Для Каждого Начисление Из ДокументОбъект.Начисления Цикл
        Если ТЗ.Найти(Начисление.Сотрудник,"Сотрудник") = Неопределено Тогда
            ДокументОбъект.Начисления.Удалить(Начисление);
        Иначе
            
        КонецЕсли;    
    КонецЦикла;

Помогите разобраться
1 Галахад
 
гуру
12.11.13
09:27
Цыкля зацыклявается, когда выборка сбивается.
2 z80a
 
12.11.13
09:27
выборка и удаление в одном цикле
3 пипец
 
12.11.13
09:28
обратную выборку делай
4 geka-geka
 
12.11.13
09:28
Смысл из общей массы сотрудников оставить сдельщиков
5 catena
 
12.11.13
09:32
Удаляй до упора.
6 Sabbath
 
12.11.13
09:34
(0) Добавляй строки в массив, а потом обходи его и удаляй, типичный косяк
7 salvator
 
12.11.13
09:34
НайтиСтроки используй
8 Sabbath
 
12.11.13
09:35
(7) да, и это, если сотрудник может быть несколько раз
9 salvator
 
12.11.13
09:37
Или так
ПараметрыОтбора = Новый Структура("Сотрудник","Сотрудник");
ТЗНов = ТЗ.Скопировать(ПараметрыОтбора);
10 roman52
 
12.11.13
09:39
выгрузи в запрос, там наложи отбор, результат выгрузи обратно
11 Aswed
 
12.11.13
09:41
(10) +1
я бы так сделал.
12 geka-geka
 
12.11.13
09:41
Пока надо быстро сделал так, потом правильно сделаю

ДокументОбъект = ДокОбъект;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.Сотрудник,
        |    ПлановыеНачисленияРаботниковОрганизацийСрезПоследних.ВидРасчета
        |ПОМЕСТИТЬ НаНачалоМесяца
        |ИЗ
        |    РегистрСведений.ПлановыеНачисленияРаботниковОрганизаций.СрезПоследних(&ПериодРегистрации, ) КАК ПлановыеНачисленияРаботниковОрганизацийСрезПоследних
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    НаНачалоМесяца.Сотрудник КАК Сотрудник,
        |    НаНачалоМесяца.ВидРасчета
        |ИЗ
        |    НаНачалоМесяца КАК НаНачалоМесяца
        |ГДЕ
        |    НаНачалоМесяца.ВидРасчета = &ВидРасчета
        |
        |УПОРЯДОЧИТЬ ПО
        |    Сотрудник";

    Запрос.УстановитьПараметр("ВидРасчета", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.СдельнаяОплата);
    Запрос.УстановитьПараметр("ПериодРегистрации", ДокументОбъект.ПериодРегистрации);

    
    ТЗ = Запрос.Выполнить().Выгрузить();
    сч = ДокументОбъект.Начисления.Количество() - 1;
    
    Пока сч >=0 Цикл
        Если ТЗ.Найти(ДокументОбъект.Начисления[сч].Сотрудник,"Сотрудник") = Неопределено Тогда
            ДокументОбъект.Начисления.Удалить(сч);
        Иначе
            
        КонецЕсли;
        сч = сч - 1;
    КонецЦикла;
13 Любопытная
 
12.11.13
09:43
(12) потом не наступит никогда. Всегда надо делать правильно с первого раза. Или не делать вообще
14 Нуф-Нуф
 
12.11.13
09:43
удаление из табличных частей обычно делают в два цикла
15 1dvd
 
12.11.13
09:44
(14) о, как
16 mikecool
 
12.11.13
09:44
нельзя просто так взять и удалить строки таб части с одного раза!
17 Lev292
 
12.11.13
09:51
Попробуй так:

Сч=0;
Пока Сч<=ДокументОбъект.Начисления.Количество()-1 Цикл
    Начисление = ДокументОбъект.Начисления[Сч];
    Если ТЗ.Найти(Начисление.Сотрудник,"Сотрудник")= Неопределено Тогда
        ДокументОбъект.Начисления.Удалить(Начисление);
    Иначе
        Сч=Сч+1;
    КонецЕсли;    
КонецЦикла;
18 Lev292
 
12.11.13
09:52
Может только в синтаксисе чего-нибудь напутал.
19 catena
 
12.11.13
09:56
(12)Я ж сказала до упора :)
20 mikecool
 
12.11.13
09:59
(19) сколько раз отжаться? ))
21 skunk
 
12.11.13
09:59
а что мешает через найтистроки найти все строки с "неопределенно" ... и в цикле уже удалить их
22 skunk
 
12.11.13
10:00
а еще правильнее в самом запросе отбрасывать ненужные строки
23 mikecool
 
12.11.13
10:01
(21) ну вот всю интригу спутал )
24 AlexITGround
 
12.11.13
10:25
(22) солидарен
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший