Столкнулся со следующей ситуацией: при использовании УТ11 для розничных продаж потребовалось отразить информацию о скидках по акциям покупателю в чеке, но штатный функционал к сожалению весьма беден и ограничен, а шаблоны (как в РТ2) отсуствуют. Поиск ничего подходящего не дал (были варианты решения через нефискальный документ), пришлось мастерить костыль:
К фискальным строкам добавляются нефискальные строки с детализацией по примененным акциям + общий итог. В расшифровке используются названия акции, как задано в справочнике скидок и сумма скидки.
В модуле МенеджерОборудованияВызовСервераПереопределяемый подменить или добавить в Функцию "ПолучитьСтруктуруШаблонаЧека"
ОбщиеПараметры = ПараметрыШаблонаЧека[0];
строкМассива = ОбщиеПараметры.ПозицииЧека.Количество()-1;
ИндексМассива=0; КлючТовара=0;
Пока ИндексМассива<=строкМассива Цикл
ТекущаяПозиция = ОбщиеПараметры.ПозицииЧека[ИндексМассива];
Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
Если не ТекущаяПозиция.Цена=ТекущаяПозиция.ЦенаСоСкидками Тогда
cтрукОтбора = Новый Структура("КлючСвязи",КлючТовара+1);
тчСкидки = ОбщиеПараметры.ДокументОснование.СкидкиНаценки.Выгрузить(cтрукОтбора, "СкидкаНаценка,Сумма");
Для Каждого стрСК из тчСкидки Цикл
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст");
струкСкидки.Текст = СтрШаблон("По акции <<%1>> скидка: %2",СокрЛП(стрСК.СкидкаНаценка),Формат(стрСК.Сумма,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
ИндексМассива = ИндексМассива+1; строкМассива = строкМассива+1;
ОбщиеПараметры.ПозицииЧека.Вставить(ИндексМассива,струкСкидки);
КонецЦикла;
КонецЕсли;
КонецЕсли;
ИндексМассива=ИндексМассива+1; КлючТовара=КлючТовара+1;
КонецЦикла;
Возврат Неопределено;
и сделать вызов функции (можно из модуля МенеджерОборудованияКлиентПереопределяемый)
&ИзменениеИКонтроль("СформироватьШаблонЧека")
Функция Il_СформироватьШаблонЧека(ОбщиеПараметры, ДополнительныйТекст, СтандартнаяОбработка, ТипОборудования)
#Вставка
//\\под версии ут11.4.7.хх-ут11.4.12.хх
строкМассива = ОбщиеПараметры.ПозицииЧека.Количество()-1;
ИндексМассива=0; КлючТовара=0;
СуммаЧека = 0; СуммаЧекаБезСкидки = 0;
Если ОбщиеПараметры.ДокументОснование.Метаданные().ТабличныеЧасти.Найти("СкидкиНаценки")=Неопределено Тогда Возврат Неопределено КонецЕсли;
Пока ИндексМассива<=строкМассива Цикл
ТекущаяПозиция = ОбщиеПараметры.ПозицииЧека[ИндексМассива];
Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма;
СуммаЧекаБезСкидки = СуммаЧекаБезСкидки + ТекущаяПозиция.Цена*ТекущаяПозиция.Количество;
Если не ТекущаяПозиция.Цена=ТекущаяПозиция.ЦенаСоСкидками Тогда
cтрукОтбора = Новый Структура("КлючСвязи",КлючТовара+1);
тчСкидки = ОбщиеПараметры.ДокументОснование.СкидкиНаценки.Выгрузить(cтрукОтбора, "СкидкаНаценка,Сумма");
//сначала выведем автоматические скидки по товару
Для Каждого стрСК из тчСкидки Цикл
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст");
струкСкидки.Текст = СтрШаблон("По акции <<%1>> скидка: %2",СокрЛП(стрСК.СкидкаНаценка),Формат(стрСК.Сумма,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
ИндексМассива = ИндексМассива+1;
ОбщиеПараметры.ПозицииЧека.Вставить(ИндексМассива,струкСкидки);
строкМассива = строкМассива+1;
КонецЦикла;
//далее выведем ручные скидки //tdkintel\\
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст");
струкСкидки.Текст = "Сумма без скидки: "+Формат(ТекущаяПозиция.Цена*ТекущаяПозиция.Количество,"ЧЦ=15;ЧДЦ=2;ЧРД=,");
ИндексМассива = ИндексМассива+1;
ОбщиеПараметры.ПозицииЧека.Вставить(ИндексМассива,струкСкидки);
строкМассива = строкМассива+1;
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст");
ПроцентСкидки = Окр((1-ТекущаяПозиция.ЦенаСоСкидками/ТекущаяПозиция.Цена)*100,0);
струкСкидки.Текст = "Скидка "+ПроцентСкидки+"%: "+Формат(ТекущаяПозиция.Цена-ТекущаяПозиция.ЦенаСоСкидками,"ЧЦ=15;ЧДЦ=2;ЧРД=,");
ИндексМассива = ИндексМассива+1;
ОбщиеПараметры.ПозицииЧека.Вставить(ИндексМассива,струкСкидки);
строкМассива = строкМассива+1;
КонецЕсли;
КонецЕсли;
ИндексМассива=ИндексМассива+1;
КлючТовара=КлючТовара+1;
КонецЦикла;
Если не СуммаЧека=СуммаЧекаБезСкидки Тогда
текстИтог = "-------------------";
текстИтог = текстИтог + Символы.ПС + СтрШаблон("ИТОГО: %1",Формат(СуммаЧекаБезСкидки,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
текстИтог = текстИтог + Символы.ПС + СтрШаблон("ИТОГО скидка: %1",Формат(СуммаЧекаБезСкидки-СуммаЧека,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст,Выравнивание");
струкСкидки.Текст = текстИтог;
струкСкидки.Выравнивание = "Право";
ОбщиеПараметры.ПозицииЧека.Добавить(струкСкидки);
КонецЕсли;
Возврат Неопределено;
#КонецВставки
КонецФункции
В модуле МенеджерОборудованияВызовСервераПереопределяемый подменить или добавить в Функцию "ПолучитьСтруктуруШаблонаЧека"
ОбщиеПараметры = ПараметрыШаблонаЧека[0];
строкМассива = ОбщиеПараметры.ПозицииЧека.Количество()-1;
ИндексМассива=0; КлючТовара=0;
Пока ИндексМассива<=строкМассива Цикл
ТекущаяПозиция = ОбщиеПараметры.ПозицииЧека[ИндексМассива];
Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
Если не ТекущаяПозиция.Цена=ТекущаяПозиция.ЦенаСоСкидками Тогда
cтрукОтбора = Новый Структура("КлючСвязи",КлючТовара+1);
тчСкидки = ОбщиеПараметры.ДокументОснование.СкидкиНаценки.Выгрузить(cтрукОтбора, "СкидкаНаценка,Сумма");
Для Каждого стрСК из тчСкидки Цикл
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст");
струкСкидки.Текст = СтрШаблон("По акции <<%1>> скидка: %2",СокрЛП(стрСК.СкидкаНаценка),Формат(стрСК.Сумма,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
ИндексМассива = ИндексМассива+1; строкМассива = строкМассива+1;
ОбщиеПараметры.ПозицииЧека.Вставить(ИндексМассива,струкСкидки);
КонецЦикла;
КонецЕсли;
КонецЕсли;
ИндексМассива=ИндексМассива+1; КлючТовара=КлючТовара+1;
КонецЦикла;
Возврат Неопределено;
и сделать вызов функции (можно из модуля МенеджерОборудованияКлиентПереопределяемый)
В модуле МенеджерОборудованияВызовСервераПереопределяемый подменить или расширить Функцию "СформироватьШаблонЧека"
&ИзменениеИКонтроль("СформироватьШаблонЧека")
Функция Il_СформироватьШаблонЧека(ОбщиеПараметры, ДополнительныйТекст, СтандартнаяОбработка, ТипОборудования)
#Вставка
//\\под версии ут11.4.7.хх-ут11.4.12.хх
строкМассива = ОбщиеПараметры.ПозицииЧека.Количество()-1;
ИндексМассива=0; КлючТовара=0;
СуммаЧека = 0; СуммаЧекаБезСкидки = 0;
Если ОбщиеПараметры.ДокументОснование.Метаданные().ТабличныеЧасти.Найти("СкидкиНаценки")=Неопределено Тогда Возврат Неопределено КонецЕсли;
Пока ИндексМассива<=строкМассива Цикл
ТекущаяПозиция = ОбщиеПараметры.ПозицииЧека[ИндексМассива];
Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма;
СуммаЧекаБезСкидки = СуммаЧекаБезСкидки + ТекущаяПозиция.Цена*ТекущаяПозиция.Количество;
Если не ТекущаяПозиция.Цена=ТекущаяПозиция.ЦенаСоСкидками Тогда
cтрукОтбора = Новый Структура("КлючСвязи",КлючТовара+1);
тчСкидки = ОбщиеПараметры.ДокументОснование.СкидкиНаценки.Выгрузить(cтрукОтбора, "СкидкаНаценка,Сумма");
//сначала выведем автоматические скидки по товару
Для Каждого стрСК из тчСкидки Цикл
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст");
струкСкидки.Текст = СтрШаблон("По акции <<%1>> скидка: %2",СокрЛП(стрСК.СкидкаНаценка),Формат(стрСК.Сумма,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
ИндексМассива = ИндексМассива+1;
ОбщиеПараметры.ПозицииЧека.Вставить(ИндексМассива,струкСкидки);
строкМассива = строкМассива+1;
КонецЦикла;
//далее выведем ручные скидки //tdkintel\\
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст");
струкСкидки.Текст = "Сумма без скидки: "+Формат(ТекущаяПозиция.Цена*ТекущаяПозиция.Количество,"ЧЦ=15;ЧДЦ=2;ЧРД=,");
ИндексМассива = ИндексМассива+1;
ОбщиеПараметры.ПозицииЧека.Вставить(ИндексМассива,струкСкидки);
строкМассива = строкМассива+1;
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст");
ПроцентСкидки = Окр((1-ТекущаяПозиция.ЦенаСоСкидками/ТекущаяПозиция.Цена)*100,0);
струкСкидки.Текст = "Скидка "+ПроцентСкидки+"%: "+Формат(ТекущаяПозиция.Цена-ТекущаяПозиция.ЦенаСоСкидками,"ЧЦ=15;ЧДЦ=2;ЧРД=,");
ИндексМассива = ИндексМассива+1;
ОбщиеПараметры.ПозицииЧека.Вставить(ИндексМассива,струкСкидки);
строкМассива = строкМассива+1;
КонецЕсли;
КонецЕсли;
ИндексМассива=ИндексМассива+1;
КлючТовара=КлючТовара+1;
КонецЦикла;
оплаченоБонусом = ?(ПолучитьФункциональнуюОпцию("ИспользоватьБонусныеПрограммыЛояльности"),ОбщиеПараметры.ДокументОснование.Товары.Итог("СуммаБонусныхБалловКСписаниюВВалюте"),0);
Если не СуммаЧека=СуммаЧекаБезСкидки или оплаченоБонусом>0 Тогда
текстИтог = "-------------------";
текстИтог = текстИтог + Символы.ПС + СтрШаблон("ИТОГО: %1",Формат(СуммаЧекаБезСкидки,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
Если СуммаЧекаБезСкидки-СуммаЧека-оплаченоБонусом>0 Тогда
текстИтог = текстИтог + Символы.ПС + СтрШаблон("ИТОГО скидка: %1",Формат(СуммаЧекаБезСкидки-СуммаЧека-оплаченоБонусом,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
КонецЕсли;
Если ОбщиеПараметры.ДокументОснование.ИспользоватьОплатуБонуснымиБаллами И оплаченоБонусом>0 Тогда
текстИтог = текстИтог + Символы.ПС + СтрШаблон("ОПЛАЧЕНО бонусами: %1",Формат(оплаченоБонусом,"ЧЦ=15;ЧДЦ=2;ЧРД=."));
КонецЕсли;
струкСкидки = Новый Структура("ТекстоваяСтрока,Текст,Выравнивание","",текстИтог,"Право");
ОбщиеПараметры.ПозицииЧека.Добавить(струкСкидки);
КонецЕсли;
Возврат Неопределено;
#КонецВставки
КонецФункции
Для удобства реализовано в виде расширения. Код открыт. Найдете ошибку - сообщите.
upd.20.05.19 - исправлена ошибка (комент#2)
upd.06.08.20 - изменение под версии 11.4.7 и выше (комент#7)
upd.14.05.21 - дополнение для скидки бонусом под версии 11.4.7 и выше (комент#23) - результат ниже