Имя: Пароль:
1C
1С v8
Заполнение ТЧ и пересчет суммы
,
0 NepomAR
 
20.12.21
10:18
Здравствуйте. подскажите пожалуйста где ошибка, 2 дня смотрю на этот код и не могу найти. И так, в форме основного документа в ТЧ есть строки Комиссия, Тара, Транспорт. нужно их рассчитать и заполнить. Заполнение происходит из доп формы, обработка происходит в модуле основного документа, в процедуре ОбработкаВыбора. Расчет идет процентом и расчет идет суммой. запускаю отладку, проходит без ошибок, но когда начинаю смотреть заполнение в документе, выясняется что расчет суммы не заполняет.
Буду очень Очень благодарна если подскажете где ошибка моя.



Собственно код:

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если Тип(ВыбранноеЗначение)=Тип("ДокументСсылка.ртЗаказ")  Тогда
        ЗаполнениеТаблЧастиНаСервереИзЗаказаНаПроект(ВыбранноеЗначение);    
    ИначеЕсли ТипЗнч(ВыбранноеЗначение) = Тип("Структура") И ВыбранноеЗначение.Свойство("ВидОперации")
              И ВыбранноеЗначение.Свойство("СуммаРасчет")
            И ВыбранноеЗначение.Свойство("Процент") Тогда
                  МассивСтрок = ЭтаФорма.Элементы.Товары.ВыделенныеСтроки;
                Если МассивСтрок.Количество()>0 Тогда
                Для Каждого СтрМассива Из МассивСтрок Цикл
                    ТекСтрока=Объект.Товары.НайтиПоИдентификатору(СтрМассива);
                    
                    //Если ВыбранноеЗначение.ВидОперации = "Расчет суммой"  Тогда
                     СуммаРасчет = ВыбранноеЗначение.СуммаРасчет;
                    Если ВыбранноеЗначение.Комиссия = "Комиссия" Тогда
                      ТекСтрока.ЦенаКомиссии = СуммаРасчет;
                            
                    ИначеЕсли ВыбранноеЗначение.Комиссия = "Тара" Тогда
                        ТекСтрока.ЦенаТары = СуммаРасчет;
                        
                    ИначеЕсли ВыбранноеЗначение.Комиссия = "Транспорт" Тогда
                        ТекСтрока.ЦенаТранспорта = СуммаРасчет;
                        
    ТекСтрока.ЦенаЧистая  = ТекСтрока.Цена - ТекСтрока.ЦенаТары - ТекСтрока.ЦенаТранспорта - ТекСтрока.ЦенаКомиссии;
    ТекСтрока.Сумма       = ТекСтрока.Цена * ТекСтрока.Количество;
    ТекСтрока.СуммаЧистая = ТекСтрока.ЦенаЧистая * ТекСтрока.Количество;
    Если ТекСтрока.КоличествоШт <> 0 Тогда
        ТекСтрока.ЦенаШт = ТекСтрока.Сумма/ТекСтрока.КоличествоШт;
    КонецЕсли;
        конецЕсли;
            
                конеццикла;
                    Для Каждого СтрМассива Из МассивСтрок Цикл
                    ТекСтрока=Объект.Товары.НайтиПоИдентификатору(СтрМассива);
                    //Если ВыбранноеЗначение.ВидОперации = "Расчет процентом"  Тогда
                    ПроцентРасчет=Формат(ТекСтрока.ЦенаЧистая * ВыбранноеЗначение.Процент/100,"ЧДЦ=2");         
                        
                    Если ВыбранноеЗначение.Комиссия ="Комиссия"  Тогда
                        ТекСтрока.ЦенаКомиссии=ПроцентРасчет;
                    ИначеЕсли ВыбранноеЗначение.Комиссия="Тара" Тогда
                        ТекСтрока.ЦенаТары=ПроцентРасчет;
                    ИначеЕсли ВыбранноеЗначение.Комиссия="Транспорт" Тогда
                         ТекСтрока.ЦенаТранспорта=ПроцентРасчет;
                    конецЕсли;
                КонецЦикла;
                        

    ТекСтрока.ЦенаЧистая  = ТекСтрока.Цена - ТекСтрока.ЦенаТары - ТекСтрока.ЦенаТранспорта - ТекСтрока.ЦенаКомиссии;
    ТекСтрока.Сумма       = ТекСтрока.Цена * ТекСтрока.Количество;
    ТекСтрока.СуммаЧистая = ТекСтрока.ЦенаЧистая * ТекСтрока.Количество;
    Если ТекСтрока.КоличествоШт <> 0 Тогда
        ТекСтрока.ЦенаШт = ТекСтрока.Сумма/ТекСтрока.КоличествоШт;
    КонецЕсли;
    конецесли;
