Руководство поставило задачу следующего характера:
- требуется иметь возможность ранжировать контрагентов по индексам ценности (классам) "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-классификации при минимальных изменениях типовой конфигурации: в основном добавляются новые объекты + добавлено несколько реквизитов документа "ABC-классификация покупателей" (обработку заполнения табличной части документа можно вынести в дополнительные внешние обработки заполнения табличных частей)
- P.S. Если уж совсем минимизировать изменения типового функционала, то можно вообще не трогать документ "ABC-классификация покупателей", отказавшись от дополнительной аналитики (Статус контрагента) и не добавляя табличную часть "Таблица показателей", ограничившись написанием внешней обработки заполнения документа.