Скидка по продуктам в счете игнорируется при создании расходной накладной

Здравствуйте!

Столкнулся с такой незадачей.

При создании по счету складского документа, продукты из счета переходят в продукты складского документа с ценой без учета скидки в счете.

Продукт "Вода питьевая негаз. 19 л" имеет прайс под названием "Клиентский" с ценой на продукт 100 руб.

Контрагенту создан персональный прайс по этому продукту на основе "Клиентского" прайса с дополнительной скидкой 20%.

При создании счета для этого клиента по этому продукту, мы видим, что продукт попадает в счет с учетом скидки 20% с итоговой суммой 80 руб.

Итоговая сумма счета также учитывает скидку 20% и равна 80 руб.

Однако, когда мы создаем по счету складской документ, то в него продукт из счета попадает с ценой не 80 руб, а с ценой 100 руб, т.е. скидка из продукта в счете игнорируется.

Сумма всей расходной накладной также равна 100 руб.

Как бы исхитриться, чтобы продукты в расходную накладную попадали из счета с учетом скидки?

Оно конечно можно, руками исправить цену в складском документе, но поскольку доставка воды на дом - это "частые" продажи, то это придется делать слишком часто..

Я полез в код, генерирующий складской документ по счету (CreateBillPayment), но, как я понял, непосредственно копированием продуктов счета в продукты складского документа занимается процедура EnableDatasetFields, вызываемая из процедуры HaveOfferingsInInvoice.
Но изменить процедуру EnableDatasetFields так, чтобы она решила мою задачу и не нарушила функционирование остальной программы, я не не смог. Да и боязно курочить процедуры из скрипта scr_DB.

Подскажите, как лучше и с меньшей кровью решить мою проблему?

P.S. Terrasoft XRM Distribution 3.3.2.173

Нравится

2 комментария

Здравствуйте Егор!
Спасибо за подробное описание задачи.

"Егор Николаевич" написал:Однако, когда мы создаем по счету складской документ, то в него продукт из счета попадает с ценой не 80 руб, а с ценой 100 руб, т.е. скидка из продукта в счете игнорируется.

В коробочной версии логика отрабатывает, так как Вы описали, при добавлении продукта в Складской документ нет привязки к счету (данное поле не является обязательным для заполнения), или какому либо клиенту, как следствие в складской расходной накладной мы получаем сумму без учета скидки на клиента.

Я предлагаю следующий вариант решения. Доработаем карточку продукта в Складском документе (wnd_OfferingInMovementEdit). Сделаем привязку к полю Счет
1
Для реализации логики, необходимо внести изменения в скрипт wnd_OfferingInMovementEditScript , а именно в функцию UpdateValuesByOfferingID.
Изменения внесены между комментариев "//26.03.2012" .

function UpdateValuesByOfferingID(Dataset) {
 
	var OfferingID = Dataset('OfferingID');
	Dataset('UnitName') = GetOfferingFieldValue(OfferingID, 'DefaultUnit'); 
	var Quantity = Dataset.ValAsFloat('Quantity');
	if (!Quantity) {
		Dataset('Quantity') = GetOfferingFieldValue(OfferingID, 'UnitDivision');
	}
	var OfferingMovementTypeID = Self.Attributes('TypeID');	
	//26.03.2012
 
		if (!IsEmpty(Dataset('InvoiceID'))) {   //проверка заполнено ли поле Счет, если нет не выполняем действия
		var accountID = GetDatasetFieldValueByID('ds_Invoice',Dataset('InvoiceID'),'CustomerID')
		//открываем датасет Счетов, и получаем поле Клиент (это будет идентификатор контрагента)
		var PriceDataset = Services.GetNewItemByUSI('ds_AccountPrice');
		ApplyDatasetFilter(PriceDataset,'AccountID',accountID,true);
		//фильтруем таблицу детали Прайс-Лист контрагентов
		ApplyDatasetFilter(PriceDataset,'OfferingID',OfferingID,true);
		//фильтруем детать Прайс-Лист контрагентов по интересующему нас продукту 
		PriceDataset.Open();
		var discount = PriceDataset('DiscountPercent'); 		//получаем значение скидки
 
		Dataset('BasicPrice') = Dataset('BasicPrice')+ Dataset('BasicPrice') * discount/100 ;
		PriceDataset.Close();
 
		}	
	//26.03.2012
	if (OfferingMovementTypeID == omtReceipt) {
		Dataset('BasicPrice') = GetSupplierOfferingBasicPrice(
			Dataset('OfferingID'),
			Dataset('SupplierID'));
	}
	SetConsignmentID(Dataset);
}

После данных действий общая сумма расходной накладной, будет формироваться с учетом скидки.
Хочу заметить что функция UpdateValuesByOfferingID отрабатывает сразу после выбора продукта в карточке, т.е сначала необходимо будет выбрать счет, после чего сам продукт.

Егор, если у Вас есть какие либо замечания, или пожелания по данному вопросу просьба их озвучить.

Здравствуйте, Алексей!
Алимова Анна подсказала еще одно решение.
Оно оставляет складской документ так же отвязанным от счета, как и в коробочной версии, учет скидки происходит при формировании складского документа по счету.

Изменяется в скрипте scr_InvoiceWorkspace функция CopyOfferingsFromInvoice, создающая складской документ по счету.
В строки, копирующие значения цены и стоимости, добавляется учет скидки:
OfferingInOMDataset('Price') = OfferingDataset('Price') * (1 - OfferingDataset('DiscountPercent')/100);
OfferingInOMDataset('BasicPrice') = OfferingDataset('BasicPrice') * (1 - OfferingDataset('DiscountPercent')/100);
OfferingInOMDataset('Amount') = OfferingDataset('Amount') * (1 - OfferingDataset('DiscountPercent')/100);
OfferingInOMDataset('BasicAmount') = OfferingDataset('BasicAmount') * (1 - OfferingDataset('DiscountPercent')/100);

Оба варианта решают задачу.
Спасибо!

Показать все комментарии