1 Kassern
 
20.12.21
10:20
(0) в отладке в какое условие попадает? Во второе?
2 NepomAR
 
20.12.21
10:22
(1) да, пролетает первое условие. везде выходит ложь
3 Kassern
 
20.12.21
10:22
(0) "//Если ВыбранноеЗначение.ВидОперации = "Расчет суммой"  Тогда
                     СуммаРасчет = ВыбранноеЗначение.СуммаРасчет; "
СуммаРасчет это что? Переменная, которую только что объявили, или реквизит формы? Если реквизит формы, то зачем в цикле выделенных ТЧ заполняете?
4 dubolom
 
20.12.21
10:22
(2) Так а чему равно ВыбранноеЗначение.Комиссия?
5 Kassern
 
20.12.21
10:25
(2) вы сами себе противоречите, я спрашиваю, попадает ли во второе условие, вы пишите ДА, а потом "везде выходит ложь". Та у вас вообще условия не выполняются? Если так, то что в параметрах процедуры находится при отладке?
6 Kassern
 
20.12.21
10:30
(3) по поводу СуммаРасчет увидел, где вы ее используете.
Лучше бы передавали имя колонки, тогда бы строчка была всего одна:
ТекСтрока[ВыбранноеЗначение.ИмяКолонки] = ВыбранноеЗначение.СуммаРасчет;
7 NepomAR
 
20.12.21
10:32
(3) Если ВыбранноеЗначение.ВидОперации = "Расчет суммой"  Тогда   --- В доп форме есть поле ввода с выбором из двух значений. Если выбирается "Расчет суммой" выпадает поле для ввода числа(СуммаРасчет), вводишь число нажимаешь "ОК" и в ТЧ основного документа в строке Комиссия к примеру происходит расчет и заполнение. аналогично происходит если выбирается значение "Расчет Процентом".
8 NepomAR
 
20.12.21
10:33
(4) ВыбранноеЗначение.Комиссия это строка "Комиссия" в ТЧ основной формы
9 Kassern
 
20.12.21
10:35
(7) еще раз, какой кусок кода у вас отрабатывает в данной процедуре? На отсюда не видно, что у вас в параметрах процедуры хранится после выбора
10 NepomAR
 
20.12.21
10:41
(9)  СуммаРасчет = ВыбранноеЗначение.СуммаРасчет;   ----- ИСТИНА(ВЫБРАННОЕ ЗНАЧЕНИЕ 500 ТО ЧТО ВВОЖУ)

Если ВыбранноеЗначение.Комиссия = "Комиссия" Тогда  ---ИСТИНА

ТекСтрока.ЦенаКомиссии = СуммаРасчет;   ---- ЛОЖЬ
        
ИначеЕсли ВыбранноеЗначение.Комиссия = "Тара" Тогда -----ИСТИНА

ТекСтрока.ЦенаТары = СуммаРасчет;   ---ЛОЖЬ

                        
ИначеЕсли ВыбранноеЗначение.Комиссия = "Транспорт" Тогда   ---ИСТИНА

ТекСтрока.ЦенаТранспорта = СуммаРасчет;   ---ЛОЖЬ

ТекСтрока ВЕЗДЕ ЗНАЧЕНИЕ 0 , СуммаРасчет ЗНАЧЕНИЕ 500 (то что ввожу в поле ввода)
11 NepomAR
 
20.12.21
10:43
(9) это первое условие. то что показывает отладчик. второе условие где происходит расчет процента работает нормально.
12 Мимохожий Однако
 
