Как настроить сквозные накопительные скидки для нескольких организаций в 1С:Комплексная автоматизация 2.4

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

В крупных торговых сетях часто возникает ситуация, когда бизнес ведется от лица нескольких юридических лиц (организаций), но клиентская база остается единой. Стандартная задача — обеспечить клиенту возможность копить объем покупок (и получать соответствующий процент скидки) независимо от того, в какой торговой точке и по какой организации он совершил покупку. Рассмотрим, как эта задача решается в 1С:Комплексная автоматизация 2.4 (и аналогично в 1С:ERP 2.4).

Анализ проблемы: почему скидки «не видят» друг друга

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

Когда клиент предъявляет карту в организации №2, система проверяет обороты именно по этой организации. Если покупок там не было, скидка не применяется, даже если в организации №1 клиент приобрел товара на миллионы рублей. Выясним, как обойти это ограничение, используя архитектуру 1С.

Решение 1: Управленческая сущность «Партнер»

В 1С:КА 2.4 разделены понятия Контрагент (юридическое лицо) и Партнер (управленческая сущность). Накопительные скидки в типовом решении рассчитываются именно по партнеру. Разберем этот механизм по шагам:

  1. Убедимся, что все покупки клиента во всех организациях оформляются на одного и того же Партнера. У этого партнера может быть несколько контрагентов, соответствующих разным юрлицам клиента, но партнер должен быть один.
  2. Проанализируем настройки условия предоставления скидки. При создании условия с типом «За накопленный объем продаж» система по умолчанию суммирует данные по партнеру.
  3. Важный момент: Если в условии скидки не стоит жесткого ограничения по организации, система технически способна собрать обороты по всем организациям. Проблема часто кроется в Виде карты лояльности, который ограничивает область действия скидки.

Решение 2: Настройка «сквозного» Типового соглашения

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

Если мы используем Типовое соглашение, поле Организация в нем можно оставить незаполненным. В этом случае соглашение становится доступным для выбора в документах продажи любой организации. Скидки, назначенные в рамках такого «пустого» соглашения, будут рассчитываться исходя из общего оборота партнера, зафиксированного в системе, без фильтрации по конкретному юрлицу.

Решение 3: Программное изменение логики расчета (для разработчиков)

Если бизнес-процесс требует жесткой привязки карт к организациям, нам придется вмешаться в код. Проанализируем, как происходит считывание карты в документе Заказ клиента. Посмотрим на фрагмент кода, отвечающий за обработку карты:


&НаКлиенте
Процедура СчитанаКартаЛояльности(Знач Оповещение, КартаЛояльности)
    ДанныеКартыЛояльности = КартыЛояльностиВызовСервера.ПолучитьДанныеКартыЛояльности(КартаЛояльности);
    
    Если ЗначениеЗаполнено(ДанныеКартыЛояльности.Ссылка) Тогда
        // Проверка прав доступа к партнеру
        Если Не ДанныеКартыЛояльности.ПартнерДоступен Тогда
            ПоказатьПредупреждение(Новый ОписаниеОповещения("СчитанаКартаЛояльностиЗавершение", ЭтотОбъект, Новый Структура("Оповещение", Оповещение)), НСтр("ru = 'Нет доступа к партнеру-владельцу карты лояльности.'"));
            Возврат;
        КонецЕсли;

        // Если партнер в карте отличается от партнера в документе, предлагаем заменить
        Если Объект.Партнер <> ДанныеКартыЛояльности.Партнер Тогда
             // Здесь логика подстановки партнера из карты в документ
        КонецЕсли;

        СкидкиНаценкиКлиент.СброситьФлагСкидкиРассчитаны(ЭтаФорма);
        Модифицированность = Истина;
        Объект.КартаЛояльности = КартаЛояльности;
        СчитанаКартаЛояльностиНаСервере(ДанныеКартыЛояльности);
    КонецЕсли;
КонецПроцедуры

Разберем, что происходит при расчете самой скидки. Проблема не в самой процедуре считывания карты, а в том, как формируется запрос к регистру накопления при расчете условий. Для реализации сквозных скидок нам нужно найти место, где формируется запрос к оборотам продаж (обычно это в общих модулях СкидкиНаценкиСервер или специализированных модулях расчета условий).

Необходимо в запросе, который калькулирует объем продаж, изменить отбор по организации. Вместо ГДЕ Организация = &ОрганизацияИзДокумента нужно либо убрать этот фильтр вовсе, либо передавать туда массив всех организаций, участвующих в программе лояльности.

Решение 4: Переход на бонусную систему

Бонусная система в 1С:КА 2.4 часто оказывается более гибкой для мультиорганизационных структур. Разберем почему:

Решение 5: Использование внешних обработок расчета скидок

Чтобы не снимать конфигурацию с поддержки и избежать «подводных камней» при обновлении, рекомендуем использовать механизм Внешних обработок расчета скидок. Это штатная возможность 1С:ERP и КА.

Мы можем создать внешнюю обработку, которая будет реализовывать алгоритм РасчитатьСкидку(). Внутри этой обработки мы вольны написать любой запрос к базе данных, который соберет продажи по всем организациям текущего партнера и вернет нужный процент скидки в документ. Это наиболее безопасный и профессиональный способ решения задачи в современных редакциях 1С.

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

Проанализировав все способы, можно сделать следующий вывод: если вам нужно быстро запустить систему без программирования, используйте Типовые соглашения без привязки к организации и следите за единством Партнеров в базе. Если же логика бизнеса требует сложного разделения и иерархии организаций, лучшим решением станет разработка Внешней обработки расчета скидок, которая «подтянет» обороты по всем юридическим лицам холдинга.

← На главную