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

КТУ рабочих в табличной части документа

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

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

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

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

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

дальше:

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


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

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.