Имя: Пароль:
1C
1С v8
УПП. Скидки и сумма на основании заказа
0 MAPATNK2
 
naïve
11.11.20
16:00
Всем доброго дня. Есть заказ в котором нельзя редактировать цены. Корректирую сумму, получаю ручную скидку, далее Делаю Реализацию на основании заказа покупателя. И вот счастье, совсем другая сумма. Я понимаю, это все из за округлений, но это ж бред. Все менеджеры теперь должны постоянно перепроверять совпадают ли суммы реализации с заказом.
Есть ли какой метод решения.

Хотел залезть, убрать пересчет сумм, вместо него вставить сумму из заказа, но запутался, так наворочено все. ППц просто.
1 MAPATNK2
 
naïve
12.11.20
10:31
UP
2 MAPATNK2
 
naïve
12.11.20
10:33
Убрал пересчет сумм, поставил заполнение на основании заказа. Вот только проблема появилась. Если делать заказ с 2 одинаковыми позициями и, например, разными ценами или размещением, то в сумму реализации попадет сумма не 1 позиции, а двух. Видимо идет свертка тупо по номенклатур с суммой цен. ППц.
3 MAPATNK2
 
naïve
12.11.20
10:35
Как я понял, если хочешь, чтобы все было красиво, нужно стандартный запрос переделывать. Не силен я в запросах конечно, беда.
Может какие то стандартные решения есть, методы? Механизм типовой, значит проблема с ручными скидками и пересчетом сумм есть у всех. Кто как решал?
4 Черников
 
12.11.20
14:29
Лучше не трогай!   Кто только не пытался это переделать, но сделать лучше не удалось! По мне так, проблема с округлениями не разрешима.
5 MAPATNK2
 
naïve
12.11.20
14:39
(4) XD. Да, вот сижу и думаю о том же.
6 Михаил Козлов
 
13.11.20
10:10
В КА 2.4 коллега пилил.
7 MAPATNK2
 
naïve
14.11.20
22:31
(6) и как?
8 Михаил Козлов
 
14.11.20
22:42
Завтра спрошу.
9 MAPATNK2
 
naïve
14.11.20
22:48
(8) спасибо
10 Михаил Козлов
 
15.11.20
12:30
Вот нашел в расширении, вызывается в событии формы ПередЗаписьюПосле.
Процедура НайтиИИсправитьРасхожденияСумм()
    КэшированныеЗначения =неопределено;
    Запрос =Новый Запрос;
    Запрос.Текст ="ВЫБРАТЬ
            |    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
            |    ЗаказКлиентаТовары.СуммаСНДС КАК СуммаСНДС,
            |    ЗаказКлиентаТовары.Количество КАК Количество
            |ПОМЕСТИТЬ ЗК
            |ИЗ
            |    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
            |ГДЕ
            |    ЗаказКлиентаТовары.Ссылка = &Заказ
            |    И ЗаказКлиентаТовары.Отменено = ЛОЖЬ
            |    И ЗаказКлиентаТовары.ВариантОбеспечения = ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.Отгрузить)
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            |    РН.Номенклатура КАК Номенклатура,
            |    РН.СуммаСНДС КАК СуммаСНДС,
            |    РН.Количество КАК Количество
            |ПОМЕСТИТЬ РН
            |ИЗ
            |    &РН КАК РН
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            |    ЗК.Номенклатура КАК Номенклатура,
            |    ЗК.Количество КАК КоличествоЗаказа,
            |    ЗК.СуммаСНДС КАК СуммаЗаказа,
            |    ЕСТЬNULL(РН.Количество, 0) КАК КоличествоРеализации,
            |    ЕСТЬNULL(РН.СуммаСНДС, 0) КАК СуммаРеализации,
            |    ЕСТЬNULL(РН.СуммаСНДС, 0) -ЗК.СуммаСНДС КАК Разница
            |ИЗ
            |    ЗК КАК ЗК
            |        ЛЕВОЕ СОЕДИНЕНИЕ РН КАК РН
            |        ПО ЗК.Номенклатура = РН.Номенклатура И ЗК.Количество = РН.Количество";
    Запрос.УстановитьПараметр("Заказ", Объект.ЗаказКлиента);
    Запрос.УстановитьПараметр("РН", Объект.Товары.Выгрузить());
    ТЗ =Запрос.Выполнить().Выгрузить();
    Для каждого стр из ТЗ Цикл
        Если стр.Разница<>0 Тогда
             СП =Новый Структура;
             СП.Вставить("Номенклатура", стр.Номенклатура);
             СП.Вставить("Количество", стр.КоличествоЗаказа);
             мс =Объект.Товары.НайтиСтроки(СП);
             Для каждого эл из мс Цикл
                 эл.СуммаРучнойСкидки = эл.СуммаРучнойСкидки+стр.Разница;
                
                СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект);
                
                СтруктураДействий = Новый Структура;
                СтруктураДействий.Вставить("ПересчитатьПроцентРучнойСкидки");
                СтруктураДействий.Вставить("ПересчитатьСумму");
                СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать, ПересчитыватьСуммуРучнойСкидки", Ложь, Ложь));
                СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Ложь));
                СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
                СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
                СтруктураДействий.Вставить("ОчиститьСуммуВзаиморасчетов");
                СтруктураДействий.Вставить("ЗаполнитьДубликатыЗависимыхРеквизитов", ЗависимыеРеквизиты());
                СтруктураДействий.Вставить("ПересчитатьСуммуСверхЗаказа", Новый Структура("РеализацияПоступлениеПоЗаказу, ТребуетсяЗалогЗаТару",
                    Объект.РеализацияПоЗаказам, Объект.ТребуетсяЗалогЗаТару));
                
                ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(эл, СтруктураДействий, КэшированныеЗначения);
                ПродажиКлиентСервер.РассчитатьИтоговыеПоказателиРеализации(ЭтаФорма);
                
             КонецЦикла;
            
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Не знаю, подойдет ли.