Задача: в документах при установке скидки все суммы должны округляться до рубля.
Например, Сумма без скидки 1163 рубля, скидка 25% => сумма со скидкой должна быть 872 рубля (а не 872.25).
В процедуру РассчитатьСуммуТабЧасти() вставил в конец строку:
(5) cool.vlad4, Мне бы не хотелось, чтобы тема повернулась на способ округления. Проблема в том, что для проведенного документа округление происходит, а для непроведенного - нет.
(6) pentanom, а там и не совсем округление, я почему в кавычки слово взял. там нестандартное перераспределение копеек на цены товаров по алгоритму,описанному в статье. насчет проведения. а какая разница. если есть метод для проведенного документа, несложно переделать этот метод для непроведенного или даже не записанного документа (данные брать из таб части, которую можно и во врем таблице в запросе использовать)
без скидок метод в статье, помню, точно работал. убирал копейки. корректность не проверял, поскольку никогда этот метод не использовал в рабочем режиме.
(7) cool.vlad4, В моем случае с копейками все просто: цены большие (1000) , количества малые (1-2). Отбрасывание копеек к большим ошибкам не приводит.
Да и работает на проведенном документе. Меня интересует почему не работает на непроведенном.
(8) pentanom, как вариант, можешь сделать так: ставишь точку останова в начале функции РассчитатьСуммуТабЧасти() и проводишь документ. Когда программа остановится на точке - открываешь стек вызовов (Отладка - Стек вызовов) и смотришь, откуда вызывается эта функция. Если на этом этапе не становится понятно - расставляешь ещё точек останова в вызывающих функциях и смотришь дальше.
(9) borodatii, А у меня не останавливается на этой функции при проведении документа. Да вроде бы и останавливаться не должна. Я и для проведенного и для непроведенного документа рассчитываю элементы формы. А, как мне кажется, при проведении используются уже рассчитанные элементы. И в отладчике и через сообщения суммы и цены округленные, а в форме только если документ проведен :(
Написано так:
Процедура ТоварыПроцентСкидкиНаценкиПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
// Рассчитать реквизиты табличной части.
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);
СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
Сообщить("-------------- "+СтрокаТабличнойЧасти.Сумма);
КонецПроцедуры // ТоварыПроцентРозничнойНаценкиПриИзменении()
Процедура РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект, СпособРасчета = Неопределено) Экспорт
ИмяТабличнойЧасти = ОбщегоНазначения.ПолучитьИмяТабличнойЧастиПоСсылкеНаСтроку(СтрокаТабличнойЧасти);
МетаданныеДокумента = ДокументОбъект.Метаданные();
Сумма = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество;
СуммаСкидки = 0;
Если (СпособРасчета = Неопределено)
Или (СпособРасчета = Перечисления.СпособРасчетаСуммыДокумента.СУчетомВсехСкидок)
Или (СпособРасчета = Перечисления.СпособРасчетаСуммыДокумента.БезУчетаРучнойСкидки) Тогда
Если ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("ПроцентАвтоматическихСкидок", МетаданныеДокумента,
ИмяТабличнойЧасти) Тогда
СуммаСкидки = Сумма * СтрокаТабличнойЧасти.ПроцентАвтоматическихСкидок / 100;
КонецЕсли;
Если (СпособРасчета <> Перечисления.СпособРасчетаСуммыДокумента.БезУчетаРучнойСкидки)Тогда
Если ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("ПроцентСкидкиНаценки", МетаданныеДокумента, ИмяТабличнойЧасти) Тогда
СуммаСкидки = СуммаСкидки + (Сумма * СтрокаТабличнойЧасти.ПроцентСкидкиНаценки / 100);
КонецЕсли;
КонецЕсли;
Если СтрокаТабличнойЧасти.Количество<>0 И Цел(СтрокаТабличнойЧасти.Количество)=СтрокаТабличнойЧасти.Количество Тогда
СуммаСкидки=Окр(СуммаСкидки/СтрокаТабличнойЧасти.Количество,0)*СтрокаТабличнойЧасти.Количество;
Иначе
СуммаСкидки=Окр(СуммаСкидки,0);
КонецЕсли;
КонецЕсли;
СтрокаТабличнойЧасти.Сумма = Сумма - СуммаСкидки;
КонецПроцедуры // РассчитатьСуммуТабЧасти()
(10) pentanom, небольшие изыскание привели вот к чему:
После изменения любого поля в табличной части "Товары" формы документа срабатывает процедура "ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)" (тестировал на документе Реализации товаров и услуг). В ней в числе прочего вызывается процедура "ПересчитатьАвтоматическиеСкидки()", в которой есть проверка на то, проведён документ или нет. Если проведён, то дальнейшие расчеты не производятся и сумма скидки не меняется. Если не проведён, то вызывается "ОбработкаТабличныхЧастей.РассчитатьСкидкиПриПродаже(...)" и из неё - "ПроверкаМинимальнойЦены(...)", в которой суммы строк таблицы товаров пересчитываются заново, уже без Вашего округления.
Мини-расследование было произведено на УТ 10.3.31.1, но не думаю, что этот блок сильно менялся.