Заказ хранит не только название и цену позиции, но и свойства товара — артикул, цвет, размер, единицу измерения. Чтобы они попали в состав заказа, менеджеру в админку и в печатные формы, нужно правильно настроить свойства корзины и понимать, как Битрикс копирует их в таблицу b_sale_basket_props.
Откуда в заказе берутся свойства товара
Важно различать два уровня. Есть свойства инфоблока каталога (или торговых предложений) — это карточка товара: артикул, бренд, цвет, размер. И есть свойства позиции корзины — снимок значений, который фиксируется в момент добавления товара в корзину и живёт независимо от карточки.
Когда покупатель кладёт товар в корзину, компонент каталога переносит выбранные свойства инфоблока в позицию корзины. При оформлении заказа эти значения сохраняются в таблице b_sale_basket_props (поля CODE, NAME, VALUE, SORT, CODE_ENUM_ID). Именно поэтому даже если позже поменять артикул в каталоге, в старом заказе останется то значение, которое было на момент покупки.
Настройка отображаемых свойств: PRODUCT_PROPERTIES
За набор свойств, которые уходят из каталога в корзину, отвечает связка компонентов. В карточке товара bitrix:catalog.element (и в компоненте добавления в корзину) есть параметр «Свойства товаров» — PRODUCT_PROPERTIES, а также OFFERS_CART_PROPERTIES для свойств торговых предложений. В нём вы отмечаете, например, ARTNUMBER, COLOR, SIZE.
В самой корзине bitrix:sale.basket.basket набор отображаемых свойств задаёт параметр COLUMNS_LIST и исторический PRODUCT_PROPS (в старых шаблонах — PRODUCT_PROPS_VARIABLE). Порядок настройки такой:
- убедитесь, что нужное свойство существует в инфоблоке и заполнено у товаров;
- в компоненте карточки/добавления в корзину включите его в
PRODUCT_PROPERTIES(для offer-свойств —OFFERS_CART_PROPERTIES); - в компоненте корзины проверьте, что свойство выводится в колонках (
COLUMNS_LIST) — это гарантирует, что оно уже присутствует в позиции; - оформите тестовый заказ и посмотрите состав.
Как свойства попадают в заказ программно
Если товар добавляется в корзину не стандартным компонентом, а кодом (импорт, быстрый заказ, кастомная кнопка), свойства нужно передать вручную. В ядре D7 это делается при создании позиции через массив PROPERTY_LIST:
$item = $basket->createItem('catalog', $productId); — затем к коллекции свойств позиции добавляются элементы методом getPropertyCollection()->setProperty() с ключами NAME, CODE, VALUE, SORT.
В старом API CSaleBasket::Add() свойства передавались отдельным массивом PROPS. Для точечной доработки удобно событие OnSaleBasketItemBeforeSaved — в нём можно дописать или очистить свойства позиции до сохранения заказа.
CODE— латинский код свойства, по нему потом фильтруют и выводят;NAME— человекочитаемая подпись в составе заказа и печатной форме;VALUE— само значение (для списочных свойств — текст, а не ID);SORT— порядок вывода среди свойств позиции.
Вывод свойств в админке заказа
В новой карточке заказа (Магазин → Заказы → Детали заказа) свойства позиции показываются в блоке состава под названием товара. Если менеджеру их не видно, проверьте три вещи:
- свойство реально сохранилось в
b_sale_basket_propsдля этой позиции (можно посмотреть запросом или через\Bitrix\Sale\Order::load()->getBasket()); - оно не отфильтровано служебным механизмом — Битрикс скрывает технические свойства с кодами вроде
CATALOG.XML_ID,PRODUCT.XML_ID,SUM_OF_CHARGE; - у менеджера есть право на просмотр детали заказа.
Для вывода дополнительной информации в списке позиций админки применяют событие OnAdminSaleOrderEdit или переопределяют шаблон детали заказа. Но в большинстве проектов достаточно того, что свойства уже пришли в заказ — они отображаются автоматически.
| Где смотреть | Что проверить |
|---|---|
| Деталь заказа | Блок под товаром: NAME: VALUE |
| Таблица БД | b_sale_basket_props по BASKET_ID |
| Код | getBasket()->getPropertyCollection() |
Свойства в печатных формах и письмах
Печатные формы (счёт, накладная) и почтовые шаблоны обращаются к тем же данным заказа. В шаблоне печати доступен массив позиций, где каждая содержит подмассив PROPS со свойствами. Чтобы вывести артикул в счёте, в цикле по товарам перебирают $item['PROPS'] и печатают нужный CODE:
Типовые печатные формы находятся в /bitrix/modules/sale/admin/ и переопределяются копированием в /bitrix/php_interface/ или через настройку шаблонов документов. Для писем свойства подставляются в шаблон уведомления магазина — там значения корзины уже собраны в тексте позиций заказа.
CODE. Так форма останется читаемой, а служебные свойства (XML_ID, вес, размеры упаковки) не засорят документ.Частые проблемы и как их решать
Разберём случаи, с которыми чаще всего приходят на доработку:
- Свойство есть в карточке, но нет в заказе. Не добавлено в
PRODUCT_PROPERTIESкомпонента добавления в корзину — из каталога оно просто не копируется. - В заказе ID вместо текста. Для списочных свойств в
VALUEнужно класть текстовое значение, а неENUM_ID; иначе менеджер видит число. - Свойство пропадает при повторной сборке корзины. Проверьте, не пересобирается ли позиция без передачи
PROPS— например, при обновлении цен обменом с 1С. - Технические свойства мешают. Скрывайте их в шаблоне по списку служебных кодов, а не удаляйте из БД — они нужны ядру.
Отдельная тонкость — обмен с 1С. При выгрузке заказов в учётную систему свойства корзины передаются в узле товара, поэтому важно, чтобы коды свойств совпадали с ожидаемыми в 1С. Рассинхрон кодов — типовая причина, по которой артикул «теряется» на стороне учёта.
Итог
Вывод свойств товара в заказе — это цепочка: заполненное свойство инфоблока → включение его в PRODUCT_PROPERTIES корзины → фиксация в b_sale_basket_props при оформлении → автоматический показ в админке, печатных формах и письмах. В 90% случаев достаточно аккуратной настройки компонентов, без правки шаблонов. Кастомный код нужен там, где товар кладётся в корзину нестандартно или где печатную форму надо привести к виду документооборота.
Мы в B2Bsite настраиваем состав заказа так, чтобы менеджер видел артикул и характеристики сразу, а печатные формы и обмен с 1С получали корректные коды свойств. Если свойства «теряются» между корзиной, заказом и учётной системой — поможем найти разрыв и закрыть его без переделки каталога.
Частые вопросы
В каком параметре корзины настраиваются свойства товара?
За перенос свойств из каталога отвечает параметр PRODUCT_PROPERTIES (для торговых предложений — OFFERS_CART_PROPERTIES) в компоненте карточки и добавления в корзину. В самой корзине набор колонок задаёт COLUMNS_LIST.
Где физически хранятся свойства позиции заказа?
В таблице b_sale_basket_props, привязанной к позиции корзины через BASKET_ID. Там лежат поля CODE, NAME, VALUE и SORT — это зафиксированный снимок на момент оформления.
Почему свойство есть в карточке товара, но не появляется в заказе?
Чаще всего оно не добавлено в PRODUCT_PROPERTIES компонента добавления в корзину, поэтому не копируется в позицию. Второй вариант — у конкретного товара это свойство просто не заполнено.
Как добавить свойство к позиции корзины программно?
В D7 через коллекцию свойств позиции: getPropertyCollection()->setProperty() с ключами NAME, CODE, VALUE, SORT. В старом API — массив PROPS при вызове CSaleBasket::Add().
Почему в составе заказа виден ID вместо текста свойства?
Для списочных свойств в VALUE нужно передавать текстовое значение, а не ENUM_ID элемента списка. Если положили число, менеджер и увидит число.
Как вывести артикул только в печатной форме счёта?
В шаблоне печати переберите массив PROPS каждой позиции и выведите нужный CODE, отфильтровав остальные. Так документ не засорится служебными свойствами.
Какие свойства Битрикс считает служебными?
Технические коды вроде CATALOG.XML_ID, PRODUCT.XML_ID, SUM_OF_CHARGE ядро использует для своих нужд. Их не удаляют из БД, а скрывают в шаблонах вывода.
Влияют ли свойства корзины на обмен с 1С?
Да, при выгрузке заказа свойства передаются в узле товара. Важно, чтобы коды свойств совпадали с ожидаемыми в 1С, иначе артикул или характеристики теряются на стороне учёта.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.