Как реализовать ABC-классификацию номенклатуры по количеству и сумме в 1С

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Математическая логика ABC-анализа: метод нарастающего итога

Прежде чем приступать к написанию кода, проанализируем саму методику. Часто начинающие разработчики пытаются классифицировать товар, просто сравнивая его индивидуальную долю с неким порогом (например, "если выручка по товару меньше 20% от общей"). Это неверный подход. Классический ABC-анализ базируется на принципе Парето и методе нарастающего итога.

Разберем алгоритм по шагам:

  1. Сортировка: Все позиции номенклатуры выстраиваются в список по убыванию анализируемого показателя (например, по сумме продаж).
  2. Расчет доли: Для каждой строки вычисляется процентное отношение ее значения к общей сумме по всем строкам.
  3. Нарастающий итог: Для каждой следующей строки суммируются доли всех предыдущих строк. Таким образом, у последней позиции нарастающий итог всегда будет равен 100%.
  4. Присвоение группы:
    • Группа А: Самые ценные товары. Нарастающий итог от 0 до 80%.
    • Группа В: Промежуточные товары. Нарастающий итог от 80% до 95%.
    • Группа С: Малозначимые товары. Остаток от 95% до 100%.

Важное замечание: Границы 80/15/5 являются стандартными, однако в учебных задачах или специфических отраслях могут использоваться другие пропорции, например 20/60/20. Главное правило — сумма всех долей должна составлять ровно 100%.

Реализация через СКД и функцию КлассификацияАВС

В платформе 1С предусмотрена встроенная функция для использования в схемах компоновки данных. Рассмотрим, как правильно ее вызвать в вычисляемых полях или ресурсах. Функция имеет следующий синтаксис:

КлассификацияABC("Значение", КоличествоГрупп, "Проценты")

Разберем типичную ошибку, с которой сталкиваются разработчики. Если в параметре процентов указать значения, которые в сумме не дают 100 (например, "20, 21, 81"), система выдаст ошибку или вернет некорректный результат. Для корректной работы, если мы хотим выделить 20% в первую группу, 60% во вторую и 20% в третью, строка параметров должна выглядеть так: "20, 60, 20".

Проанализируем пример выражения для ресурса в СКД:

КлассификацияABC(Сумма(СуммаВыручки), 3, "80, 15, 5")

При использовании этой функции в СКД система автоматически выполнит сортировку и расчет нарастающего итога внутри группировки, к которой применен ресурс.

Программная реализация ABC-анализа (без СКД)

Если задача стоит реализовать отчет "в коде" (например, для вывода в произвольный макет или для сложной обработки данных), удобнее всего использовать ТаблицаЗначений. Рассмотрим пошагово, как это сделать.

Сначала подготовим данные. Допустим, у нас уже есть таблица тзДанные с колонками Номенклатура и СуммаПродаж.


// 1. Сортируем таблицу по убыванию показателя
тзДанные.Сортировать("СуммаПродаж Убыв");

// 2. Вычисляем общий итог для расчета долей
ОбщийИтог = тзДанные.Итог("СуммаПродаж");

// Если итог нулевой, анализ невозможен
Если ОбщийИтог = 0 Тогда
    Возврат;
КонецЕсли;

// 3. Добавляем колонки для расчета
тзДанные.Колонки.Добавить("Доля", "Число");
тзДанные.Колонки.Добавить("НарастающийИтог", "Число");
тзДанные.Колонки.Добавить("Класс", "Строка");

ТекущийНарастающийИтог = 0;

Для Каждого Строка Из тзДанные Цикл
    // Вычисляем долю текущей строки в общем объеме
    Строка.Доля = (Строка.СуммаПродаж / ОбщийИтог) * 100;
    
    // Плюсуем к нарастающему итогу
    ТекущийНарастающийИтог = ТекущийНарастающийИтог + Строка.Доля;
    Строка.НарастающийИтог = ТекущийНарастающийИтог;
    
    // Присваиваем категорию на основании границ
    Если ТекущийНарастающийИтог <= 80 Тогда
        Строка.Класс = "A";
    ИначеЕсли ТекущийНарастающийИтог <= 95 Тогда
        Строка.Класс = "B";
    Иначе
        Строка.Класс = "C";
    КонецЕсли;
КонецЦикла;

Этот алгоритм наглядно демонстрирует механику процесса. Важно помнить, что из-за особенностей округления чисел с плавающей точкой ТекущийНарастающийИтог в последней строке может получиться 99.99999 или 100.00001. Для бизнес-логики это не критично, но при строгих проверках стоит использовать функцию Окр().

Классификация по двум критериям (Сумма и Количество)

В реальных задачах часто требуется учитывать не один показатель, а два одновременно. Например, товар может приносить большую выручку (Класс А по сумме), но продаваться всего один раз в год (Класс С по количеству). Как совместить эти данные?

Разберем два подхода:

  1. Матричный метод: Мы проводим два независимых ABC-анализа. В итоге каждая позиция получает двухбуквенный код (AA, AB, BC и т.д.). Товары категории AA — это безусловные лидеры, а товары CC — кандидаты на вывод из ассортимента.
  2. Метод весовых коэффициентов: Мы создаем интегральный показатель. Выясним, что важнее для компании: выручка или оборачиваемость (количество).

    Например, назначим вес 0.7 для суммы и 0.3 для количества. Тогда расчетный показатель будет выглядеть так:

    Рейтинг = (ДоляПоСумме * 0.7) + (ДоляПоКоличеству * 0.3)

    После вычисления этого рейтинга мы снова сортируем таблицу и применяем стандартный алгоритм нарастающего итога уже к этому синтетическому числу.

Практические советы и нюансы

Проанализируем несколько важных моментов, которые помогут сделать ваш отчет профессиональным:

1. Обработка пустых значений: Если у товара нулевые продажи за период, он автоматически должен попадать в категорию "С" или даже в отдельную категорию "D" (неликвид). В коде это стоит обрабатывать до начала цикла расчета долей.

2. Очистка данных: Перед проведением ABC-анализа рекомендуется исключать из выборки внутренние перемещения, возвраты от покупателей (если они сильно искажают картину) и прочие некоммерческие операции.

3. XYZ-анализ: Для полноты картины ABC-анализ часто дополняют XYZ-анализом, который оценивает стабильность спроса. Сочетание этих методов (матрица ABC-XYZ) дает исчерпывающую информацию о том, какие товары нужно всегда держать на складе в большом объеме, а какие возить только под заказ.

Выясним причину, почему иногда результаты в 1С могут казаться странными. Это часто связано с группировками. Если вы делаете ABC-анализ в иерархическом справочнике, убедитесь, что вы анализируете только конечные элементы (номенклатуру), а не группы (папки), иначе суммы будут задваиваться, и классификация потеряет смысл.

Используя приведенные выше методы, вы сможете реализовать гибкую и точную систему классификации, которая станет надежным инструментом для управления закупками и продажами.

← На главную