Как настроить индивидуальные скидки для каждого клиента на определенные товары в УТ 11 без создания сотен сегментов?

Бизнес-аналитик 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Переход на конфигурацию 1С:Управление торговлей 11 (УТ 11) часто вызывает трудности у компаний, привыкших к гибкому «ручному» ценообразованию из версии 10.3. В новой архитектуре разработчики сделали упор на автоматизацию маркетинга, обязательную сегментацию клиентов и использование типовых или индивидуальных соглашений.

В реальном бизнесе часто возникает задача: у компании есть около 1000 постоянных клиентов и 1000 позиций номенклатуры. Цены динамически зависят от курса валют, а для каждого контрагента согласована индивидуальная матрица скидок и наценок на конкретные товары (в диапазоне от -20% до +20% с шагом до сотых долей процента). Попытка настроить такую схему штатными маркетинговыми скидками УТ 11 приводит к созданию огромного количества сегментов клиентов и миллионов элементов справочника скидок. Это делает базу данных практически неработоспособной, а расчет скидок в документе Заказ клиента начинает занимать недопустимо много времени.

В этой статье мы подробно разберем, как решить проблему индивидуального динамического ценообразования в УТ 11, используя как стандартный функционал программы, так и легкую кастомизацию через механизм расширений.

Причина сложности: почему классические автоматические скидки не подходят

Прежде чем перейти к решениям, выясним причину проблемы. В УТ 11 автоматические скидки по умолчанию рассчитываются по сложным алгоритмам (совместное применение, вытеснение, максимизация). Система ориентирована на то, что скидка дается группе клиентов (сегменту) на группу товаров (сегмент номенклатуры).

Если мы попытаемся создать автоматическую скидку для Клиента А на Товар Б, затем для Клиента А на Товар В, и так для всех 1000 контрагентов и 1000 товаров, мы получим до 1 000 000 правил расчета. При проведении любого документа продажи система будет вынуждена перебирать всю эту гигантскую матрицу, что приведет к зависанию программы.

Рассмотрим альтернативные и гораздо более эффективные архитектурные решения.

Решение 1. Использование ценовых групп и индивидуальных соглашений (Типовой функционал)

Если товары в вашей базе можно хотя бы минимально систематизировать, лучшим выходом будет использование механизма Ценовых групп совместно с Индивидуальными соглашениями. Этот вариант позволяет обойтись без создания сотен скидок и сегментов клиентов.

Проанализируем этот подход по шагам:

  1. Распределим всю номенклатуру по ценовым группам (например: «Категория А», «Категория Б», «Эксклюзив», «Импорт» и т. д.). Даже если у вас 1000 товаров, количество ценовых групп редко превышает 20–30 позиций.
  2. Для каждого клиента создадим одно Индивидуальное соглашение.
  3. В соглашении на вкладке Уточнение цен по ценовым группам укажем конкретный процент скидки или наценки для каждой группы.

При таком подходе при подборе любого товара в документ система мгновенно определит его ценовую группу и применит процент скидки, указанный в соглашении данного клиента. Количество правил сократится в тысячи раз, а скорость работы базы останется на высоте.

Решение 2. Динамические виды цен в соглашениях (Для динамического прайса)

Если цены в вашей компании постоянно меняются из-за курса валют или других внешних факторов, использование жестко зафиксированных цен в соглашениях не подойдет. Но в УТ 11 предусмотрен механизм динамического расчета цен.

Рассмотрим, как настроить расчетные виды цен:

  1. Создадим базовый вид цены (например, «Базовая USD»), который будет регулярно обновляться в зависимости от курса валют или загружаться от поставщиков.
  2. Создадим несколько расчетных (зависимых) видов цен с фиксированным процентом отклонения. Например:
    • «Дилерская -5%» (формула расчета: [Базовая USD] * 0.95)
    • «Партнерская -10%» (формула расчета: [Базовая USD] * 0.90)
    • «Спеццена +5%» (формула расчета: [Базовая USD] * 1.05)
  3. В Индивидуальном соглашении с клиентом на вкладке Уточнение цен по товарам укажем для конкретной номенклатуры не статичную цену в рублях, а соответствующий расчетный вид цены.

При изменении базовой цены (например, при росте курса валюты) все расчетные цены автоматически пересчитаются. При этом у клиента в документе подставится актуальная цена с учетом его персонального процента скидки.

Решение 3. Использование расширения конфигурации (Рекомендуемый нетиповой метод)

Если специфика вашего бизнеса категорически требует ведения жесткой матрицы персональных скидок «Клиент — Товар — Процент» без каких-либо группировок, то типовой функционал УТ 11 будет неудобен менеджерам. В этом случае лучшим выходом является создание простого расширения конфигурации. Это позволит сохранить базу полностью типовой и обновляемой, но решит задачу максимально быстро и удобно.

Рассмотрим алгоритм реализации такого расширения:

  1. Создадим в расширении новый регистр сведений ПерсональныеСкидкиКлиентов.
    • Измерения: Партнер (тип СправочникСсылка.Партнеры), Номенклатура (тип СправочникСсылка.Номенклатура).
    • Ресурсы: ПроцентСкидки (тип Число, длина 5, точность 2).
  2. Создадим простую обработку для менеджеров, которая позволит загружать эту матрицу цен напрямую из файлов Excel. Это сэкономит сотни часов ручной работы.
  3. С помощью механизма расширений (используя аннотацию &После или &Вместо) внедрим код в процедуру расчета скидок в документах продажи.

Посмотрим на пример программного кода, который можно использовать в расширении для перехвата и заполнения скидок в документе ЗаказКлиента:


&Вместо("РассчитатьСкидкиТабличнойЧасти")
Процедура Расшир_РассчитатьСкидкиТабличнойЧасти(ДокументОбъект, ИмяТабличнойЧасти)
    
    // Получаем партнерскую ссылку из документа
    ТекущийПартнер = ДокументОбъект.Партнер;
    Если Не ЗначениеЗаполнено(ТекущийПартнер) Тогда
        Возврат;
    КонецЕсли;
    
    // Обходим строки табличной части (например, "Товары")
    Для Каждого СтрокаТовара Из ДокументОбъект[ИмяТабличнойЧасти] Цикл
        
        // Запрашиваем процент скидки из нашего регистра сведений
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   ПерсональныеСкидки.ПроцентСкидки КАК ПроцентСкидки
            |ИЗ
            |   РегистрСведений.ПерсональныеСкидкиКлиентов КАК ПерсональныеСкидки
            |ГДЕ
            |   ПерсональныеСкидки.Партнер = &Партнер
            |   И ПерсональныеСкидки.Номенклатура = &Номенклатура";
            
        Запрос.УстановитьПараметр("Партнер", ТекущийПартнер);
        Запрос.УстановитьПараметр("Номенклатура", СтрокаТовара.Номенклатура);
        
        Выборка = Запрос.Выполнить().Выбрать();
        Если Выборка.Следующий() Тогда
            // Устанавливаем процент ручной или автоматической скидки в строку документа
            СтрокаТовара.ПроцентРучнойСкидки = Выборка.ПроцентСкидки;
            // Принудительно пересчитываем сумму с учетом скидки
            ОбработкаТабличнойЧастиКлиентСервер.ПересчитатьСуммуНДСРеализации(СтрокаТовара);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Преимущества решения с расширением:

Резюме и рекомендации

Выбор метода зависит от готовности вашей компании к небольшим доработкам системы:

← На главную