Каталог решений - Сложное ранжирование клиентов по классам

Сложное ранжирование клиентов по классам

Сложное ранжирование клиентов по классам

В наличии

Пример реализации усложненной ABC-классификации клиентов.
Данная статья написана для конфигурации "1С: Управление торговлей, ред. 10.3", но, я думаю, предложенный метод подойдет и для других конфигураций, имеющих механизм ABC-классификации.

Категория:

Описание

Руководство поставило задачу следующего характера:

  1. требуется иметь возможность ранжировать контрагентов по индексам ценности (классам) «A», «B» и «C»;
  2. необходимо хранить историю изменения индекса ценности контрагента;
  3. классифицироваться должны не только покупатели, но и остальные контрагенты (поставщики, конкуренты и т.д.);
  4. индекс ценности должен рассчитываться по нескольким показателям, каждый из которых будет иметь свой вес;

 

Если бы не последние 2 требования, то все было бы довольно просто: указываем в учетной политике нужный показатель для классификации, обучаем людей формированию документа «ABC-классификация покупателей» и вперед. Но не в нашем случае. Кроме того, определенные сложности возникали из-за того, что для разных типов контрагентов должны быть совершенно разные показатели. Да и сами показатели руководство выдумывает новые чуть ли не каждый день.

 Совместно с моим коллегой мы придумали такой способ реализации:

  1. В регистр сведений ABC-классификация покупателей добавляем дополнительное измерение — статус контрагента (или тип, это уж кому как удобнее — покупатель, поставщик и т.д.)
  2. Создаем справочник возможных показателей — «Показатели ABC-классификации». Алгоритм расчета показателя будем хранить в самом справочнике. Благодаря такому решению можно добавить сколько угодно новых показателей, не открывая для этого конфигуратор.
  3. Создаем регистр сведений «Матрица ABC-классификации» — в нем будем указывать, какие показатели использовать для различных типов клиентов, а так же способ ранжирования значений показателей по классам.
  4. Дорабатываем заполнение документа «ABC-классификация покупателей» таким образом, чтобы контрагенты классифицировались не по одному параметру, установленному в учетной политике, а по итогу нескольких показателей.

 

