gifts2017

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

Опубликовал Антон Чарушкин (hulio) в раздел Отчеты - Управленческие

Пример реализации усложненной 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 000 30 1 000 000 20 0 10
    Покупатель Количество возвратов <= 0 30 2 20 5 10

     

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

    Контрагент Показатель Значение показателя Оценка
    Оптовый покупатель, ООО Объем поступлений ДС 2 700 000 30
    Оптовый покупатель, ООО Количество возвратов 1 20
    Сеть магазинов, ЗАО Объем поступлений ДС 1 500 000 20
    Сеть магазинов, ЗАО Количество возвратов 5 10
    Мелкооптовый покупатель, ИП Объем поступлений ДС 800 000 10
    Мелкооптовый покупатель, ИП Количество возвратов 0 30

     

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

    Оптовый покупатель, ООО - 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-классификация покупателей", отказавшись от дополнительной аналитики (Статус контрагента) и не добавляя табличную часть "Таблица показателей", ограничившись написанием внешней обработки заполнения документа.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Сосна (pumbaE) 28.03.12 16:03
cf забыли выложить или это просто статья?
2. Антон Чарушкин (hulio) 29.03.12 07:02
(1) pumbaE, вообще-то задумывалось как просто статья :)
cf не выложил, т.к. эта система работает на древней "Управление торговлей и взаимоотношениями с клиентами (CRM)"
Теоретически, я могу, конечно, доработать торговлю и выложить тут cf, но ведь с точки зрения авторских прав это тоже будет неправильно - выкладывать конфу 1С )
3. Евгений Сосна (pumbaE) 30.03.12 17:23
(2) hulio, просто вы меня за живое зацепил: сам планировал, подобным образом похожее делать, если не жалко просьба поделиться shenja@sosna.zp.ua "Моя благодарность не будет знать границ ... "
4. Антон Чарушкин (hulio) 31.03.12 15:46
(3) pumbaE, выберу на днях время, сделаю cf-ку ;)
5. розница.net (ZLENKO) 03.05.12 11:17
Очень полезная разработка.
Несколько лет нечто подобное по классификации делал, но негибкое - все было зашито в код.
Для классификации номенклатуры наверное тоже имеет смысл сделать подобное.
6. Марат Глеметдинов (Glemar) 22.01.15 23:24
а можно и сотрудников (менеджеров, операторов, кассиров, продавцов) также ранжировать для объективной оценки их работы
7. EugenePol (EugenePol) 16.09.15 17:16
А если у контрагента несколько статусов?
8. Сергей Пшеничников (Зеленоград) 16.09.15 17:36
(7) EugenePol, Правильная (непротиворечивая, полная, слабо изменяющаяся со временем) классификация - большое преимущество учётной системы. Может быть создана только грамотными специалистами. Слышал, что с удачных внедрений классификаторы денежных средств и доходов и расходов копируют на память :)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа