Сложное ранжирование клиентов по классам
Пример реализации усложненной ABC-классификации клиентов.
Данная статья написана для конфигурации "1С: Управление торговлей, ред. 10.3", но, я думаю, предложенный метод подойдет и для других конфигураций, имеющих механизм ABC-классификации.
- Описание
- Подробнее
Описание
Руководство поставило задачу следующего характера:
- требуется иметь возможность ранжировать контрагентов по индексам ценности (классам) «A», «B» и «C»;
- необходимо хранить историю изменения индекса ценности контрагента;
- классифицироваться должны не только покупатели, но и остальные контрагенты (поставщики, конкуренты и т.д.);
- индекс ценности должен рассчитываться по нескольким показателям, каждый из которых будет иметь свой вес;
Если бы не последние 2 требования, то все было бы довольно просто: указываем в учетной политике нужный показатель для классификации, обучаем людей формированию документа «ABC-классификация покупателей» и вперед. Но не в нашем случае. Кроме того, определенные сложности возникали из-за того, что для разных типов контрагентов должны быть совершенно разные показатели. Да и сами показатели руководство выдумывает новые чуть ли не каждый день.
Совместно с моим коллегой мы придумали такой способ реализации:
- В регистр сведений ABC-классификация покупателей добавляем дополнительное измерение — статус контрагента (или тип, это уж кому как удобнее — покупатель, поставщик и т.д.)
- Создаем справочник возможных показателей — «Показатели ABC-классификации». Алгоритм расчета показателя будем хранить в самом справочнике. Благодаря такому решению можно добавить сколько угодно новых показателей, не открывая для этого конфигуратор.
- Создаем регистр сведений «Матрица ABC-классификации» — в нем будем указывать, какие показатели использовать для различных типов клиентов, а так же способ ранжирования значений показателей по классам.
- Дорабатываем заполнение документа «ABC-классификация покупателей» таким образом, чтобы контрагенты классифицировались не по одному параметру, установленному в учетной политике, а по итогу нескольких показателей.
Рассмотрим решение подробнее:
- Статус контрагента — обычное перечисление или справочник, кому что больше нравится. Значения можно задавать совершенно любые (покупатель, поставщик, конкурент, прочее …). В справочнике контрагентов хранить статус не нужно. Статус будем указывать в шапке документа «ABC-классификация покупателей», т.к. он нужен только для заполнения измерения регистра сведений «ABC-классификация покупателей».

- Справочник «Показатели ABC-классификации» мы честно слизали, взяв за основу справочник «Алгоритмы» из подсистемы Инструменты разработчика (огромное спасибо разработчику — Сергею AKA tormozit), т.к. он подхоил нам идеально. Важно: должно соблюдаться следующее условие — в коде алгоритма должна инициализироваться переменная Результат, в которую должна помещаться таблица значений с колонками «Контрагент» (справочник «Контрагенты»). и «ЗначениеПоказателя» (число) .

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



