Как в 1С с помощью запроса или встроенных инструментов определить, какие товары чаще всего покупают вместе

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

Задача анализа потребительской корзины (Market Basket Analysis) является классической для торговых систем. Ее цель — выяснить, какие товары обладают высокой степенью ассоциации, то есть часто попадают в один чек или заказ. В рамках платформы 1С это можно реализовать несколькими способами: от простых запросов до использования встроенных механизмов интеллектуального анализа данных. Рассмотрим эти подходы подробнее.

Решение 1. Поиск сопутствующих товаров для конкретной позиции

Часто возникает задача не просто найти абстрактные пары, а понять: "Что покупают вместе с товаром Х?". Это наиболее простая реализация, которую можно выполнить обычным запросом. Разберем логику по шагам.

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


// В параметре &Номенклатура передаем целевой товар
ВЫБРАТЬ
    РеализацияТовары.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_РеализацииСТоваром
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
ГДЕ
    РеализацияТовары.Номенклатура = &Номенклатура
СГРУППИРОВАТЬ ПО
    РеализацияТовары.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиВместе.Номенклатура КАК СопутствующийТовар,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиВместе.Ссылка) КАК Частота
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК ПродажиВместе
ГДЕ
    ПродажиВместе.Ссылка В (ВЫБРАТЬ Ссылка ИЗ ВТ_РеализацииСТоваром)
    И ПродажиВместе.Номенклатура <> &Номенклатура
СГРУППИРОВАТЬ ПО
    ПродажиВместе.Номенклатура
УПОРЯДОЧИТЬ ПО
    Частота УБЫВ

Важный момент: В условии соединения или фильтрации мы обязательно исключаем саму целевую номенклатуру (ПродажиВместе.Номенклатура <> &Номенклатура), иначе она всегда будет занимать первое место в рейтинге, так как она присутствует в каждом отобранном чеке.

Решение 2. Выявление наиболее популярных пар товаров (Top-N пар)

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

Чтобы избежать дублей (когда система считает пару "Хлеб + Молоко" и "Молоко + Хлеб" как разные записи), мы используем оператор сравнения для номенклатуры:


ВЫБРАТЬ
    Т1.Номенклатура КАК Товар1,
    Т2.Номенклатура КАК Товар2,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т1.Ссылка) КАК КоличествоСовместныхПокупок
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Т1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    Документ.РеализацияТоваровУслуг.Товары КАК Т2
ПО Т1.Ссылка = Т2.Ссылка
    И Т1.Номенклатура < Т2.Номенклатура // Исключаем дубли и совпадение товара с самим собой
СГРУППИРОВАТЬ ПО
    Т1.Номенклатура,
    Т2.Номенклатура
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т1.Ссылка) > 5 // Отсекаем случайные единичные срабатывания
УПОРЯДОЧИТЬ ПО
    КоличествоСовместныхПокупок УБЫВ

Проанализируем это решение. Использование условия Т1.Номенклатура < Т2.Номенклатура гарантирует, что в результат попадет только одна комбинация пары, и товар не будет сопоставлен сам с собой. Условие в секции ИМЕЮЩИЕ позволяет отсеять "шум" — товары, которые случайно попали в один чек всего пару раз.

Решение 3. Использование встроенного объекта "АнализДанных"

Написание запросов для поиска пар — задача выполнимая, но поиск троек, четверок или более сложных групп товаров через SQL-подобные запросы становится крайне ресурсоемким и сложным в поддержке. Для этих целей в платформе 1С предусмотрен специализированный инструмент — АнализДанных с типом АнализДанныхПоискАссоциативныхПравил.

Этот объект реализует алгоритмы поиска закономерностей (подобные Apriori) на уровне платформы, что работает значительно быстрее ручных соединений таблиц. Разберем алгоритм его использования:

  1. Подготавливаем источник данных (результат запроса с колонками Ссылка и Номенклатура).
  2. Создаем объект АнализДанных и устанавливаем тип анализа.
  3. Настраиваем параметры:
    • МинимальныйПроцентПоддержки — какой процент чеков от общего числа должен содержать данную группу товаров, чтобы она считалась значимой.
    • МинимальныйПроцентДостоверности — вероятность того, что при покупке товара А будет куплен товар Б.
  4. Выполняем анализ и получаем результат в виде дерева правил.

Пример использования на встроенном языке:


Анализ = Новый АнализДанных;
Анализ.ТипАнализа = Тип("АнализДанныхПоискАссоциативныхПравил");

// Заполняем источник данных (результат запроса по чекам)
Анализ.ИсточникДанных = РезультатЗапроса; 

// Настройка параметров
Анализ.Параметры.МинимальныйПроцентПоддержки.Значение = 0.5; // Группа должна быть в 0.5% чеков
Анализ.Параметры.МинимальныйПроцентДостоверности.Значение = 10; // Уверенность в связи от 10%

РезультатАнализа = Анализ.Выполнить();

// Вывод результата (например, в построитель отчета или дерево значений)
Построитель = Новый ПостроительОтчетаАнализаДанных();
Построитель.ИсточникДанных = РезультатАнализа;
Построитель.Вывести(ТабличныйДокумент);

Методологические нюансы анализа

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

  1. Что считать "корзиной"? Не всегда "вместе" означает "в одном документе". Иногда покупатель забывает что-то купить и пробивает второй чек через минуту. Если в системе ведется учет по дисконтным картам, имеет смысл группировать товары по клиенту и дате (временному окну), а не только по ссылке на документ.
  2. Группы или Номенклатура? На больших справочниках анализ конкретных позиций может не дать четкой картины. Иногда полезнее анализировать группы (например, "Молочная продукция" и "Хлебобулочные изделия"), чтобы выявить глобальные предпочтения.
  3. Показатель Lift (Значимость). Простая частота может быть обманчивой. Если хлеб покупают в 90% случаев, он будет сопутствующим товаром ко всему. Метрика Значимость (Lift) показывает, насколько покупка товара А реально увеличивает вероятность покупки товара Б по сравнению с их обычной частотой продаж.

Подводя итог, можно сказать следующее: для простых задач "товар-спутник" идеально подходит запрос с использованием ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Для глубокого маркетингового анализа и поиска сложных цепочек товаров лучше использовать штатный механизм АнализДанных, который берет на себя всю тяжелую математическую работу.

← На главную