Перейти к основному содержимому

Событие перед записью свойств торговых предложений

На скриншоте указано для каких свойств вызывается событие:

image_1

Здесь видно, что это событие отличается от [onSetPropsForItem] тем, что вызывается в момент импорта характеристик модификаций МС в свойства торговых предложений БУС.

[OnSetSkuProps] Событие перед записью свойств торговых предложений​

Событие вызывается перед записью свойств торговых предложений. Позволяет модифицировать массив свойств, который будет передан в CIBlockElement::SetPropertyValuesEx().

Событие вызывается для каждой модификации — и при создании, и при обновлении, даже если модулю нечего записывать (arResultSku пуст). При создании оно вызывается и тогда, когда товар каталога для модификации создать не удалось. SetPropertyValuesEx() модуль вызывает, только если итоговый arResultSku непуст.

Как модуль читает ответ
  • Исключение из обработчика модуль не перехватывает — оно обрывает шаг импорта. Оборачивайте код в try/catch.
  • Параметры последнего обработчика, вернувшего EventResult::SUCCESS, целиком заменяют arResultSku. Ответы не сливаются: каждый обработчик получает исходный массив модуля.
  • EventResult::ERROR игнорируется. Чтобы ничего не записывать, верните SUCCESS с пустым массивом.
  • SUCCESS без параметров даёт null, который модуль передаёт в count() — на PHP 8 это TypeError. Всегда возвращайте полный массив, а если менять нечего — не возвращайте ничего.

Параметры события

ПараметрТипОписание
itemBxarrayЭлемент инфоблока Битрикс (торговое предложение)
itemMsobjectЭлемент из МойСклад (модификация)
propSkuListarrayМассив с параметрами свойств Битрикса
arResultSkuarrayМассив свойств для записи через CIblockElement::SetPropertyValuesEx()

Структура itemBx

// при создании торгового предложения — только:
[
'ID' => 1234,
'IBLOCK_ID' => 5,
]

// при обновлении — элемент из выборки модуля:
[
'ID' => 1234,
'IBLOCK_ID' => 5,
'NAME' => 'Товар (Красный, L)',
'XML_ID' => 'parentcode#abc123externalcode', // или без префикса родителя — зависит от настройки XML_ID модификаций
// ... CODE, ACTIVE, SORT, тексты и картинки
]

Доступ к характеристикам модификации МС (itemMs)

// Перебор характеристик модификации:
foreach ($itemMs->characteristics as $prop) {
$prop->id; // UUID характеристики в МС: '25f3a-...'
$prop->name; // Название: 'Цвет'
$prop->value; // Значение: 'Красный'
}

Структура propSkuList

[
'PROP_IDS' => [
'msCharUUID1' => 123, // UUID характеристики МС => ID свойства Битрикс
'msCharUUID2' => 456,
],
'PROP_TYPES' => [
123 => [
'TYPE' => 'S', // тип свойства, см. ниже
'PARAM' => '', // для E — ID привязанного инфоблока, для S:directory — TABLE_NAME HL-блока
],
456 => [
'TYPE' => 'L',
'PARAM' => '',
],
789 => [
'TYPE' => 'S:directory',
'PARAM' => 'b_hlbd_color', // TABLE_NAME HL-блока справочника
'HL_CLASS' => '...', // класс сущности HL-блока или null, если HL-блок не найден
],
],
'PROP_ENUMS' => [
'msCharUUID1' => [
'КРАСНЫЙ' => 15, // значение в верхнем регистре => ID значения списка / ID элемента / UF_XML_ID
'СИНИЙ' => 16,
],
'msCharUUID2' => [
'L' => 20,
'M' => 21,
'S' => 22,
],
],
]

Особенности propSkuList:

  • PROP_IDS — только характеристики, сопоставленные со свойствами поддерживаемых типов (S, N, L, E, S:directory).
  • PROP_TYPES — типы всех одиночных свойств S, L, N, E, F и множественных F инфоблока торговых предложений, а не только сопоставленных. Поэтому TYPE может быть и S:HTML, S:Date, S:DateTime, F, F:Multiple и т.п. Ключ HL_CLASS есть только у S:directory — у остальных его нет вовсе (а не null), проверяйте через isset()/!empty().
  • PROP_ENUMS — к моменту события модуль уже сам создал недостающие значения для характеристик этой модификации: значение списка (L), элемент привязанного инфоблока (E, ключ — NAME в верхнем регистре → ID), строку HL-блока (S:directory, UF_NAME в верхнем регистре → UF_XML_ID, где UF_XML_ID — транслит значения). Они уже есть в PROP_ENUMS и в arResultSku.
  • Если ни одна характеристика не сопоставлена со свойством поддерживаемого типа, propSkuList может прийти пустым массивом без ключей PROP_IDS, PROP_ENUMS, PROP_TYPES.

Структура arResultSku

[
123 => 'Красный', // строковое свойство
456 => 20, // ID значения списка
789 => 'red-xml-id', // UF_XML_ID для справочника
// ...
]

Возвращаемое значение

Верните EventResult::SUCCESS с модифицированным массивом $arResultSku. Этот массив будет передан в CIBlockElement::SetPropertyValuesEx().

return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arResultSku);