Имя: Пароль:
1C
 
Автоматический перерасчет суммы строки табличной части, при установке вручную
0 slasher
 
18.06.15
16:50
Добрый вечер!

Комплексная автоматизация. Документ "Заявка покупателя". Табличная часть "Услуги". Ввожу количество = 2, цена = 3, сумма автоматом рассчитывается = 6. Все хорошо. Когда сумму руками правлю и ставлю 6.01 программа пересчитывает цену = 3.01 и сумму ставит 6.02. Хочу чтобы программа сумму не меняла, а оставляла ту, которую поставит пользователь.
Отладчиком пользоваться умею. Не смог найти где сумма пересчитывается.
Подскажите, что делать в моей ситуации?
1 ДенисЧ
 
18.06.15
16:50
Есть два варианта
1. Простой. Заплатить тому, кто умеет.
2. Сложный. Научиться самому.
2 vicof
 
18.06.15
16:51
"Отладчиком пользоваться умею"
Таки, видимо не умеете
3 slasher
 
18.06.15
16:53
(1) чему научиться самому?
4 slasher
 
18.06.15
16:53
(2) а можете меня носом ткнуть?
5 VikingKosmo
 
18.06.15
16:54
(4) в отладчик?
6 vicof
 
18.06.15
16:58
(4) Сколько? Мне вот откровенно лень комплексную ставить, чо-то там отлаживать, потом окажется, что нетиповая, и какие-нить криворукие погромисты написали кривую функцию изменения цены при изменении суммы.
7 slasher
 
18.06.15
16:59
(5) в строку кода, где сумма пересчитывается в моём случае
8 ВРедная
 
18.06.15
17:03
(6) Вероятнее всего про чьи-то руки как раз в точку. Врядли в типовой такой дурной код
9 slasher
 
18.06.15
17:03
(6) если лень, тогда зачем было вообще писать сообщение?
Или было непреодолимое желание поучить кого-то жизни?
10 разработчик 1с
 
18.06.15
17:04
(7) УслугиСуммаПриИзменении(Элемент) - чтото типа такого
11 ВРедная
 
18.06.15
17:05
(9) А что мы тут сможем еще сделать? Удаленно к тебе подключиться и отлаживать твою переписанную комплексную?
12 Poluk
 
18.06.15
17:06
В событие "при изменении", в колонке "сумма" смотрели?
13 vicof
 
18.06.15
17:07
(9) Я спросил "сколько"?
14 slasher
 
18.06.15
17:09
(6)(8)(11) база типовая
15 slasher
 
18.06.15
17:10
(10)(12) конечно посмотрел, ничего не нашёл
16 slasher
 
18.06.15
17:11
(13) чего сколько?
17 vicof
 
18.06.15
17:12
(16) Дашь, чтобы я поковырялся в твоей базе
18 bootini
 
18.06.15
17:14
ОбновлениеОтображения()
19 Poluk
 
18.06.15
17:25
ТОгда цену нужно в табло поставить, и смотреть на изменение во времени отработки события при изменении.. если меняется то где то внутри этого события.... отладчиком в это событие попадает?
20 slasher
 
18.06.15
17:29
(17) такие вопросы нужно согласовывать с Волшебником
21 slasher
 
18.06.15
17:30
(18) уже теплее, но не то, ещё до обновления отображения сумма измененная
22 ВРедная
 
18.06.15
17:39
(15) Серьезно? Ничего?

Процедура УслугиСуммаПриИзменении(Элемент)

    ОбработкаТабличныхЧастей.ПриИзмененииСуммыТабЧасти(ЭлементыФормы.Услуги.ТекущиеДанные, ЭтотОбъект, глЗначениеПеременной("глТекущийПользователь"),,истина,мПересчитыватьСкидку,истина,"Услуги");
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(ЭлементыФормы.Услуги.ТекущиеДанные, ЭтотОбъект);

КонецПроцедуры

Процедура которая вызывается при изменении суммы. Внезнапно. Первая вызываемая процедура пересчитывает сумму или скидку. Ты до нее не дошел?
23 slasher
 
18.06.15
17:58
(22) ну это первая процедура куда мы вываливаемся из формы документа и что? Я в упор не вижу пересчет суммы.
24 bootini
 
18.06.15
18:06
"Отладчиком пользоваться умею."  :)
25 hhhh
 
18.06.15
18:07
(23) ну давай сюда эту процедуру
26 bootini
 
18.06.15
18:08
Остановись на строке:
ОбработкаТабличныхЧастей.ПриИзмененииСуммыТабЧасти(ЭлементыФормы.Услуги.ТекущиеДанные, ЭтотОбъект, глЗначениеПеременной("глТекущийПользователь"),,истина,мПересчитыватьСкидку,истина,"Услуги");

И нажми на клавиатуре кнопочку "F11"
27 slasher
 
18.06.15
18:11
проваливаемся по F12

