ABC анализ является довольно распространенным методом классификации различных ресурсов. На просторах сети мы скорее всего найдем описание применения этого метода для классификации номенклатуры, чуть реже - контрагентов. Основан на знаменитом правиле Паретто, aka 80/20, который как известно позволяет разделить рассматриваемый ресурс на 2 группы: более значимая часть, требующая меньше затрат на обслуживание и менее значимая часть, требующая больше затрат на обслуживание. ABC анализ чаще всего применяют для разделения на большее количество категорий, например 3 или 4. Рассмотрим классификацию контрагентов по признаку доли выручки. Классифицировать будем на 3 группы:
- в первую группу будут входить контрагенты, суммарная доля выручки которых составляет 80%. На основании правила Паретта мы можем ожидать, что количество контрагентов в данной группе составит 20% от общего числа.
- во вторую группу войдут контрагенты, суммарная доля выручки которых составляет 15%,
- в третью группу - все остальные контрагенты. Суммарная доля их выручки составит 5%.
Классификационные группы по традиции обозначают заглавными буквами английского алфавита: A, B, C.
Для выборки первоначальных данных мы обратимся к оборотам бухгалтерского регистра Хозрасчетный, и получим из него данные запросом. Выбирать будем по условию Счет равно Счет выручки 90.01. Причем рассмотрим 2 случая: когда корр. счет равен счету кассы 50.01 и когда нет. Тем самым мы выберем данные по оптовым и розничным продажам. Продажи по сертификатам и прочее для простоты рассматривать не будем.
Ниже приведен листинг запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ОптоваяПродажа.СуммаОборотКт КАК Сумма,
ВЫРАЗИТЬ(ОптоваяПродажа.КорСубконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ОптоваяПродажа.Счет КАК Счет,
ОптоваяПродажа.КорСчет КАК КорСчет,
ОптоваяПродажа.Организация КАК Организация,
ЛОЖЬ КАК РозничныйПокупатель,
ОптоваяПродажа.Регистратор КАК Документ,
ОптоваяПродажа.ПериодДень КАК Период,
ОптоваяПродажа.КоличествоОборотКт КАК Количество
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (&СчетаВыручки), , , НЕ КорСчет В (&СчетаКассы), ) КАК ОптоваяПродажа
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РозничнаяПродажа.СуммаОборотКт,
РозничнаяПродажа.Субконто1,
РозничнаяПродажа.Счет,
РозничнаяПродажа.КорСчет,
РозничнаяПродажа.Организация,
ИСТИНА,
РозничнаяПродажа.Регистратор,
РозничнаяПродажа.ПериодДень,
РозничнаяПродажа.КоличествоОборотКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (&СчетаВыручки), , , КорСчет В (&СчетаКассы), ) КАК РозничнаяПродажа;
Поместив результат данного запроса во временную таблицу и выполнив на её основании еще ряд запросов мы в итоге получим результирующий запрос, который будет содержать следующие данные:
- Контрагент,
- Выручка,
- Общая выручка,
- Доля в выручке,
- Доля в выручке в процентах.
Итак, на данном этапе мы располагаем исходными данными. Следующая задача - присвоение контрагентам классификационных групп. Ниже представлен листинг алгоритма присвоения классификационных групп:
категорияA = "A";
категорияB = "B";
категорияC = "C";
ДоляКатегории_A = 0.8;
ДоляКатегории_B = 0.15;
ДоляКатегории_C = 0.05;
текущаяКатегория = катA;
суммаДоли = 0;
ИсходныеДанныеКонтрагентов.Сортировать("ДоляВВыручке Убыв");
Для Каждого контр ИЗ ИсходныеДанныеКонтрагентов Цикл
суммаДоли = суммаДоли + контр.ДоляВВыручке;
контр.Категория1 = текущаяКатегория;
Если текущаяКатегория = катA Тогда
Если суммаДоли > ДоляКатегории_A Тогда
текущаяКатегория = категорияB;
ДоляКатегории_A = суммаДоли;
ДоляКатегории_B = 1 - ДоляКатегории_A - ДоляКатегории_C;
суммаДоли = 0;
КонецЕсли;
ИначеЕсли текущаяКатегория = катB Тогда
Если суммаДоли > ДоляКатегории_B Тогда
текущаяКатегория = категорияC;
ДоляКатегории_B = суммаДоли;
ДоляКатегории_C = 1 - ДоляКатегории_A - суммаДоли;
суммаДоли = 0;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Настроив в СКД условное оформление для разных категорий, а также обозначение категорий привычными символами A, B и C (через настройку макетов), мы получаем примерно следующий результат:
Рис. 1. Отчет ABC Классификация контрагентов по признаку доли в выручке.
Попытки найти способ получения классификации в самом запросе привели меня к более короткому и более профессиональному пути решения данной задачи. Сам механизм СКД имеет встроенную функцию КлассификацияABC, которая может быть применена для написания выражения ресурса. Синтаксис данной функции:
КлассификацияABC(<Выражение>, <КоличествоГрупп>, <ПроцентыГрупп>, <ГруппировкиПрименения>)
Параметры:
<Выражение> - тип Строка, выражение вычисления классификации,
<КоличествоГрупп> - тип Число,
<ПроцентыГрупп> - тип Строка, распределение процентов по группам. Обратите внимание - записывается нарастающим итогом, проценты последней группы не указываются,
<ГруппировкиПрименения> - тип Строка, наименование группировки, в которой нужно вычислять классификацию.
В нашем случае вызов данной функции выглядит следующим образом:
КлассификацияABC("Сумма(ДоляВВыручке)", 3, "80,95", "Контрагент")
Рис. 2. Настройка функции КлассификацияABC в СКД отчета.
В итоге получаем следующий результат:
Рис. 3. Отчет ABC Классификация контрагентов по признаку доли в выручке с помощью функции СКД.
Предлагаемые отчеты могут подключены к программе как внешние, через механизм БСП Дополнительные отчеты и обработки. Функционал тестировался на версии 3.0.75.109 конфигурации Бухгалтерия предприятия.