Имя: Пароль:
1C
1С v8
КТУ рабочих в табличной части документа
0 JuixyJes
 
27.04.19
19:17
Имеется код, заполняющий ТЧ, и запрос в этом коде, отвечающий за заполнение строки в этой ТЧ, но при прохождении цикла, по идее, должны заполняться новые строки тч значениями. Но заполняется лишь последнее значение полученное в цикле, помогите пожалуйста, что я сделала не так?

Выб = Документы.ОтчетСотрудника.Выбрать();
    Наряд_КТУ.Очистить();
    Наряд_Работа.Очистить();
    
    Пока Выб.Следующий() Цикл
        
        
        Если Ссылка = Выб.Наряд Тогда
            
            Для Каждого ТекСтрокаРабота Из Выб.Работа Цикл
                НоваяСтрока = Наряд_КТУ.Добавить();
                НоваяСтрока.Сотрудник = Выб.Сотрудник;
                НоваяСтрока.Продукция = ТекСтрокаРабота.Продукция;
                НоваяСтрока.Размер_Формат = ТекСтрокаРабота.РазмерФормат;
                НоваяСтрока.Технология = ТекСтрокаРабота.Технология;
                НоваяСтрока.Времени = ТекСтрокаРабота.Времени;
                НоваяСтрока.КТУ_План = 1;
                
                Запрос = Новый Запрос;
                Запрос.Текст =
                "ВЫБРАТЬ
                |    ОтчетСотрудника.Сотрудник КАК Сотрудник,
                |    ОтчетСотрудникаРабота.Продукция КАК Продукция,
                |    ОтчетСотрудникаРабота.Технология КАК Технология,
                |    ОтчетСотрудникаРабота.Времени КАК Времени
                |ИЗ
                |    Документ.ОтчетСотрудника.Работа КАК ОтчетСотрудникаРабота
                |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетСотрудника КАК ОтчетСотрудника
                |        ПО ОтчетСотрудникаРабота.Ссылка = ОтчетСотрудника.Ссылка
                |ГДЕ
                |    ОтчетСотрудника.Наряд = &Наряд
                |    И ОтчетСотрудникаРабота.Ссылка.Наряд = &Наряд
                |    И ОтчетСотрудникаРабота.Технология = &Технология
                |    И ОтчетСотрудника.Работа.Технология = &Технология";
                
                Запрос.УстановитьПараметр("Наряд", Ссылка);
                Запрос.УстановитьПараметр("Технология", ТекСтрокаРабота.Технология);
                
                РЗ = Запрос.Выполнить().Выгрузить();
                
                
                Если Рз.Количество() = 1 Тогда
                    НоваяСтрока.КТУ_Факт = 1;
                Иначе
                    Времени = 0 ;
                    Для ИИ = 1 по РЗ.Количество() Цикл
                        
                        Времени = Времени + РЗ[ИИ-1].Времени;
                        
                    КонецЦикла;
                    Для ИИ = 1 по РЗ.Количество() Цикл
                        
                         НоваяСтрока.КТУ_Факт = РЗ[ИИ-1].Времени/Времени;
                        
                    КонецЦикла;
                КонецЕсли;
                
                
                
                НоваяСтрока = Наряд_Работа.Добавить();
                НоваяСтрока.Сотрудник = Выб.Сотрудник;
                НоваяСтрока.Времени = ТекСтрокаРабота.Времени;
                НоваяСтрока.Продукция = ТекСтрокаРабота.Продукция;
                НоваяСтрока.Технология = ТекСтрокаРабота.Технология;
                
            КонецЦикла;
            
            
        КонецЕсли;
    КонецЦикла;
1 hhhh
 
27.04.19
19:41
попроще лучше

Запрос.Текст =
                "ВЫБРАТЬ
                |    ОтчетСотрудникаРабота.Ссылка.Сотрудник КАК Сотрудник,
                |    ОтчетСотрудникаРабота.Продукция КАК Продукция,
                |    ОтчетСотрудникаРабота.Технология КАК Технология,
                |    ОтчетСотрудникаРабота.Времени КАК Времени
                |ИЗ
                |    Документ.ОтчетСотрудника.Работа КАК ОтчетСотрудникаРабота
               |ГДЕ
                |   ОтчетСотрудникаРабота.Ссылка.Наряд = &Наряд
                |    И ОтчетСотрудникаРабота.Технология = &Технология
2 JuixyJes
 
27.04.19
20:09
(1) Я не прошу мне запрос переделать. Мне нужно лишь узнать, как исправить то, что я сделала не так.
3 JuixyJes
 
