В типовых конфигурациях линейки 1С:ERP, Комплексная автоматизация и Управление торговлей 11 (начиная с релиза 11.2) предусмотрен встроенный механизм подключения пользовательских алгоритмов расчета скидок и проверки условий без изменения конфигурации. Разберем, как устроена архитектура этого механизма, какую структуру должна иметь внешняя обработка и как применять алгоритмы как для розничных, так и для оптовых продаж.
Механизм автоматических скидок интегрирован со стандартной подсистемой БСП ДополнительныеОтчетыИОбработки. Для реализации нестандартных алгоритмов предусмотрено два специализированных вида внешних обработок:
При добавлении такой обработки в справочник Дополнительные отчеты и обработки система регистрирует ее, после чего в справочниках Скидки (наценки) или Условия предоставления скидок (наценок) становится доступен выбор нового типа скидки или условия, работающего на базе созданной обработки.
Рассмотрим программный интерфейс, который необходимо объявить в модуле объекта внешней обработки для расчета скидки.
1. Функция регистрации в БСП СведенияОВнешнейОбработке() должна возвращать вид обработки РасчетСкидкиНаценки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.РасчетСкидкиНаценки;
ПараметрыРегистрации.Наименование = "Расчет индивидуальной скидки";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Истина;
ПараметрыРегистрации.Информация = "Пример внешней обработки расчета скидки";
Возврат ПараметрыРегистрации;
КонецФункции
2. Определение момента применения скидки в функции СпособПрименения():
Функция СпособПрименения() Экспорт
Возврат Перечисления.СпособыПримененияСкидокНаценок.ПрименитьВМоментРасчетаСкидокНаценок;
КонецФункции
3. Основная процедура расчета Рассчитать():
Функция Рассчитать(СкидкаНаценка, Настройки, Товары, ПараметрыРасчета) Экспорт
// Таблица "Товары" содержит строки документа продажи
// Создаем результирующую таблицу скидок на основе переданных строк
ТаблицаСкидок = СкидкиНаценкиСервер.СоздатьТаблицуСкидок();
Для Каждого СтрокаТовара Из Товары Цикл
НоваяСтрока = ТаблицаСкидок.Добавить();
НоваяСтрока.КлючСтроки = СтрокаТовара.КлючСтроки;
НоваяСтрока.СкидкаНаценка = СкидкаНаценка;
// Пример простого расчета: 5% от суммы строки
НоваяСтрока.Сумма = Окр(СтрокаТовара.Сумма * 0.05, 2);
КонецЦикла;
Возврат ТаблицаСкидок;
КонецФункции
Если требуется разработать нестандартное условие (например, проверка суммарного объема закупок клиента за прошлый квартал), используется вид обработки ПроверкаУсловияПредоставленияСкидкиНаценки.
В модуле объекта реализуется экспортная функция ПроверитьУсловие():
Функция ПроверитьУсловие(УсловиеПредоставления, Настройки, ПараметрыРасчета, Товары) Экспорт
// Проверяем произвольное условие над строками документа или параметрами партнера
УсловиеВыполнено = Ложь;
Если Товары.Итог("Сумма") > 50000 Тогда
УсловиеВыполнено = Истина;
КонецЕсли;
Возврат УсловиеВыполнено;
КонецФункции
Если алгоритм скидки требует гибких параметров (например, процент скидки или пороговые значения, задаваемые пользователем), внутри внешней обработки создается форма настройки. Значения параметров сериализуются и сохраняются в типовом реквизите Настройки (тип ХранилищеЗначения) соответствующего элемента справочника Скидки (наценки). При расчете эти настройки передаются во входной параметр Настройки функции Рассчитать().
Существует заблуждение, что механизм внешних скидок работает исключительно в рознице. В конфигурации 1С:УТ 11.2 ядро подсистемы автоматических скидок универсально:
Чек ККМ, Отчет о розничных продажах), так и оптовые (Заказ клиента, Реализация товаров и услуг, Коммерческое предложение).Таким образом, написанная внешняя скидка будет корректно пересчитываться в оптовых заказах и реализациях при нажатии кнопки Рассчитать скидки или при проведении документа.
Рассчитать() должны быть максимально оптимизированы во избежание замедления работы пользователей.