Округление сумм скидок в документах

1. pentanom 25 23.10.15 17:27 Сейчас в теме
Задача: в документах при установке скидки все суммы должны округляться до рубля.
Например, Сумма без скидки 1163 рубля, скидка 25% => сумма со скидкой должна быть 872 рубля (а не 872.25).

В процедуру РассчитатьСуммуТабЧасти() вставил в конец строку:

СуммаСкидки=Окр(СуммаСкидки/ СтрокаТабличнойЧасти.Количество,0)*СтрокаТабличнойЧасти.Количество;

СтрокаТабличнойЧасти.Сумма = Сумма - СуммаСкидки;

Вроде бы все правильно написал (и в отладчике выдает то, что надо), но....

Если документ не проведен, то сумма со скидкой 872.25, а если проведен - 872.

Может кто-нибудь встречался с такой штукой ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tailer2 23.10.15 17:35 Сейчас в теме
СуммаСкидки = Цел(СуммаСкидки)

очевидно, что РассчитатьСуммуТабЧасти() вызывается при записи
3. pentanom 25 23.10.15 18:00 Сейчас в теме
(2) tailer2, в том-то и дело, что РассчитатьСуммуТабЧасти() вызывается при изменении скидки.
4. pentanom 25 23.10.15 18:04 Сейчас в теме
(2) , А сумму скидки я считаю по такой формуле для того, чтобы в печатной форме документа цена со скидкой была тоже целая.
5. cool.vlad4 2 23.10.15 18:15 Сейчас в теме
быть может это поможет http://infostart.ru/public/84419/ ? (после применения скидки, "округлять" как в статье?)
6. pentanom 25 23.10.15 18:26 Сейчас в теме
(5) cool.vlad4, Мне бы не хотелось, чтобы тема повернулась на способ округления. Проблема в том, что для проведенного документа округление происходит, а для непроведенного - нет.
7. cool.vlad4 2 23.10.15 18:35 Сейчас в теме
(6) pentanom, а там и не совсем округление, я почему в кавычки слово взял. там нестандартное перераспределение копеек на цены товаров по алгоритму,описанному в статье. насчет проведения. а какая разница. если есть метод для проведенного документа, несложно переделать этот метод для непроведенного или даже не записанного документа (данные брать из таб части, которую можно и во врем таблице в запросе использовать)
без скидок метод в статье, помню, точно работал. убирал копейки. корректность не проверял, поскольку никогда этот метод не использовал в рабочем режиме.
8. pentanom 25 23.10.15 18:56 Сейчас в теме
(7) cool.vlad4, В моем случае с копейками все просто: цены большие (1000) , количества малые (1-2). Отбрасывание копеек к большим ошибкам не приводит.
Да и работает на проведенном документе. Меня интересует почему не работает на непроведенном.
9. comptr 34 27.10.15 08:22 Сейчас в теме
(8) pentanom, как вариант, можешь сделать так: ставишь точку останова в начале функции РассчитатьСуммуТабЧасти() и проводишь документ. Когда программа остановится на точке - открываешь стек вызовов (Отладка - Стек вызовов) и смотришь, откуда вызывается эта функция. Если на этом этапе не становится понятно - расставляешь ещё точек останова в вызывающих функциях и смотришь дальше.
10. pentanom 25 28.10.15 12:37 Сейчас в теме
(9) borodatii, А у меня не останавливается на этой функции при проведении документа. Да вроде бы и останавливаться не должна. Я и для проведенного и для непроведенного документа рассчитываю элементы формы. А, как мне кажется, при проведении используются уже рассчитанные элементы. И в отладчике и через сообщения суммы и цены округленные, а в форме только если документ проведен :(

Написано так:

Процедура ТоварыПроцентСкидкиНаценкиПриИзменении(Элемент)

	СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;

	// Рассчитать реквизиты табличной части.
	ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);
	ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект);
	СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
 Сообщить("-------------- "+СтрокаТабличнойЧасти.Сумма);

КонецПроцедуры // ТоварыПроцентРозничнойНаценкиПриИзменении()

Процедура РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокументОбъект, СпособРасчета = Неопределено) Экспорт

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

	МетаданныеДокумента = ДокументОбъект.Метаданные();

	Сумма = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество;
	СуммаСкидки = 0;

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

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

	КонецЕсли;

	СтрокаТабличнойЧасти.Сумма = Сумма - СуммаСкидки;

КонецПроцедуры // РассчитатьСуммуТабЧасти()
Показать


Так вот в сообщение сумма округленная всегда
11. comptr 34 28.10.15 16:29 Сейчас в теме
(10) pentanom, небольшие изыскание привели вот к чему:
После изменения любого поля в табличной части "Товары" формы документа срабатывает процедура "ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)" (тестировал на документе Реализации товаров и услуг). В ней в числе прочего вызывается процедура "ПересчитатьАвтоматическиеСкидки()", в которой есть проверка на то, проведён документ или нет. Если проведён, то дальнейшие расчеты не производятся и сумма скидки не меняется. Если не проведён, то вызывается "ОбработкаТабличныхЧастей.РассчитатьСкидкиПриПродаже(...)" и из неё - "ПроверкаМинимальнойЦены(...)", в которой суммы строк таблицы товаров пересчитываются заново, уже без Вашего округления.
Мини-расследование было произведено на УТ 10.3.31.1, но не думаю, что этот блок сильно менялся.
pentanom; tailer2; +2 Ответить
12. pentanom 25 29.10.15 22:46 Сейчас в теме
(11) borodatii, Спасибо. Но еще хотелось бы понять зачем так сделано.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот