Модификаторы

Источник требований

Модификаторы позволяют кастомизировать товар при заказе: выбрать размер, добавить соус, убрать ингредиент. Группа модификаторов — самостоятельная сущность в справочнике. Привязывается к товару (в конструкторе товара), не к каталогу. Изменения применяются мгновенно (без версионности). (Обновлено в BR 1.8.1)


Группа модификаторов

Самостоятельная сущность. Создаётся один раз в справочнике, переиспользуется между товарами в каталоге.

Поля группы

ПолеОбязательностьОписание
НазваниеОбязательно”Выберите размер”, “Добавки”, “Соусы”
ТипОбязательноgroup (выбор из нескольких опций) / single (одиночный модификатор)
minAmountОбязательноМинимальное кол-во опций для выбора (default 0)
maxAmountОбязательноМаксимальное кол-во опций (default 1)
СтатусОбязательноactive / inactive (default active)

Примеры min/max

minmaxПоведение
11Обязательный единственный выбор (размер пиццы)
03Необязательный, до 3 добавок
01Необязательный, одна опция (простой модификатор)

Опции

Опции — элементы внутри группы.

ПолеОбязательностьОписание
НазваниеОбязательно”25 см”, “Доп. сыр”, “Без лука”
minAmountОбязательноМин. количество этой опции (default 0)
maxAmountОбязательноМакс. количество (default 1)
defaultAmountОбязательноКол-во по умолчанию (default 0)
freeQuantityОбязательноБесплатное кол-во (default 0). Клиент получает N единиц бесплатно
descriptionНетОписание опции (текст)
sku_1cНеобязательноКод номенклатуры 1С (только для опций structural-мода). Используется при выгрузке чеков в 1С — см. 1С Общепит. (Добавлено в BR 1.17)
name_1cНеобязательноНазвание опции при выгрузке в 1С (если NULL → используется обычное name). (Добавлено в BR 1.18)
isActiveОбязательноАктивна/неактивна (default true). Неактивные не показываются в POS
ПорядокОбязательноЧисловое поле для сортировки (стрелки ↑↓ в UI)

Цена опции определяется прейскурантом, не полем на опции. (Убрано в BR 1.10)


Привязка к товару

(Обновлено в BR 1.8.1) (Обновлено в BR 1.9.2)

Группа привязывается к товару в конструкторе товара. Изменения применяются мгновенно (без версионности). Модификаторы — свойство товара, а не каталога.

Типы привязки (BR 1.9.2)

При привязке группы к товару указывается тип привязки (binding_type). Одна и та же группа может быть закреплённой для одного товара и свободной для другого.

Закреплённый (structural)Свободный (free, default)
ОпределяетВариант блюда — без него товар не существуетОпциональная добавка — клиент может взять или нет
Где в UIТаб “Модификаторы” — секция “Закреплённые” (BR 1.9.3)Таб “Модификаторы” — секция “Свободные” (BR 1.9.3)
ОбязательностьВсегда обязателен (min >= 1)Опционален (min = 0)
Влияет на техкарту товараДа — каждая опция = отдельная техкарта товара (tech_cards.modifier_option_id)Нет — своя отдельная техкарта модификатора (modifier_tech_cards)
ПримерыРазмер пиццы, вид теста, объём напиткаДоп. сыр, сироп, соус, сливки

Правила:

  • binding_type задаётся при привязке, не на самой группе
  • Закреплённый модификатор: override_min_amount >= 1 (валидация)
  • Свободный модификатор: override_min_amount = 0 (default)
  • Максимум 1 structural группа на товар — ошибка STRUCTURAL_LIMIT_EXCEEDED при попытке добавить вторую (BUG-007)
  • Structural только для type=dish — ошибка STRUCTURAL_NOT_ALLOWED_FOR_GOOD для товаров (BUG-007)
  • Structural создаётся только как новый — привязка существующей группы как structural запрещена (STRUCTURAL_MUST_BE_NEW). На фронте кнопка ”+ Закреплённый” сразу открывает форму создания. (BUG-008)

Пример:

Маргарита:
  Закреплённые:
    Размер (1-1, structural) → per-option техкарты в табе "Техкарта"
  Свободные:
    Добавки (0-3, free) → в табе "Модификаторы"

Сырная тарелка:
  Закреплённые:
    Сыр (1-1, structural) → per-option техкарты
  Свободные:
    (нет)

Переиспользование

Одна группа → несколько товаров:

Маргарита: [Размер (1-1), Добавки (0-3)]
Пепперони: [Размер (1-1), Добавки (0-3)]
Бургер:    [Добавки (0-2)]  ← override max
Капучино:  [Молоко (1-1)]   ← другая группа

Назначить группу на продукты можно двумя способами:

  1. Со стороны продукта → Конструктор товара → “Добавить модификатор”
  2. Со стороны группы → ModifierViewPage → таб “Назначенные продукты” → массовая привязка по категориям

Per-product override

При привязке группы к товару можно переопределить min/max (не меняя глобальные значения группы). Пример: группа “Добавки” глобально max=3, но для бургера override max=2.

Создание зависимого модификатора со страницы продукта

Зависимый (structural) модификатор можно создать прямо со страницы продукта — пользователю не нужно уходить в справочник. При создании:

  1. Создаётся группа модификаторов типа single
  2. Автоматически привязывается к товару как structural

Это аналог поведения YUMA, где зависимые модификаторы создаются inline.


Связь с 1С через structural-опции

(Добавлено в BR 1.17)

Если франшиза интегрирована с 1С Общепит — у каждой опции structural-мода заполняется поле sku_1c (код номенклатуры 1С). При выгрузке чеков в 1С продажа Капучино с выбранной опцией «макси 300 мл» выгружается под кодом этой опции, а не «материнского» продукта.