27.04.19
20:14
РЗ = Запрос.Выполнить().Выгрузить();
                
                
                Если Рз.Количество() = 1 Тогда
                    НоваяСтрока.КТУ_Факт = 1;
                Иначе
                    Времени = 0 ;
                    Для ИИ = 1 по РЗ.Количество() Цикл
                        
                        Времени = Времени + РЗ[ИИ-1].Времени;
                        
                    КонецЦикла;
                    Для ИИ = 1 по РЗ.Количество() Цикл
                        
                         НоваяСтрока.КТУ_Факт = РЗ[ИИ-1].Времени/Времени;
                        
                    КонецЦикла;
                КонецЕсли;

Конкретно вот в этом моменте
4 HawkEye
 
27.04.19
20:22
(0)
вот ты создала новую строку:

  НоваяСтрока = Наряд_КТУ.Добавить();

дальше:

                   Времени = 0 ;
                    Для ИИ = 1 по РЗ.Количество() Цикл
                        
                        Времени = Времени + РЗ[ИИ-1].Времени;
                        
                    КонецЦикла;
                    Для ИИ = 1 по РЗ.Количество() Цикл
                        
                         НоваяСтрока.КТУ_Факт = РЗ[ИИ-1].Времени/Времени;
                        
                    КонецЦикла;


1. зачем два раза цикл, ты не знаешь про Итог()?
2. ошибка во втором цикле:

НоваяСтрока.КТУ_Факт = РЗ[ИИ-1].Времени/Времени;  - у тебя одно и тоже значение КТУ_Факт заполняется в цикле, после выполнения цикла в КТУ_Факт будет ПОСЛЕДНЕЕ... т.е. весь твой второй цикл можно заменить на одну строку:

НоваяСтрока.КТУ_Факт = РЗ[РЗ.Количество()-1].Времени/Времени
5 JuixyJes
 
27.04.19
20:25
(4) А как эту ошибку исправить?
6 JuixyJes
 
27.04.19
20:26
(4) Отладчик показывает разные значения в цикле, как мне их тогда записать?
7 HawkEye
 
27.04.19
20:28
(5) откуда я знаю что ты хочешь добиться ))))
8 HawkEye
 
27.04.19
20:29
(6) куда записать то?!
ты создала новую строку у неё одна колонка КТУ_Факт  - в нее можно записать только одно значение, разве это не логично?
9 JuixyJes
 
27.04.19
20:30
(8) В колонке КТУ_Факт есть некоторое количество строк, которые заполняются.
10 HawkEye
 
27.04.19
20:32
(9) есть, но ты то в контексте ОДНОЙ строки работаешь...

НоваяСтрока = Наряд_КТУ.Добавить();  - что эта строчка делает по твоему?
...
НоваяСтрока.КТУ_Факт = "ХХХ"  - а эта, как ты считаешь, куда запишет значение "ХХХ"?
11 JuixyJes
 
27.04.19
20:36
НоваяСтрока = Наряд_КТУ.Добавить(); добавляет строку в ТЧ, НоваяСтрока.КТУ_Факт = "ХХХ" заполнит во все строки ТЧ "ХХХ"
12 HawkEye
 
27.04.19
20:36
(11) НоваяСтрока.КТУ_Факт = "ХХХ" заполнит во все строки ТЧ "ХХХ" - не во все, а в ДОБАВЛЕННУЮ....
13 JuixyJes
 
27.04.19
20:38
(12) Ну так в цикле же и запрос висит, который в цикле и заполняет , нет???
14 HawkEye
 
27.04.19
20:38
(11) и где у тебя логика, ты в ЦИКЛЕ добавления новых строк, хочешь заполнить все строки? строк то нет еще, что ты будешь заполнять?
15 HawkEye
 
27.04.19
20:40
(13) запрос в цикле - это вообще зло, не надо так делать...
а по поводу того, что он у тебя заполняет.... так текущую строку и заполняет...
обращаясь через НоваяСтрока.ХХХХХ - ты обращаешься к колонке ХХХХХ ТЕКУЩЕЙ строки, т.к. НоваяСтрока - это СТРОКА...
16 JuixyJes
 
27.04.19
20:45
(15) Так, я совсем запуталась в ваших обьяснениях. Допустим, я работаю с одной строкой, но для каждой новой строки условия повторяются, мне как то из цикла вынести нужно заполнение строки данными?
17 HawkEye
 
27.04.19
20:56
(16) создавая строку - заполняй значение только для этой строки.
или сначала создай все строки - потом заполняй колонку...
18 JuixyJes
 
27.04.19
21:02
(17) Тоесть я могу создать все строки, а потом заполнить уже КТУ_Факт, используя тот запрос и все из него вытекающее, правильно понимаю?
19 HawkEye
 
27.04.19
21:19
(18) ну можно и так...
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.