Модификаторы
Источник требований
Модификаторы позволяют кастомизировать товар при заказе: выбрать размер, добавить соус, убрать ингредиент. Группа модификаторов — самостоятельная сущность в справочнике. Привязывается к товару (в конструкторе товара), не к каталогу. Изменения применяются мгновенно (без версионности). (Обновлено в BR 1.8.1)
Группа модификаторов
Самостоятельная сущность. Создаётся один раз в справочнике, переиспользуется между товарами в каталоге.
Поля группы
| Поле | Обязательность | Описание |
|---|---|---|
| Название | Обязательно | ”Выберите размер”, “Добавки”, “Соусы” |
| Тип | Обязательно | group (выбор из нескольких опций) / single (одиночный модификатор) |
| minAmount | Обязательно | Минимальное кол-во опций для выбора (default 0) |
| maxAmount | Обязательно | Максимальное кол-во опций (default 1) |
| Статус | Обязательно | active / inactive (default active) |
Примеры min/max
| min | max | Поведение |
|---|---|---|
| 1 | 1 | Обязательный единственный выбор (размер пиццы) |
| 0 | 3 | Необязательный, до 3 добавок |
| 0 | 1 | Необязательный, одна опция (простой модификатор) |
Опции
Опции — элементы внутри группы.
| Поле | Обязательность | Описание |
|---|---|---|
| Название | Обязательно | ”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.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)] ← другая группа
Назначить группу на продукты можно двумя способами:
- Со стороны продукта → Конструктор товара → “Добавить модификатор”
- Со стороны группы → ModifierViewPage → таб “Назначенные продукты” → массовая привязка по категориям
Per-product override
При привязке группы к товару можно переопределить min/max (не меняя глобальные значения группы). Пример: группа “Добавки” глобально max=3, но для бургера override max=2.
Создание зависимого модификатора со страницы продукта
Зависимый (structural) модификатор можно создать прямо со страницы продукта — пользователю не нужно уходить в справочник. При создании:
- Создаётся группа модификаторов типа
single - Автоматически привязывается к товару как
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)
Тип привязки определяет поведение модификатора при списании:
| 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