В 1С каждая вариация — отдельная номенклатура со своим кодом. Опция structural-мода = одна номенклатурная позиция 1С.

Состояния продукта по связи с 1С

СостояниеУсловиеКак выгружается
Прямая связьproducts.sku начинается с 1c:Используется код из sku (без префикса)
Виртуальныйsku пуст, есть structural-мод с опциями имеющими sku_1cИспользуется sku_1c выбранной опции
Не привязанНи первое, ни второеВыгрузка падает с ошибкой CannotMapTo1C

Валидация

  • У всех опций structural-мода sku_1c должен быть заполнен (если продукт виртуальный).
  • При попытке сохранить опцию с пустым sku_1c у виртуального продукта → ошибка STRUCTURAL_OPTION_MISSING_SKU_1C.
  • Free-модификаторы — sku_1c опционально (поле есть впрок, в BR 1.17 не используется).

Pattern «N по M» для многомерных кейсов

Если в 1С разные комбинации измерений (Капучино × тип молока × объём) — каждая отдельная номенклатура. Отражаем как N виртуальных продуктов с M structural-опциями каждый (вместо одной матрицы):

Виртуальный «Капучино обычный» → structural «Объём» → 250 / 300 / 400 → 3 sku_1c
Виртуальный «Капучино соевый»  → structural «Объём» → 250 / 300 / 400 → 3 sku_1c
Виртуальный «Капучино овсяный» → structural «Объём» → 250 / 300 / 400 → 3 sku_1c

Покрывается полностью текущей BR 1.17 (ограничение «один structural на товар» остаётся в силе). Настоящая матрица — overkill, не реализуется.

Подробнее: 1С Общепит — общая архитектура интеграции, импорт каталога, выгрузка чеков.


Ролевая матрица

Франшиза (владелец бренда)

  • CRUD групп модификаторов и их опций (справочник)
  • Привязка/отвязка групп к товарам (конструктор товара)
  • Массовое назначение группы на продукты (со страницы группы)
  • Создание зависимых модификаторов прямо со страницы продукта
  • Per-product override min/max
  • Toggle статуса группы (active/inactive) прямо из списка

Франчайзи (партнёр)

  • Только просмотр модификаторов

Менеджер ТТ

  • Только просмотр

Кассир

  • Нет доступа в админке

Список групп модификаторов

Колонки

  • Название
  • Тип (Групповой / Простой)
  • Кол-во опций
  • Статус (кликабельный badge для Franchise — inline toggle active/inactive)

Фильтры

  • По типу
  • По статусу

Поиск

  • По названию

Пагинация

  • 20 записей на страницу

Карточка группы

  • Просмотр: все поля + inline-таблица опций + таб “Назначенные продукты”
  • Создание: форма полей группы + inline-таблица опций (добавить/убрать/изменить, стрелки ↑↓ для порядка)
  • Редактирование: все поля + статус (active/inactive). Изменения применяются мгновенно.

Таб “Назначенные продукты” (MOD-03/11)

На странице просмотра группы — таб показывает все продукты, к которым привязана группа:

  • Таблица: Продукт (ссылка) / Категория / Тип привязки (Зависимый/Свободный)
  • Кнопка “Назначить на продукты” (Franchise) → модалка с деревом категорий → чекбоксы продуктов → массовая привязка как free
  • Уже назначенные продукты отображаются как disabled в модалке

Таблица опций

Колонки: Название / Мин. / Макс. / По умолч. / Бесплат. / Акт. / Техкарта / Код 1С (BR 1.17, только для structural)

  • В формах создания/редактирования: inline-редактирование всех полей + стрелки ↑↓ для порядка
  • В просмотре: read-only таблица
  • Колонка «Код 1С» отображается только для групп с binding_type = structural, скрыта для free

Колонка “Техкарта” (BR 1.9.1)

(Добавлено в BR 1.9.1)

В таблице опций каждой группы модификаторов — колонка “Техкарта”:

  • Если техкарта есть → бейдж “Есть” (кликабельный)
  • Если нет → кнопка “Создать” (Franchise only)
  • Клик → модалка с таблицей ингредиентов (аналогично табу Техкарта в товаре, но без per-size)
  • Только для добавок (не для size-модификаторов)
  • Read-only для Franchisee/Manager

Техкарта опции привязана к modifier_option_id. Одна техкарта на опцию — переиспользуется для всех товаров, к которым привязана группа.


Связь с техкартами (BR 1.9, 1.9.1, 1.9.2)

(Обновлено в BR 1.9.1, BR 1.9.2)

Тип привязки определяет поведение модификатора при списании:

binding_typeТипПримерЧто делает при списанииГде техкарта
structuralРазмер25/30/35 смВыбирает вариант техкарты товараtech_cards (per-товар, modifier_option_id)
freeДобавкаДоп. сырДобавляет ингредиент к списаниюmodifier_tech_cards (per-модификатор) (BR 1.9.1)
freeЗаменаОвсяное молокоЗаменяет ингредиент в техкарте(Phase 2)

Рецептура модификатора — в Warehouse Service (BR 1.9), не в Catalog Service.


Что НЕ входит

  • Отображение модификаторов на POS — Phase 2
  • Фото опций модификаторов — Phase 2
  • Составные модификаторы (модификатор из модификаторов) — Phase 2+

Связи с другими модулями

  • Каталог — товары с привязанными модификаторами добавляются в каталог (read-only)
  • Прейскуранты — цена опции определяется прейскурантом (BR 1.10)
  • Техкарты (BR 1.9) — рецептуры модификаторов (Warehouse Service)
  • 1С Общепит (BR 1.17) — маппинг опций structural-мода к номенклатуре 1С через поле sku_1c

Ссылки