Довольно таки часто используемая операция как продажа товара с оплатой подарочным сертификатом определенной суммы, но удобных решений для ут 10.3 я не нашел. Решил реализовать данную задачу через механиз автоматических скидок.
На примере Заказа покупателя: в модуле объект присутсвует функция
Функция ПересчитатьАвтоматическиеСкидки() Экспорт
Если РассчитыватьАвтоматическиеСкидки() Тогда
СуммаДокументаБезСкидок = Ценообразование.ПолучитьСуммуДокументаБезСкидки(Товары) + Ценообразование.ПолучитьСуммуДокументаБезСкидки(Услуги);
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ВидРеализации" , Перечисления.ВидыСкидок.Оптовая);
СтруктураПараметров.Вставить("СуммаДокумента" , СуммаДокументаБезСкидок);
СтруктураПараметров.Вставить("Карта" , ДисконтнаяКарта);
СтруктураПараметров.Вставить("УчитыватьНДС" , УчитыватьНДС);
СтруктураПараметров.Вставить("СуммаВключаетНДС" , СуммаВключаетНДС);
СтруктураПараметров.Вставить("ВалютаРегламентированногоУчета", мВалютаРегламентированногоУчета);
СтруктураПараметров.Вставить("УчетнаяПолитика" , ПолучитьЗначениеУчетнойПолитики());
ОбработкаТабличныхЧастей.РассчитатьСкидкиПриПродаже(ЭтотОбъект, Товары, СтруктураПараметров, мМинимальныеЦены, мСписокФильтров);
ОбработкаТабличныхЧастей.РассчитатьСкидкиПриПродаже(ЭтотОбъект, Услуги, СтруктураПараметров, мМинимальныеЦены, мСписокФильтров);
//процедура расчета скидки за сертификат
ПересчитатьСкидкуЗаСертификат();
//
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
В неё добавляем вызов процедуры ПересчитатьСкидкуЗаСертификат()
Процедура ПересчитатьСкидкуЗаСертификат()
перем УсловиеСкидки;
УсловиеСкидки = Перечисления.УсловияСкидкиНаценки.СкидкаЗаСертификат;
// ищем сертификат на скидку, и прибавляем его если есть
// сертификат определяется по номенклатуре с типом Бонус
Для каждого Деталь Из СоставНабора Цикл
Если Деталь.Номенклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.Бонус Тогда
// нашли, применяем скидку
СуммаСкидки = Деталь.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент;
СтрокаКСкидке = Товары.Найти(Деталь.КлючСтроки, "КлючСтроки");
РасчетСкидкиПоСумме(СтрокаКСкидке, СуммаСкидки, УсловиеСкидки)
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для определения скидки за сертификат вводим новый вид номенклатуры, называем его Бонус, затем заводим номенклатуру данного вида. Размер скидки опредеяем коэффициентом единицы измерения, я так сделал что бы лишних реквизитов и сумм не использовать. Так же в перечисление УсловияСкидкиНаценки добавляем СкидкаЗаСертификат,
В данной конфигурации я использую Набор-комплекты, поэтому сертификат добавляется в СоставНабора, т.е. если в составе набора присутсвует номеклатура вида Бонус, то к Набору-комплекту применяется скидка, скидка расчитывается в процедуре РасчетСкидкиПоСумме.
Функция РасчетСкидкиПоСумме(СтрокаКСкидке, СуммаСкидки, Условие)
ИсходнаяАвтоСкидка = СтрокаКСкидке.ПроцентАвтоматическихСкидок;
СкидкаРучная = СтрокаКСкидке.ПроцентСкидкиНаценки;
Если СтрокаКСкидке.Сумма > 0 Тогда
ПроцентСкидки = СуммаСкидки / (СтрокаКСкидке.Цена * СтрокаКСкидке.Количество) * 100;
СтрокаКСкидке.ПроцентАвтоматическихСкидок = ИсходнаяАвтоСкидка + ПроцентСкидки;
СтрокаКСкидке.УсловиеАвтоматическойСкидки = Условие;
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаКСкидке, ЭтотОбъект);
КонецЕсли;
КонецФункции
Может кому пригодится идея.