|
Заполнение ТЧ и пересчет суммы | ☑ | ||
---|---|---|---|---|
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) Если вам нужно заполнить одновременно ЦенаТары ЦенаТранспорта ЦенаКомиссии на форме и передать в документ, тогда можно сделать: ключ - имя колонки, получаем следующее:
Желательно сделать структуру с фиксированными ключами, чтобы не проверять на наличие свойства ИначеЕсли СтруктураЗаполнения.ВидОперации ="Расчет суммой" Тогда ЗаполнитьЗначенияСвойств(ТекСтрока,СтруктураЗаполнения) ТекСтрока.ЦенаЧистая = ТекСтрока.Цена - ТекСтрока.ЦенаТары - ТекСтрока.ЦенаТранспорта - ТекСтрока.ЦенаКомиссии; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |