Класс пожарной опасности здания как модель данных: почему один enum на здание — ошибка
Если вы делаете софт для эксплуатации зданий, CAFM или просто внутренний реестр объектов, рано или поздно в карточке здания появится поле «класс функциональной пожарной опасности» (Ф1.1…Ф5.3). Классы установлены статьёй 32 Федерального закона № 123-ФЗ, и от класса зависят требования к пожарной сигнализации, системе оповещения, эвакуационным путям и необходимость декларации пожарной безопасности. Разберём, как не заложить ошибку в саму модель данных.
Ошибка 1: класс — свойство здания
Первое желание — сделать так:
const building = { address: '…', fireClass: 'Ф4.3' }; Но реальные здания многофункциональны: офисный центр с магазином на первом этаже и складом в подвале, торговый центр с кинотеатром и фуд-кортом. Класс определяется для частей здания — пожарных отсеков или помещений, — и требования применяются к каждой части по её классу. Подобрать один «средний» класс на всё здание — ошибка и в нормах, и в модели.
const building = { address: '…', parts: [ { name: 'Офисы, 2–5 этажи', actualUse: 'office' }, { name: 'Магазин, 1 этаж', actualUse: 'shop' }, { name: 'Склад, подвал', actualUse: 'warehouse' }, ], }; Ошибка 2: класс хранится, а не вычисляется
Класс зависит от того, как часть здания фактически используется: кто в ней находится, ночуют ли там люди, могут ли они эвакуироваться самостоятельно, знакома ли им планировка. Сменился арендатор — бывший склад стал шоурумом с посетителями — и класс уже другой. Поэтому надёжнее хранить фактическое использование и вычислять класс из него:
const CLASS_BY_USE = { kindergarten: 'Ф1.1', nursingHome: 'Ф1.1', hospitalWard: 'Ф1.1', hotel: 'Ф1.2', dormitory: 'Ф1.2', apartmentBuilding: 'Ф1.3', house: 'Ф1.4', theatre: 'Ф2.1', cinema: 'Ф2.1', museum: 'Ф2.2', library: 'Ф2.2', shop: 'Ф3.1', cafe: 'Ф3.2', station: 'Ф3.3', clinic: 'Ф3.4', consumerServices: 'Ф3.5', gym: 'Ф3.6', bathhouse: 'Ф3.6', church: 'Ф3.7', school: 'Ф4.1', university: 'Ф4.2', office: 'Ф4.3', fireStation: 'Ф4.4', production: 'Ф5.1', lab: 'Ф5.1', warehouse: 'Ф5.2', parking: 'Ф5.2', // стоянка без техобслуживания и ремонта farm: 'Ф5.3', }; function classify(building) { const parts = building.parts.map(p => ({ ...p, fireClass: CLASS_BY_USE[p.actualUse] ?? null, // null — спорный случай, нужен специалист })); const classes = new Set(parts.map(p => p.fireClass)); return { parts, needsReview: classes.has(null), // Ф1.1 и Ф4.1 — одно из оснований для обязательной декларации пожарной безопасности declarationRequired: classes.has('Ф1.1') || classes.has('Ф4.1'), // для Ф5 дополнительно нужна категория помещений по взрывопожарной опасности needsCategory: [...classes].some(c => c?.startsWith('Ф5')), }; } Ошибка 3: таблица соответствий считается полной
Справочник выше покрывает типовые случаи, но на границах подклассов начинаются вопросы: помещение, где одновременно работают сотрудники и принимают посетителей (Ф3.5 или Ф4.3), учебный класс внутри торгового центра, апартаменты. Поэтому в модели полезно явно хранить признак «требует проверки» и не подставлять класс по умолчанию — тихий дефолт хуже пустого поля.
Итог
- Класс — свойство части здания, а не здания целиком.
- Храните фактическое использование, класс выводите из него и пересчитывайте при смене арендатора.
- Для неоднозначных случаев оставляйте флаг на ручную проверку.
Если нужно проверить конкретный объект вручную, есть бесплатный определитель класса функциональной пожарной опасности: он задаёт несколько вопросов о здании и показывает подкласс с обоснованием по статье 32. Для проекта итоговое решение принимает проектировщик.