Рассмотрим решение подробнее:

  • Статус контрагента — обычное перечисление или справочник, кому что больше нравится. Значения можно задавать совершенно любые (покупатель, поставщик, конкурент, прочее …). В справочнике контрагентов хранить статус не нужно. Статус будем указывать в шапке документа «ABC-классификация покупателей», т.к. он нужен только для заполнения измерения регистра сведений «ABC-классификация покупателей». 
  • Выбор статуса контрагентов
  • Справочник «Показатели ABC-классификации» мы честно слизали, взяв за основу справочник «Алгоритмы» из подсистемы Инструменты разработчика (огромное спасибо разработчику — Сергею AKA tormozit), т.к. он подхоил нам идеально. Важно: должно соблюдаться следующее условие — в коде алгоритма должна инициализироваться переменная Результат, в которую должна помещаться таблица значений с колонками «Контрагент» (справочник «Контрагенты»). и «ЗначениеПоказателя» (число) . 
  • Редактирование алгоритма вычисления показателя
  • Примеры показателей (для разукрашивания кода была использована замечательная обработка — Разукрашка, автором которой является Константинов Алексей AKA alexk-is):
    •  1. Объем поступлений денежных средств. Текст алгоритма:
  • Текст =
    «
    |ВЫБРАТЬ
    |   Т.Контрагент КАК Контрагент,
    |   Т.СуммаУпрОборот КАК ЗначениеПоказателя
    |ИЗ
    |   РегистрНакопления.ДвиженияДенежныхСредств.Обороты(
    |           &Дата1,
    |           &Дата2,
    |           ,
    |           Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    |               И Контрагент <> НЕОПРЕДЕЛЕНО
    |               И ПриходРасход = &ВидДвиженияПриход) КАК Т»;

    Запрос = Новый Запрос(Текст);
    Запрос.Параметры.Вставить(«Дата1», Дата1);
    Запрос.Параметры.Вставить(«Дата2», Дата2);
    Запрос.Параметры.Вставить(«ВидДвиженияПриход», ВидДвиженияПриход);
    Результат = Запрос.Выполнить().Выгрузить();


    • 2. Количество возвратов. Текст алгоритма:
  • Текст =
    «
    |ВЫБРАТЬ
    |   Т.Контрагент КАК Контрагент,
    |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т.Регистратор) КАК ЗначениеПоказателя
    |ИЗ
    |   РегистрНакопления.Продажи.Обороты(&Дата1, &Дата2, Регистратор, ) КАК Т
    |ГДЕ
    |   Т.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
    |
    |СГРУППИРОВАТЬ ПО
    |   Т.Контрагент»;

    Запрос = Новый Запрос(Текст);
    Запрос.Параметры.Вставить(«Дата1», Дата1);
    Запрос.Параметры.Вставить(«Дата2», Дата2);
    Результат = Запрос.Выполнить().Выгрузить();


  • Регистр сведений «Матрица ABC-классификации», как я уже говорил, используется для настройки состава показателей для каждого статуса контрагента, а также их ранжирования. Данные регистр имеет следующую структуру:
  •  

    Измерения: 

     

      1. Статус контрагента (покупатель, поставщик и т.д.)
      2. Показатель (справочник «Показатели ABC-классификации»)
  •  

    Ресурсы:

     

      1. Вид сравнения (перечисление «Виды сравнения»: «БольшеИлиРавно», «МеньшеИлиРавно»)
      2. ГраницаAКласс
      3. ГраницаBКласс
      4. ГраницаCКласс
      5. ОценкаAКласс
      6. ОценкаBКласс
      7. ОценкаCКласс
  • Матрица показателей

  • Я думаю, по поводу измерений вопросов ни у кого нет. Остановимся подробнее на ресурсах (они все, кроме вида сравнения, числовые):
  • Границы нужны для ранжирования значений, а оценки — это числовые выражения, соотвествующие заданному диапазону значений.
  • В зависимости от вида сравнения должны выполнятся следующие условия:
  • Вид сравнения «Больше или равно» : ГраницаAКласс >= ГраницаBКласс >= ГраницаCКласс

    Вид сравнения «Меньше или равно»: ГраницаAКласс <= ГраницаBКласс <= ГраницаCКласс

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

    На примере двух описанных выше показателей (сумма оплат и количество возвратов):

    допустим, получили две таблицы значений:

    Оплаты (значение показателя — сумма поступлений денежных средств в валюте упр. учета)

    КонтрагентЗначение показателя
    Оптовый Покупатель, ООО2 700 000
    Сеть магазинов, ЗАО1 500 000
    Мелкооптовый покупатель, ИП800 000

     

    Возвраты (значение показателя — количество возвратов)

    КонтрагентЗначение показателя
    Оптовый покупатель, ООО1
    Сеть магазинов, ЗАО5
    Мелкооптовый покупатель, ИП0

     

    В регистре «Матрица ABC-классификации» имеем следующие записи:

    СтатусПоказательВид сравненияГраница AОценка AГраница BОценка BГраница CОценка C
    ПокупательОбъем поступлений ДС>=2 000 000301 000 00020010
    ПокупательКоличество возвратов<=030220510

     

    На основе данных в регистре сведений ранжируем (получаем оценку) первые две таблицы и объединяем их в одну:

    КонтрагентПоказательЗначение показателяОценка
    Оптовый покупатель, ООООбъем поступлений ДС2 700 00030
    Оптовый покупатель, ОООКоличество возвратов120
    Сеть магазинов, ЗАООбъем поступлений ДС1 500 00020
    Сеть магазинов, ЗАОКоличество возвратов510
    Мелкооптовый покупатель, ИПОбъем поступлений ДС800 00010
    Мелкооптовый покупатель, ИПКоличество возвратов030

     

    Соответственно, итоговые оценки (сумма оценок по всем показателям) будут такие:

    Оптовый покупатель, ООО — 50 баллов

    Мелкооптовый покупатель, ИП — 40 баллов

    Сеть магазинов, ЗАО — 30 баллов

     

    Остался последний штрих — распределить по классам A, B и C клиентов. В качестве параметра распределения используем полученные итоговые оценки. Тогда при стандартных пропорциях (A — 70%, B — 20%, C — 10%) получим следующий результат:

     

    Класс A:

    Оптовый покупатель, ООО

    Мелкооптовый покупатель, ИП

     

    Класс B:

    Сеть магазинов, ЗАО

     

    Класс C:

    —

  • Если скорретировать оценки в регистре «Матрица ABC-классификации», можно получить другие результаты.

  • В данном решении вес показателя определяется оценками в матрице классификации.
  • Можно сделать и немного иначе — в регистр «Матрица ABC-классификации» добавить ресурс «Вес», и при расчете итоговой оценки учитывать этот вес. 
  • Опишу подробнее изменения в документе «ABC-классификация покупателей»
    1. добавить реквизит шапки — статус контрагентов
    2. Добавить табличную часть — Таблица показателей (Контрагент, Показатель, Значение, Оценка)
    3. Добавить кнопку заполнения табличной части «Заполнить по матрице показателей» (в принципе, можно заменить процедуру заполнения на свою, но если добавить отдельную кнопку, то можно оставить и типовой способ заполнения документа)
    4. Прописать процедуру заполения (получить список используемых показателей, для каждого показателя получить таблицу значений показателя, сформировать запрос для заполнения табличных частей «ТаблицаПоказателей» и «ТаблицаРаспределенияКонтрагентов», в который параметрами передать все полученные таблицы значений показателей)
    5. Немножко поправить проведение документа — нужно, чтобы в регистре сведений «ABC-классификация» заполнялось измерение «СтатусКонтрагента»
  • На этом все. При таком решении мы получаем достаточно гибкий механизм ABC-классификации при минимальных изменениях типовой конфигурации: в основном добавляются новые объекты + добавлено несколько реквизитов документа «ABC-классификация покупателей» (обработку заполнения табличной части документа можно вынести в дополнительные внешние обработки заполнения табличных частей)
  • P.S. Если уж совсем минимизировать изменения типового функционала, то можно вообще не трогать документ «ABC-классификация покупателей», отказавшись от дополнительной аналитики (Статус контрагента) и не добавляя табличную часть «Таблица показателей», ограничившись написанием внешней обработки заполнения документа.
has been added to your cart:
Оформление заказа