видим:
Процедура ПриИзмененииСуммыТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект, ТекПользователь, РасчетАвтоматическихСкидок = Ложь, ЕстьРеквизитДокументаПроцентСкидкиНаценки = Неопределено, ПересчитыватьСкидкуДокумента = Неопределено, ЕстьРеквизитДокументаПроцентАвтоматическихСкидок = Неопределено, ИмяТабЧастиДокумента = неопределено) Экспорт

    ИмяТабличнойЧасти = ?(ИмяТабЧастиДокумента=неопределено,ОбщегоНазначения.ПолучитьИмяТабличнойЧастиПоСсылкеНаСтроку(СтрокаТабличнойЧасти),ИмяТабЧастиДокумента);

    Если СтрокаТабличнойЧасти.Количество=0 Тогда
        СтрокаТабличнойЧасти.Цена = 0;
    Иначе    
        МетаданныеДокумента = ДокументОбъект.Метаданные();
        ЕстьРеквизитПроцентСкидкиНаценки = ?(ЕстьРеквизитДокументаПроцентСкидкиНаценки=неопределено,ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("ПроцентСкидкиНаценки", МетаданныеДокумента, ИмяТабличнойЧасти),ЕстьРеквизитДокументаПроцентСкидкиНаценки);
        Если ЕстьРеквизитПроцентСкидкиНаценки Тогда
            ПересчитыватьСкидку = ?(ПересчитыватьСкидкуДокумента=неопределено,УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ТекПользователь, "ПриИзмененииСуммыПересчитыватьСкидку"),ПересчитыватьСкидкуДокумента);
            ЕстьРеквизитПроцентАвтоматическихСкидок = ?(ЕстьРеквизитДокументаПроцентАвтоматическихСкидок=неопределено,ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("ПроцентАвтоматическихСкидок", МетаданныеДокумента, ИмяТабличнойЧасти),ЕстьРеквизитДокументаПроцентАвтоматическихСкидок);

            Если ПересчитыватьСкидку Тогда
                Если (СтрокаТабличнойЧасти.Цена = 0) Или (СтрокаТабличнойЧасти.Количество = 0) Тогда
                    СтрокаТабличнойЧасти.ПроцентСкидкиНаценки = 0;
                    Если СтрокаТабличнойЧасти.Цена = 0 Тогда
                        ОбщегоНазначения.СообщитьОбОшибке("Цена равна 0, после изменения суммы установлена нулевая скидка!");
                    Иначе
                        ОбщегоНазначения.СообщитьОбОшибке("Количество равно 0, после изменения суммы установлена нулевая скидка!");
                    КонецЕсли;
                Иначе
                    СуммаСоСкидками = СтрокаТабличнойЧасти.Сумма;
                    СуммаБезСкидок  = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество;
                    ПроцентСкидки   = 100 - (СуммаСоСкидками*100)/СуммаБезСкидок;
                    ПроцентАвтоматическихСкидок = 0;
                    
                    Если ЕстьРеквизитПроцентАвтоматическихСкидок Тогда
                        ПроцентАвтоматическихСкидок = СтрокаТабличнойЧасти.ПроцентАвтоматическихСкидок;
                    КонецЕсли;
                    СтрокаТабличнойЧасти.ПроцентСкидкиНаценки = ПроцентСкидки - ПроцентАвтоматическихСкидок;

                КонецЕсли;
            Иначе
                Если СтрокаТабличнойЧасти.ПроцентСкидкиНаценки >= 100 Тогда
                    СтрокаТабличнойЧасти.Цена = 0;
                    ОбщегоНазначения.СообщитьОбОшибке("Скидка равна 100%, после изменения суммы установлена нулевая цена!");
                Иначе
                    ПроцентАвтоматическихСкидок = 0;
                    Если ЕстьРеквизитПроцентАвтоматическихСкидок Тогда
                        ПроцентАвтоматическихСкидок = СтрокаТабличнойЧасти.ПроцентАвтоматическихСкидок;
                    КонецЕсли;
                    СуммаБезСкидок  = СтрокаТабличнойЧасти.Сумма * 100/
                                      (100 - СтрокаТабличнойЧасти.ПроцентСкидкиНаценки - ПроцентАвтоматическихСкидок);
                    СтрокаТабличнойЧасти.Цена = СуммаБезСкидок / СтрокаТабличнойЧасти.Количество;
                КонецЕсли;
            КонецЕсли;
        Иначе
            СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.Количество;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры // ПриИзмененииСуммыТабЧасти()
28 slasher
 
18.06.15
18:13
ПересчитыватьСкидку = Ложь, если что
29 shuhard_серый
 
18.06.15
18:13
(0) развод явный и очевидный
нет в КА Документ "Заявка покупателя"
30 bootini
 
18.06.15
18:15
И что мы видим, а видим мы:

           СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.Количество;
31 bootini
 
18.06.15
18:17
(29) да, понятно, охота тоже херней помаяться, на главной все рано интересных тем нет
32 slasher
 
18.06.15
18:17
(29) не надо придираться, ЗаказПокупателя
33 slasher
 
18.06.15
18:19
(30) вы меня простите, но это пересчет цены, а не суммы
34 bootini
 
18.06.15
18:20
(33) я уже и забыл с чего все начиналось
35 ilkoder
 
18.06.15
18:25
И чего? в упп таже фигня - пересчитывает по сумме подходящую цену, а потом по цене опять считает сумму. В бухалтерии не так - ставь какую хочешь сумму - цену подгонит, а сумму не меняет. только если типовой код менять
36 bootini
 
18.06.15
18:27
(33) после выхода из процедуры, какие цена и сумма выходят?
37 slasher
 
18.06.15
18:42
(35) где она "по цене опять считает сумму", я не могу этот момент поймать, чтобы исправить код.
38 slasher
 
18.06.15
18:43
(36) на выходе из процедуры выходят суммы, которые руками ставил, до обновления отображения уже измененные.
39 bootini
 
18.06.15
19:03
(38) цену пересчитывает 3,005, потом округляет до двух знаков до 3,01 и пересчитывает Сумму, может ТоварыПриОкончанииРедактирования что-то есть?
40 slasher
 
18.06.15
19:39
(39) красавец, спасибо, именно где-то внутри этой процедуры. я не нашел где конкретно, не где-то там. На входе в процедуры одна сумма, на выходе другая.
41 slasher
 
18.06.15
19:42
как нормальный человек (я не себя имею ввиду) должен был догадаться где находится этот пересчёт?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший