Переход на конфигурацию 1С:Управление торговлей 11 (УТ 11) часто вызывает трудности у компаний, привыкших к гибкому «ручному» ценообразованию из версии 10.3. В новой архитектуре разработчики сделали упор на автоматизацию маркетинга, обязательную сегментацию клиентов и использование типовых или индивидуальных соглашений.
В реальном бизнесе часто возникает задача: у компании есть около 1000 постоянных клиентов и 1000 позиций номенклатуры. Цены динамически зависят от курса валют, а для каждого контрагента согласована индивидуальная матрица скидок и наценок на конкретные товары (в диапазоне от -20% до +20% с шагом до сотых долей процента). Попытка настроить такую схему штатными маркетинговыми скидками УТ 11 приводит к созданию огромного количества сегментов клиентов и миллионов элементов справочника скидок. Это делает базу данных практически неработоспособной, а расчет скидок в документе Заказ клиента начинает занимать недопустимо много времени.
В этой статье мы подробно разберем, как решить проблему индивидуального динамического ценообразования в УТ 11, используя как стандартный функционал программы, так и легкую кастомизацию через механизм расширений.
Прежде чем перейти к решениям, выясним причину проблемы. В УТ 11 автоматические скидки по умолчанию рассчитываются по сложным алгоритмам (совместное применение, вытеснение, максимизация). Система ориентирована на то, что скидка дается группе клиентов (сегменту) на группу товаров (сегмент номенклатуры).
Если мы попытаемся создать автоматическую скидку для Клиента А на Товар Б, затем для Клиента А на Товар В, и так для всех 1000 контрагентов и 1000 товаров, мы получим до 1 000 000 правил расчета. При проведении любого документа продажи система будет вынуждена перебирать всю эту гигантскую матрицу, что приведет к зависанию программы.
Рассмотрим альтернативные и гораздо более эффективные архитектурные решения.
Если товары в вашей базе можно хотя бы минимально систематизировать, лучшим выходом будет использование механизма Ценовых групп совместно с Индивидуальными соглашениями. Этот вариант позволяет обойтись без создания сотен скидок и сегментов клиентов.
Проанализируем этот подход по шагам:
Индивидуальное соглашение.При таком подходе при подборе любого товара в документ система мгновенно определит его ценовую группу и применит процент скидки, указанный в соглашении данного клиента. Количество правил сократится в тысячи раз, а скорость работы базы останется на высоте.
Если цены в вашей компании постоянно меняются из-за курса валют или других внешних факторов, использование жестко зафиксированных цен в соглашениях не подойдет. Но в УТ 11 предусмотрен механизм динамического расчета цен.
Рассмотрим, как настроить расчетные виды цен:
[Базовая USD] * 0.95)[Базовая USD] * 0.90)[Базовая USD] * 1.05)Индивидуальном соглашении с клиентом на вкладке Уточнение цен по товарам укажем для конкретной номенклатуры не статичную цену в рублях, а соответствующий расчетный вид цены.При изменении базовой цены (например, при росте курса валюты) все расчетные цены автоматически пересчитаются. При этом у клиента в документе подставится актуальная цена с учетом его персонального процента скидки.
Если специфика вашего бизнеса категорически требует ведения жесткой матрицы персональных скидок «Клиент — Товар — Процент» без каких-либо группировок, то типовой функционал УТ 11 будет неудобен менеджерам. В этом случае лучшим выходом является создание простого расширения конфигурации. Это позволит сохранить базу полностью типовой и обновляемой, но решит задачу максимально быстро и удобно.
Рассмотрим алгоритм реализации такого расширения:
ПерсональныеСкидкиКлиентов.
Партнер (тип СправочникСсылка.Партнеры), Номенклатура (тип СправочникСсылка.Номенклатура).ПроцентСкидки (тип Число, длина 5, точность 2).&После или &Вместо) внедрим код в процедуру расчета скидок в документах продажи.Посмотрим на пример программного кода, который можно использовать в расширении для перехвата и заполнения скидок в документе ЗаказКлиента:
&Вместо("РассчитатьСкидкиТабличнойЧасти")
Процедура Расшир_РассчитатьСкидкиТабличнойЧасти(ДокументОбъект, ИмяТабличнойЧасти)
// Получаем партнерскую ссылку из документа
ТекущийПартнер = ДокументОбъект.Партнер;
Если Не ЗначениеЗаполнено(ТекущийПартнер) Тогда
Возврат;
КонецЕсли;
// Обходим строки табличной части (например, "Товары")
Для Каждого СтрокаТовара Из ДокументОбъект[ИмяТабличнойЧасти] Цикл
// Запрашиваем процент скидки из нашего регистра сведений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПерсональныеСкидки.ПроцентСкидки КАК ПроцентСкидки
|ИЗ
| РегистрСведений.ПерсональныеСкидкиКлиентов КАК ПерсональныеСкидки
|ГДЕ
| ПерсональныеСкидки.Партнер = &Партнер
| И ПерсональныеСкидки.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Партнер", ТекущийПартнер);
Запрос.УстановитьПараметр("Номенклатура", СтрокаТовара.Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
// Устанавливаем процент ручной или автоматической скидки в строку документа
СтрокаТовара.ПроцентРучнойСкидки = Выборка.ПроцентСкидки;
// Принудительно пересчитываем сумму с учетом скидки
ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуНДСРеализации(СтрокаТовара);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Преимущества решения с расширением:
Выбор метода зависит от готовности вашей компании к небольшим доработкам системы:
Ценовым группам в сочетании с Индивидуальными соглашениями. Это наиболее красивое методическое решение.Виды цен и указывайте их в соглашениях.