Разработчику: артикул из комбинации параметров
Частая задача модульного производства: цена назначается за уникальный артикул, а артикул — это уникальное сочетание параметров. Например:
- корпус модуля (с полками и начинкой): артикул =
модуль+размер модуля+цвет корпуса; - фасад: артикул =
фрезеровка+размер+декор.
В этой статье — как реализовать это из custom.js. Базу читайте в «Основах кастомизации» и «Спецификации и артикулах».
Каждую позицию спецификации можно перехватить в хуке after_create_spec_item(type, obj, ctx, spec) и:
- собрать собственный артикул (
spec.code) из параметров объекта; - записать тот же ключ в
spec.sum_key, чтобы одинаковые комбинации объединялись, а разные — считались отдельно; - при необходимости подставить цену под этот артикул (например, из вашей таблицы или прайс-листа по артикулу).
Где взять параметры. Тип/размеры/материалы объекта лежат в
obj.userData— вparams(заданные значения) иcomputed(вычисленные). Поля ниже взяты из реального кода сцены; перед использованием залогируйте объект (console.log(obj.userData)), чтобы убедиться в наличии нужных полей в вашей версии.
Корпус модуля: модуль + размер + цвет
Заголовок раздела «Корпус модуля: модуль + размер + цвет»Для корпуса релевантны позиции типа wall (материал корпуса) или module (модуль целиком). Полезные параметры:
- модуль:
obj.userData.params.spec.element_type,obj.userData.params.spec.id, вычисленныеcomputed.code/computed.name; - размер:
obj.userData.params.spec.size{x, y, z}(или размер выбранного варианта); - цвет/материал корпуса: у позиции
wall—material.code/variant.codeвыбранного материала корпуса.
Пример — собрать артикул корпуса как «модуль + размер + цвет»:
document.addEventListener('PP_ready', function (e) { const pp = e.detail.pp;
pp.events.cabinet.after_create_spec_item = function (type, obj, ctx, spec) { if (type === 'wall') { // параметры модуля-владельца const mp = obj.userData?.params?.spec || {}; const moduleId = mp.element_type ? (mp.element_type + ':' + mp.id) : 'mod'; const size = mp.size || {}; const sizeKey = Math.round(size.x || 0) + 'x' + Math.round(size.z || 0); // цвет/материал корпуса — из самой позиции const colorCode = spec.material_code || spec.variant_code || 'mat';
// собственный уникальный артикул spec.code = [moduleId, sizeKey, colorCode].join('-'); // развести/объединить позиции по этому ключу spec.sum_key = spec.code;
// при необходимости — своя цена под этот артикул // spec.price = myPriceTable[spec.code] || spec.price; } };});Так каждый уникальный набор «модуль + размер + цвет корпуса» станет отдельной строкой спецификации со своим артикулом; одинаковые наборы сложатся в одну позицию с суммарным количеством.
Фасад: фрезеровка + размер + декор
Заголовок раздела «Фасад: фрезеровка + размер + декор»Для фасада перехватывайте тип facade. Полезные параметры (в obj.userData.computed):
- фрезеровка (тип фасада):
computed.type_ind— индекс/ключ типа фрезеровки (глухой/витрина/решётка/…); - размер:
computed.size.x,computed.size.y; - декор: выбранный материал лицевой стороны —
mat = pp.libs.decors.find_item(<id выбранного декора>), артикул декора =mat.code(в позиции он уже есть какspec.mat_code).
Пример:
pp.events.cabinet.after_create_spec_item = function (type, obj, ctx, spec) { if (type === 'facade') { const c = obj.userData?.computed || {}; const frez = c.type_ind != null ? String(c.type_ind) : 'frez'; const w = Math.round((c.size && c.size.x) || spec.size_x || 0); const h = Math.round((c.size && c.size.y) || 0); const decor = spec.mat_code || 'decor';
spec.code = [frez, w + 'x' + h, decor].join('-'); spec.sum_key = spec.code;
// spec.price = myFacadePrices[spec.code] || spec.price; }};Уже есть штатный аналог для фасадов. В редакторе фасада есть вкладка «Точные размеры фасадов» — это встроенная «цена за комбинацию декор + тип фрезеровки + точный размер» с собственным артикулом, без кода. Если вам хватает фиксированных размеров — используйте её. Программный путь через
after_create_spec_itemнужен, когда правило сложнее или требуется единая логика для корпуса и фасада сразу.
Подстановка цены под артикул
Заголовок раздела «Подстановка цены под артикул»Цену можно:
- взять из вашей таблицы прямо в коде (как
myPriceTable[spec.code]выше); - или вести в прайс-листе позиции с этими артикулами и подтягивать стандартным механизмом «цена по артикулу» — тогда достаточно, чтобы
spec.codeсовпадал с артикулом в прайсе.
Второй путь удобнее: цены меняются в прайс-листе без правки кода.
Проверка
Заголовок раздела «Проверка»- Добавьте на сцену модуль, поменяйте размер и цвет корпуса — убедитесь, что артикул в спецификации меняется.
- Проверьте, что одинаковые комбинации объединяются в одну строку, а разные — раздельны.
- Сформируйте PDF и Excel — артикулы и цены должны совпадать с экраном (данные общие).
Коротко
Заголовок раздела «Коротко»Уникальный артикул из параметров собирается в хуке after_create_spec_item: читаете параметры объекта (obj.userData.params/computed), формируете spec.code и spec.sum_key из нужной комбинации (модуль+размер+цвет для корпуса; фрезеровка+размер+декор для фасада) и при желании задаёте spec.price. Для фасадов с фиксированными размерами есть штатная вкладка «Точные размеры фасадов». Цену удобно держать в прайс-листе и подтягивать по совпадению артикула.