20.12.21
10:45
Заполнять надо в процедуре НаСервере
13 Kassern
 
20.12.21
10:48
(10) Вы снова не поняли...
Ваш код выглядит следующим образом

    Если Парам1=123 тогда
        Заполнение по первому условию
    ИначеЕсли Парам1=0 И Парам2="3232" тогда        
        Заполнение по второму условию
    ИначеЕсли Парам1=321 И Парам2="ыва" тогда
        Заполнение по второму условию
    Иначе
        ....
    КонецЕсли;

Так вот какое условие у вас выполняется? Потом выяснится, что у вас в отладке вообще все условия проскакивает, поэтому ничего и не выполняется
14 hhhh
 
20.12.21
10:51
(12) не, это можно и на клиенте. Там нет серверных функций.
15 NepomAR
 
20.12.21
10:51
(13)  Для Каждого СтрМассива Из МассивСтрок Цикл
                    ТекСтрока=Объект.Товары.НайтиПоИдентификатору(СтрМассива);
                    //Если ВыбранноеЗначение.ВидОперации = "Расчет процентом"  Тогда
                    ПроцентРасчет=Формат(ТекСтрока.ЦенаЧистая * ВыбранноеЗначение.Процент/100,"ЧДЦ=2");        
                        
                    Если ВыбранноеЗначение.Комиссия ="Комиссия"  Тогда
                        ТекСтрока.ЦенаКомиссии=ПроцентРасчет;
                    ИначеЕсли ВыбранноеЗначение.Комиссия="Тара" Тогда
                        ТекСтрока.ЦенаТары=ПроцентРасчет;
                    ИначеЕсли ВыбранноеЗначение.Комиссия="Транспорт" Тогда
                         ТекСтрока.ЦенаТранспорта=ПроцентРасчет;
                    конецЕсли;
                КонецЦикла;


вот это выполняется.
16 NepomAR
 
20.12.21
10:55
(13) первое аналогичное условие проскакивает полностью, если идти отладчиком построчно просто перепрыгивает на второе условие
17 Kassern
 
20.12.21
10:57
(15) а зачем у вас в коде 2 раза одно и тоже выполняется? Вы в цикле 2 раза обходите выделенные строчки ТЧ зачем?
18 Kassern
 
20.12.21
10:58
ВыбранноеЗначение.Процент у вас заполнено?
19 Kassern
 
20.12.21
10:58
проверьте в отладке, чтобы у вас все данные были верно заполнены в параметрах процедуры
20 acht
 
20.12.21
11:01
(15) > ПроцентРасчет=Формат(ТекСтрока.ЦенаЧистая * ВыбранноеЗначение.Процент/100,"ЧДЦ=2");

Это ты округление, что-ли, так делаешь???
21 Kassern
 
20.12.21
11:02
и приведите код в порядок, уберите дубли кода, заполнение ТЧ выведите в отдельную процедуру, в процедуре выбора вы лишь должны проверять параметры выбора и в зависимости от заполнения выполнять ту или иную функцию/процедуру. Тогда код будет читаем и вам будет легче работать
22 Kassern
 
20.12.21
11:02
завтра понадобится пересчет при ручном изменении колонки ТЧ, так же копирнете кусок кода и воткноете в ТЧКОлонкаПриИзменении?)
23 NepomAR
 
20.12.21
11:03
(21) поняла. сделаю. как вы поняли я только учусь.
24 NepomAR
 
20.12.21
11:04
(22) приведу код в порядок я имею в виду)
25 Kassern
 
20.12.21
11:07
(23) это еще лучше, приучайте себя писать понятный код разбитый на функции/процедуры. Не стоит писать длинные портянки кода. Если видите, что один и тот же код приходится повторять 2 и более раз, значит стоит задуматься над рефакторингом. Переучиваться всегда сложнее
26 NepomAR
 
