В розничной торговле сопутствующие продажи (cross-selling) — это мощный инструмент повышения среднего чека. Однако при работе с широким ассортиментом (например, в сфере хозяйственных товаров, посуды, строительных материалов) стандартный подход настройки сопутствующих товаров «один к одному» быстро превращается в хаос. Представьте ситуацию: менеджер хочет, чтобы при покупке кастрюли кассир предлагал губку для мытья посуды. Но в базе данных заведено 50 видов кастрюль и 30 видов губок. Если настраивать связи вручную для каждого товара, менеджеру придется создать 1500 связей! А на экране кассира при сканировании кастрюли отобразится огромный список из 30 губок, в котором невозможно ориентироваться.
В этой статье мы подробно разберем, как решить эту проблему с точки зрения архитектуры 1С. Мы откажемся от жестких связей «товар-товар» и перейдем к концепции логических множеств, наследования и динамического подбора по свойствам номенклатуры. Это позволит автоматизировать процесс, упростить работу менеджеров и сделать интерфейс рабочего места кассира (РМК) максимально информативным.
При классической схеме, реализованной во многих старых конфигурациях 1С, сопутствующие товары хранятся в простом регистре сведений с измерениями Номенклатура и СопутствующийТовар. Для магазинов одежды или бытовой техники это работает отлично (к телефону предлагаем конкретный чехол). Но в хозтоварах или строительном ритейле этот подход порождает три критические проблемы:
Наша задача — спроектировать гибкую систему, которая позволит связывать категории товаров, динамически отбирать лучшие предложения и выводить кассиру не более 3–5 актуальных позиций, имеющихся в наличии на конкретном складе.
Вместо связи конкретных элементов номенклатуры мы предлагаем использовать понятие «Множество». Множество — это логическое условие, под которое попадает группа товаров. Например, множество «Кастрюли» и множество «Губки для посуды».
Давайте спроектируем структуру хранения таких связей. Создадим справочник МножестваНоменклатуры. Каждое множество может описываться набором правил:
Далее мы создаем регистр сведений СопутствующиеМножества со следующей структурой:
ПродаваемоеМножество (Ссылка на справочник МножестваНоменклатуры)ПредлагаемоеМножество (Ссылка на справочник МножестваНоменклатуры)Приоритет (Число, для определения очередности вывода)При сканировании товара на кассе система определяет, к каким продаваемым множествам относится текущий SKU, находит связанные предлагаемые множества, а затем динамически выбирает из этих множеств товары, которые есть в наличии на текущем складе.
Это более простой в реализации, но крайне эффективный подход, который уже применяется в современных конфигурациях, таких как 1С:Розница 3.0 и 1С:УНФ 3.0. Мы настраиваем сопутствующие товары не для конкретной номенклатуры, а для её родительской группы (папки).
Рассмотрим алгоритм работы этой системы:
Иногда сопутствующий товар жестко привязан к техническим характеристикам основного. Классический пример — элементы питания (батарейки). Если покупатель берет фонарик или детскую игрушку, кассир обязан предложить батарейки нужного формата (АА, ААА, C, D).
Связывать каждый фонарик с конкретной батарейкой вручную нерационально. Правильнее использовать механизм Дополнительных реквизитов:
ТипПитания со значениями «Батарейки АА», «Батарейки ААА» и т.д.ФорматБатарейки с аналогичными значениями.ТипПитания. Если оно заполнено, система автоматически выполняет поиск в группе номенклатуры «Батарейки» по фильтру ФорматБатарейки = ТипПитания основного товара.Давайте разберем по шагам, как реализовать программный подбор сопутствующих товаров на кассе с фильтрацией по остаткам и ограничением вывода до 5 позиций. Нам потребуется написать запрос, который будет вызываться при активизации строки в корзине покупателя.
Предположим, у нас есть регистр сведений СопутствующиеТоварыГрупп, где задана связь между группой продаваемого товара и конкретными сопутствующими товарами. Нам нужно получить список рекомендаций, исключив те товары, которых нет на складе.
Проанализируем пример кода на языке запросов 1С:
Процедура ПолучитьСопутствующиеТовары(ТекущийТовар, ТекущийСклад)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 5
| Сопутствующие.СопутствующийТовар КАК Товар,
| ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК Остаток,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.СопутствующиеТоварыГрупп КАК Сопутствующие
| // Соединяем со свободными остатками для фильтрации
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(,&Склад) КАК СвободныеОстаткиОстатки
| ПО Сопутствующие.СопутствующийТовар = СвободныеОстаткиОстатки.Номенклатура
|
| // Получаем актуальную розничную цену
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
| ПО Сопутствующие.СопутствующийТовар = ЦеныНоменклатурыСрезПоследних.Номенклатура
|ГДЕ
| Сопутствующие.ГруппаНоменклатуры = &ГруппаНоменклатуры
| И ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) > 0
|УПОРЯДОЧИТЬ ПО
| Сопутствующие.Приоритет";
// Определяем родительскую группу для текущего товара
ГруппаТовара = ТекущийТовар.Родитель;
Запрос.УстановитьПараметр("ГруппаНоменклатуры", ГруппаТовара);
Запрос.УстановитьПараметр("Склад", ТекущийСклад);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная"));
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Выводим товары на панель рекомендаций РМК
ДобавитьТоварНаПанельРекомендаций(Выборка.Товар, Выборка.Цена);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Этот алгоритм решает сразу несколько ключевых задач:
ПЕРВЫЕ 5 гарантирует, что кассир не утонет в предложениях и быстро сориентируется.Если у клиента есть ресурсы и желание развивать систему продаж, наилучшим решением будет гибридный подход. Ручные настройки менеджеров («я так вижу») можно совместить с автоматическим анализом чеков (Data Mining).
Платформа 1С содержит встроенные механизмы интеллектуального анализа данных. С помощью обработки АнализДанныхПоискАссоциаций система может раз в неделю анализировать накопленную историю чеков и выявлять устойчивые связи (например, «в пятницу вечером к углю для мангала всегда берут розжиг конкретной марки»).
Менеджер может запустить эту обработку, получить рекомендации системы и утвердить их, автоматически создав записи в нашем регистре СопутствующиеТоварыГрупп. Это исключает субъективные ошибки и позволяет продавать именно то, что действительно нужно покупателям.
Подводя итоги, дадим несколько практических советов для успешного запуска сопутствующих продаж в рознице с широким ассортиментом: