Как правильно использовать встроенную функцию КлассификацияABC в СКД

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

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

Решение проблемы вложенных кавычек в выражениях СКД

Одной из первых трудностей, с которой сталкиваются программисты, является использование функции КлассификацияABC совместно с другими функциями СКД, такими как ВычислитьВыражение. Если вы попытаетесь передать формулу в качестве первого параметра, система может выдать ошибку «Неверные параметры». Разберем ситуацию на примере.

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

КлассификацияABC("Сумма(Стоимость)/ВычислитьВыражение("Сумма(Стоимость)","Назначение",,)*100", 3, "80,95")

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

Рассмотрим правильный вариант написания выражения:


КлассификацияABC("Сумма(Стоимость)/ВычислитьВыражение(""Сумма(Стоимость)"",""Назначение"",,)*100", 3, "80,95")

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

Особенности алгоритма: почему значение 82% попадает в группу «А»?

Часто возникает вопрос: почему при установленном пороге в 80% для группы «А», элемент, который доводит накопительный итог до 82%, все равно помечается буквой «А»? На первый взгляд это кажется ошибкой, но на самом деле это стандартная логика алгоритма 1С.

Проанализируем принцип включения:

  1. Система сортирует данные по убыванию показателя.
  2. Начинается расчет накопительного итога (бегущая сумма).
  3. Если текущий элемент — это тот самый «пограничный» объект, на котором общая сумма впервые достигает или превышает указанный порог (например, 80%), этот элемент включается в текущую группу.
  4. Только следующий за ним элемент будет отнесен к группе «B».

Таким образом, если у вас есть один крупный товар, занимающий 82% продаж, он целиком попадет в группу «А». Группа никогда не «разрывается» посередине значения одного элемента. Это важно учитывать при объяснении результатов отчета бизнес-пользователям.

Использование в вычисляемых полях против ресурсов

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

  1. В вычисляемых полях: Мы можем создать поле «ПроцентПродаж» с выражением Сумма(Стоимость)/ВычислитьВыражение(...). Однако помните, что КлассификацияABC — это агрегатная функция, ей нужны контексты группировок.
  2. В ресурсах (рекомендуемый способ): Прописывание функции в ресурсах позволяет гибко управлять расчетом. Вы можете указать разные выражения классификации для разных уровней группировок (например, классифицировать группы товаров отдельно, а товары внутри них — отдельно).

Если вам нужно просто вывести букву категории в строках отчета, используйте поле в ресурсах и обязательно проверьте вкладку «Рассчитывать по...». Если расчет должен идти по всей таблице, оставьте список пустым или укажите конкретные группировки.

Работа с ABC-классификацией в колонках (кросс-таблицы)

Рассмотрим сложную ситуацию: классификация не работает, когда поле переносится в колонки. Это происходит из-за изменения контекста вычислений. Встроенная функция КлассификацияABC по умолчанию ориентирована на расчет «сверху вниз» по одной оси.

Чтобы классификация корректно работала в кросс-таблице (например, когда мы хотим увидеть категории товаров внутри каждого склада, где склады — это колонки), необходимо:

Влияние отрицательных и пустых значений

Проанализируем ситуацию, когда в данных присутствуют возвраты (отрицательные суммы) или пустые значения (NULL). Классический ABC-анализ математически рассчитан на положительные числа. Отрицательные значения могут «сломать» накопительный итог, заставляя его уменьшаться, что приведет к непредсказуемой сортировке.

Посмотрим на пример правильной обработки данных внутри функции:


КлассификацияABC("ВЫБОР КОГДА Сумма(Стоимость) > 0 ТОГДА Сумма(Стоимость) ИНАЧЕ 0 КОНЕЦ", 3, "80,95")

Использование конструкции ВЫБОР позволяет исключить влияние сторно и возвратов на математическую модель распределения. Также рекомендуется всегда оборачивать числовые поля в ЕСТЬNULL(Стоимость, 0), чтобы избежать прерывания расчета накопительного итога.

Итоговый синтаксис функции

Для закрепления материала рассмотрим полную структуру функции с четырьмя параметрами:

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

Соблюдение этих правил позволит вам создавать надежные и точные аналитические отчеты в СКД, которые корректно обрабатывают большие объемы данных и сложные бизнес-требования.

← На главную