20.12.21
11:13
(18) если в доп форме выбирается значение "расчет процентом" и указывается какой процент, то все считает, в отладке показывает ВыбранноеЗначение.Процент тот что указывается( к примеру 10) считается по формуле ПроцентРасчета, и записывается в ТЧ основного документа в колонку Комиссия, Тара и Транспорт, в зависимости от того какой расчет производится. если указываешь "расчет суммой", то этого расчета не происходит. написала два раза что бы не запутаться в итоге запуталась кажется еще сильнее
27 Kassern
 
20.12.21
11:15
(26) а что у вас в ВыбранноеЗначение хранится? Можете скриншот скинуть?
28 NepomAR
 
20.12.21
11:17
(27) как его добавить? не могу найти как добавить скриншот
29 Kassern
 
20.12.21
11:18
И у вас основной расчет выполняется не в цикле, а только для последней выделенной строчки, зачем вы вынесли за цикл вот это?
    ТекСтрока.ЦенаЧистая  = ТекСтрока.Цена - ТекСтрока.ЦенаТары - ТекСтрока.ЦенаТранспорта - ТекСтрока.ЦенаКомиссии;
    ТекСтрока.Сумма       = ТекСтрока.Цена * ТекСтрока.Количество;
    ТекСтрока.СуммаЧистая = ТекСтрока.ЦенаЧистая * ТекСтрока.Количество;
30 Kassern
 
20.12.21
11:18
(28) на любой файлообменник скиньте и ссылку сюда
31 NepomAR
 
20.12.21
11:25
32 hhhh
 
20.12.21
11:41
(31) фориат сразу выбросьте, формат дает в виде текста, а нужен ПроцентРасчет в виде числового значения. Вы же там умножаете его потом.
33 NepomAR
 
20.12.21
11:46
(30) Попробовала сделать код короче, объединила условия, проблема та же и осталась.
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если Тип(ВыбранноеЗначение)=Тип("ДокументСсылка.ртЗаказНаПроектирование")  Тогда
        ЗаполнениеТаблЧастиНаСервереИзЗаказаНаПроект(ВыбранноеЗначение);    
    ИначеЕсли ТипЗнч(ВыбранноеЗначение) = Тип("Структура") И ВыбранноеЗначение.Свойство("ВидОперации")
              И ВыбранноеЗначение.Свойство("СуммаРасчет")
            И ВыбранноеЗначение.Свойство("Процент") Тогда
                  МассивСтрок = ЭтаФорма.Элементы.Товары.ВыделенныеСтроки;
                Если МассивСтрок.Количество()>0 Тогда
                Для Каждого СтрМассива Из МассивСтрок Цикл
                    ТекСтрока=Объект.Товары.НайтиПоИдентификатору(СтрМассива);
                    //Если ВыбранноеЗначение.ВидОперации = "Расчет процентом"  Тогда
                    ПроцентРасчет=ТекСтрока.ЦенаЧистая * ВыбранноеЗначение.Процент/100;         
                    СуммаРасчет = ВыбранноеЗначение.СуммаРасчет;    
                    Если ВыбранноеЗначение.Комиссия ="Комиссия"  Тогда
                        ТекСтрока.ЦенаКомиссии=ПроцентРасчет;
                    ИначеЕсли ВыбранноеЗначение.Комиссия="Тара" Тогда
                        ТекСтрока.ЦенаТары=ПроцентРасчет;
                    ИначеЕсли ВыбранноеЗначение.Комиссия="Транспорт" Тогда
                         ТекСтрока.ЦенаТранспорта=ПроцентРасчет;
                    ИначеЕсли ВыбранноеЗначение.Комиссия = "Комиссия" Тогда
                      ТекСтрока.ЦенаКомиссии = СуммаРасчет;        
                    ИначеЕсли ВыбранноеЗначение.Комиссия = "Тара" Тогда
                        ТекСтрока.ЦенаТары = СуммаРасчет;    
                    ИначеЕсли ВыбранноеЗначение.Комиссия = "Транспорт" Тогда
                        ТекСтрока.ЦенаТранспорта = СуммаРасчет;
                                                конецЕсли;
                
                        
        ТекСтрока.ЦенаЧистая  = ТекСтрока.Цена - ТекСтрока.ЦенаТары - ТекСтрока.ЦенаТранспорта - ТекСтрока.ЦенаКомиссии;
    ТекСтрока.Сумма       = ТекСтрока.Цена * ТекСтрока.Количество;
    ТекСтрока.СуммаЧистая = ТекСтрока.ЦенаЧистая * ТекСтрока.Количество;
    Если ТекСтрока.КоличествоШт <> 0 Тогда
        ТекСтрока.ЦенаШт = ТекСтрока.Сумма/ТекСтрока.КоличествоШт;
    КонецЕсли;
     КонецЦикла;
