Appearance
Спецификации (BOM)
Спецификация (Bill of Materials) — состав изделия. Каждая строка BOM описывает: родительский объект содержит дочерний объект в определённом количестве. Развёртывая BOM сверху вниз, система получает полный перечень деталей и материалов для производства.
Как открыть
Боковое меню → Технология → Спецификации
Или: откройте технологический объект → вкладка «BOM»
Что на экране
Таблица BOM
| Столбец | Что показывает |
|---|---|
| Позиция | Номер строки в спецификации (position_number) |
| Родитель | Что содержит (parent_object) |
| Компонент | Что входит (child_object) |
| Количество | Сколько штук/метров/кг (quantity) |
| Единица | шт, м², м.п., кг, л (unit) |
| Активна | Используется ли строка |
Как это работает
Спецификация — это направленный ациклический граф (DAG). Каждая строка — ребро графа «родитель содержит потомка».
Пример: Шкаф-купе
Шкаф-купе (изделие)
├── Поз. 1: Корпус (сборка) × 1 шт
│ ├── Поз. 1: Боковина левая (деталь) × 1 шт
│ ├── Поз. 2: Боковина правая (деталь) × 1 шт
│ ├── Поз. 3: Полка (деталь) × 3 шт
│ ├── Поз. 4: Задняя стенка (деталь) × 1 шт
│ └── Поз. 5: Дно (деталь) × 1 шт
├── Поз. 2: Дверь раздвижная (сборка) × 2 шт
│ ├── Поз. 1: Рама (деталь) × 1 шт
│ └── Поз. 2: Вставка зеркальная (деталь) × 1 шт
└── Поз. 3: Фурнитура (комплект) × 1 штПри запуске заказа на 5 шкафов система рассчитает: 5 корпусов, 10 боковин левых, 10 правых, 15 полок, 10 дверей и т.д.
Поля строки BOM
| Поле | Обязательно | Описание |
|---|---|---|
| parent_object | Да | Что содержит (FK на TechnologicalObject) |
| child_object | Да | Что входит (FK на TechnologicalObject) |
| quantity | Да | Количество (десятичное, до 6 знаков: 1.560000 м²) |
| unit | Да | Единица измерения: шт, м², м.п., кг, л |
| position_number | Да | Номер позиции в спецификации |
| sort_order | Нет | Порядок отображения в UI (может отличаться от position_number) |
| notes | Нет | Заметки технолога |
Уникальность строки
Комбинация (parent_object, child_object, position_number) уникальна. Один компонент может входить в родителя несколько раз, но с разными номерами позиций.
Условные строки BOM
Иногда состав зависит от выбора клиента. Поле applicability_conditions определяет условия:
json
{
"onlyFor": {"modifier": "color", "value": "red"},
"skipIf": {"modifier": "finish", "value": "raw"}
}| Условие | Что означает |
|---|---|
| onlyFor | Строка включается только если модификатор имеет указанное значение |
| skipIf | Строка пропускается если модификатор имеет указанное значение |
Пример
Изделие «Стол» имеет две строки BOM для столешниц:
- Поз. 5: Столешница ЛДСП —
onlyFor: {modifier: "top_material", value: "ldsp"} - Поз. 6: Столешница МДФ —
onlyFor: {modifier: "top_material", value: "mdf"}
В заказ попадёт только одна из них, в зависимости от выбора клиента.
Наследование модификаторов
Поле modifier_application определяет, как модификаторы родителя передаются дочернему объекту:
| Режим | Описание | Когда использовать |
|---|---|---|
| inherit | Модификаторы родителя спускаются к потомкам | По умолчанию. Цвет шкафа = цвет всех деталей |
| override | Только собственные модификаторы дочернего | Задняя стенка всегда белая, независимо от цвета шкафа |
| combine | Объединение родительских и собственных | Деталь наследует цвет шкафа + добавляет свой тип кромки |
Наследование цвета
Если клиент заказал «Шкаф, цвет Вишня», при inherit все детали автоматически получат цвет Вишня. Задняя стенка с override останется белой, как задал технолог.
Формулы расчёта
Поле calculation_params позволяет задать формулы для автоматического расчёта количества:
json
{
"formula": "parent.width * 0.8",
"min": 0.5,
"max": 10
}Используется для материалов с расходом, зависящим от размеров родителя (кромка, клей, плёнка).
Привязка классификаторов к строке BOM
Через ResourcePropertySpecification технолог указывает, какой классификатор применяется к строке BOM:
| Поле | Описание |
|---|---|
| specification | К какой строке BOM привязан |
| classifier | Какой классификатор (Цвет, Толщина, Материал) |
| classifier_value | Конкретное значение (NULL если is_any_value = true) |
| is_any_value | True = значение определяется при заказе |
| sequence_order | Каскад фильтрации: 1 = материал, 2 = толщина, 3 = цвет |
Пример
Технолог описывает строку BOM «Боковина → ЛДСП»:
- Классификатор «Материал», значение = ЛДСП (фиксировано)
- Классификатор «Толщина», значение = 16мм (фиксировано)
- Классификатор «Цвет», is_any_value = true (определяется при заказе из серии)
При заказе: цвет выбирается из серии «Классика» — Дуб, Липа, Вишня.
Правила и ограничения
| Правило | Описание |
|---|---|
| Количество > 0 | Нулевое или отрицательное количество запрещено |
| Нет самоссылок | parent_object не может быть равен child_object |
| Деталь содержит только материалы | Деталь — минимальный неделимый элемент. Не может содержать другие детали, сборки или изделия |
| Нет циклов | Граф BOM ациклический: A → B → C, но C не может содержать A |
Создание строки BOM
- Откройте технологический объект → вкладка «BOM»
- Нажмите «Добавить компонент»
- Заполните:
| Поле | Обязательно | Описание |
|---|---|---|
| Компонент | Да | Выберите дочерний объект |
| Количество | Да | Сколько единиц |
| Единица | Да | шт, м², кг... |
| Позиция | Да | Номер позиции |
| Наследование | Нет | inherit / override / combine |
| Условия | Нет | Условные строки BOM |
- При необходимости привяжите классификаторы (ResourcePropertySpecification)
- Нажмите «Сохранить»
API
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /api/v1/specifications/ | Список всех строк BOM |
| POST | /api/v1/specifications/ | Создать строку BOM |
| GET | /api/v1/specifications/{id}/ | Детали строки BOM |
| PUT | /api/v1/specifications/{id}/ | Обновить строку |
| DELETE | /api/v1/specifications/{id}/ | Мягкое удаление |
| GET | /api/v1/resource-property-specifications/ | Привязки классификаторов к BOM |