Шаблон кода Внешней обработки Расчет Скидки Наценки
Теги: 1С,ВнешняяОбработка,БСП,РасчетСкидкиНаценки

Шаблон кода внешней обработки Вида Перечисления.ВидыДополнительныхОтчетовИОбработок.РасчетСкидкиНаценки

# Код реализации

```1c
////////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС

// Возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт

	Наименование = НСтр("ru = 'Процент/сумма по ... '");
	Информация = НСтр("ru = 'Предоставляется скидка (наценка) процентом (суммой), зависит от ... .'");
	Назначение = Новый Массив;

	ПараметрыРегистрации = Новый Структура;

	ПараметрыРегистрации.Вставить("Вид", Перечисления.ВидыДополнительныхОтчетовИОбработок.РасчетСкидкиНаценки);
	ПараметрыРегистрации.Вставить("Версия", "1.01.001");
	ПараметрыРегистрации.Вставить("Назначение", Назначение);
	ПараметрыРегистрации.Вставить("Наименование", Наименование);
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
	ПараметрыРегистрации.Вставить("Информация", Информация);
	ПараметрыРегистрации.Вставить("ВерсияБСП", "2.1.2.1");

	ПараметрыРегистрации.Вставить("Команды", Новый ТаблицаЗначений);

	Возврат ПараметрыРегистрации;

КонецФункции

// Возвращает способ применения скидки (наценки)
//
// Возвращаемое значение:
//	Перечисления.СпособыПримененияСкидокНаценок - способ применения скидки (наценки)
//
Функция СпособПрименения() Экспорт

	Возврат Перечисления.СпособыПримененияСкидокНаценок.ПрименитьВМоментРасчетаСкидокНаценок;

КонецФункции

// Выполняет расчет скидки (наценки)
//
// Параметры:
//	СкидкаНаценка - Строка дерева скидок (наценок). Включает результаты проверки условий, способы совместного применения
//	Настройки - Структура - Настройки, заданные пользователем в форме настроек внешней обработки
//	Товары - Коллекция товаров, для которых требуется применить скидку (наценку)
//	ПараметрыРасчета - Структура - Параметры расчета скидок (наценок)
//
// Возвращаемое значение:
//	РезультатРасчета - ТаблицаЗначений - результат расчета
//
Функция Рассчитать(СкидкаНаценка, Настройки, Товары, ПараметрыРасчета) Экспорт

	ИмяРеквизитаУсловия = "";

	РезультатРасчета = СкидкиНаценкиСервер.ПустаяТаблицаСкидокСРасшифровкой();
	//Если своя {
	//РезультатРасчета = ПустаяТаблицаСкидокСРасшифровкой();
	//Если своя }

	Если ПараметрыРасчета.Объект.Ссылка.Пустая() Тогда
		Возврат РезультатРасчета;
	КонецЕсли;

	ЭтоУмножение = СкидкаНаценка.ПрименятьУмножениеВРамкахВышестоящейГруппы;

	// { Поиск строк с нужным условием
	СтрокаТЧ = Настройки.Таблица.Найти(ПараметрыРасчета.Объект[ИмяРеквизитаУсловия], "КолонкаУсловие");
	// } Поиск строк с нужным условием
	Если СтрокаТЧ <> Неопределено Тогда

		Для Каждого Товар Из Товары Цикл

			Если СтрокаТЧ.СпособПредоставленияСкидки = Перечисления.СпособыПредоставленияСкидокНаценок.Процент Тогда
				СуммаСкидки = СтрокаТЧ.Значение / 100 * СкидкиНаценкиСервер1.ОстатокСуммыПоСтроке(СкидкаНаценка, Товар, ПараметрыРасчета, ЭтоУмножение);
				СкидкиНаценкиСервер.ПрименитьЗначениеСкидкиКТовару(СкидкаНаценка, СуммаСкидки, Товар, РезультатРасчета, ПараметрыРасчета);
			Иначе
				ДатаЦены = ?(ЗначениеЗаполнено(ПараметрыРасчета.Объект.ДатаСогласования), ПараметрыРасчета.Объект.ДатаСогласования, ПараметрыРасчета.Объект.Дата);
				СуммаСкидки = СтрокаТЧ.Значение * РаботаСКурсамиВалют.ПолучитьКурсВалюты(ПараметрыРасчета.Объект.Соглашение.ВидЦен.ВалютаЦены, ДатаЦены).Курс;
				СкидкиНаценкиСервер.ПрименитьЗначениеСкидкиКТовару(СкидкаНаценка, СуммаСкидки, Товар, РезультатРасчета, ПараметрыРасчета);
			КонецЕсли;

		КонецЦикла;

	КонецЕсли;

	Возврат РезультатРасчета;

КонецФункции

// Возвращает имя формы внешней обработки,
// предназначенной для настройки условия предоставления
//
// Возвращаемое значение:
//	Строка - Имя формы
//
Функция ИмяФормыНастроек() Экспорт

	Возврат "Настройки";

КонецФункции

// Возвращает расширенное описание условия предоставления с учетом настроек
//
// Параметры:
//	Настройки - Структура - Значения настроек условия предоставления
//
// Возвращаемое значение:
//	Строка - Расширенное описание
//
Функция ОписаниеДействия(Настройки) Экспорт

	Попытка
		Если Настройки<> Неопределено И Настройки.Таблица.Количество() > 0 Тогда
			Описание = "Предоставляется скидка (наценка) процентом (суммой), зависит от ... :";
			Для Каждого СтрокаТЧ Из Настройки.Таблица Цикл
				Описание = Описание + Символы.ПС + "По условию " + " """ + СтрокаТЧ.КолонкаУсловие + """: " + СтрокаТЧ.Значение
				+ ?(СтрокаТЧ.СпособПредоставленияСкидки = Перечисления.СпособыПредоставленияСкидокНаценок.Процент, "%", "€");
			КонецЦикла;
		Иначе
			Описание = "Не заданы настройки скидки (наценки)";
		КонецЕсли;
	Исключение
		Описание = "Настройки не загружены.
		           |При загрузке настроек скидки (наценки) произошла ошибка:
		           |" + ОписаниеОшибки();
	КонецПопытки;

	Возврат Описание;

КонецФункции

// Возвращает заголовок условия предоставления с учетом настроек
//
// Параметры:
//	Настройки - Структура - Значения настроек условия предоставления
//
// Возвращаемое значение:
//	Строка - Наименование условия
//
Функция Автонаименование(Настройки) Экспорт

	Возврат НСтр("ru = 'Процент/сумма по ... '");

КонецФункции

Функция ПустаяТаблицаСкидокСРасшифровкой(ПараметрыРасчета = Неопределено) Экспорт

	Если ПараметрыРасчета = Неопределено Тогда
		Таблица = Новый ТаблицаЗначений;
		Таблица.Колонки.Добавить("КлючСвязи",   Новый ОписаниеТипов("Число"));
		Таблица.Колонки.Добавить("Расшифровка", Новый ОписаниеТипов("ТаблицаЗначений"));
		Таблица.Колонки.Добавить("Сумма",       Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(15,2)));
		Таблица.Колонки.Добавить("Действует",   Новый ОписаниеТипов("Булево"));
		Возврат Таблица;
	Иначе
		Возврат ПараметрыРасчета.ПустаяТаблицаСкидокСРасшифровкой.СкопироватьКолонки();
	КонецЕсли;

КонецФункции
```