34 NepomAR
 
20.12.21
11:46
(32) поняла, убрала формат. Спасибо
35 Kassern
 
20.12.21
11:49
(33) у вас должно получиться что-то такое, если я правильно понял логику работы:
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если Тип(ВыбранноеЗначение)=Тип("ДокументСсылка.ртЗаказ")  Тогда
        ЗаполнениеТаблЧастиНаСервереИзЗаказаНаПроект(ВыбранноеЗначение);    
    ИначеЕсли ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда    
        ЗаполнитьВыделенныеСтрокиПоДаннымВыбораНаКлиенте(ВыбранноеЗначение);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьВыделенныеСтрокиПоДаннымВыбораНаКлиенте(СтруктураЗаполнения)
    
    МассивСтрок = ЭтаФорма.Элементы.Товары.ВыделенныеСтроки;
    Для Каждого СтрМассива Из МассивСтрок Цикл
        ТекСтрока=Объект.Товары.НайтиПоИдентификатору(СтрМассива);
        Если СтруктураЗаполнения.ВидОперации ="Рассчет с процентом" Тогда         
            ПроцентРасчет=Окр(ТекСтрока.ЦенаЧистая * ВыбранноеЗначение.Процент/100,2);                 
            ТекСтрока.ЦенаЧистая  = ТекСтрока.Цена - ТекСтрока.ЦенаТары - ТекСтрока.ЦенаТранспорта - ТекСтрока.ЦенаКомиссии;
        ИначеЕсли СтруктураЗаполнения.ВидОперации ="Расчет суммой" Тогда
            ТекСтрока[ВыбранноеЗначение.ИмяКолонки] = ВыбранноеЗначение.СуммаРасчет;     //Вместо "Комиссия" передавать имя колонки "ЦенаКомиссии"
            ТекСтрока.ЦенаЧистая  = ТекСтрока.Цена - ТекСтрока.ЦенаТары - ТекСтрока.ЦенаТранспорта - ТекСтрока.ЦенаКомиссии;
        КонецЕсли    
        ТекСтрока.Сумма       = ТекСтрока.Цена * ТекСтрока.Количество;
        ТекСтрока.СуммаЧистая = ТекСтрока.ЦенаЧистая * ТекСтрока.Количество;
        Если ТекСтрока.КоличествоШт <> 0 Тогда
            ТекСтрока.ЦенаШт = ТекСтрока.Сумма/ТекСтрока.КоличествоШт;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры
36 Kassern
 
20.12.21
11:51
что у вас с отступами при написании кода? Используйте форматирование для отступов (Альт+шифт+F на выделенный кусок кода)
37 Kassern
 
20.12.21
11:54
я бы вместо свойства Комиссия в выбранной структуре возвращал бы свойство ИмяКолонки, а значением было бы имя нужного реквизита ТЧ, которое нужно заполнить
38 Kassern
 
20.12.21
12:38
(37) Если вам нужно заполнить одновременно ЦенаТары ЦенаТранспорта ЦенаКомиссии на форме и передать в документ, тогда можно сделать: ключ - имя колонки, получаем следующее:
Желательно сделать структуру с фиксированными ключами, чтобы не проверять на наличие свойства
ИначеЕсли СтруктураЗаполнения.ВидОперации ="Расчет суммой" Тогда

    ЗаполнитьЗначенияСвойств(ТекСтрока,СтруктураЗаполнения)
    ТекСтрока.ЦенаЧистая  = ТекСтрока.Цена - ТекСтрока.ЦенаТары - ТекСтрока.ЦенаТранспорта - ТекСтрока.ЦенаКомиссии;