Документация

Свойства: поиск и создание

Свойства ищет, создаёт и переносит между инфоблоками сам DevBx\Core\Iblock. Здесь работает собственный кэш: свойства инфоблока читаются один раз за запрос, и у типов «список» и «привязка к элементу» дополнительно собирается карта «значение в нижнем регистре — номер».

Поиск

php
use DevBx\Core\Iblock;

$property = Iblock::findPropByCode($iblockId, 'COLOR');   // код или номер
$property = Iblock::findPropByName($iblockId, 'Цвет');    // название

Регистр не важен в обоих случаях. Не нашли — false. Возвращается массив свойства, а не объект; объектная обёртка — в IblockProperties.

Методы Iblock::getPropertyByCode и Iblock::getEnumValuesForProperty помечены @deprecated. Вместо них берите IblockProperties.

Создание

php
$property = Iblock::addProperty([
    'IBLOCK_ID' => $iblockId,
    'NAME' => 'Цвет',
    'PROPERTY_TYPE' => 'L',
]);

addProperty возвращает массив свойства — созданного или уже существовавшего. Правила, по которым он достраивает поля:

  • кода нет — соберёт транслитерацией из названия;
  • код приводится к верхнему регистру и обрезается до 50 знаков;
  • код из одних цифр получает префикс P_: чисто числовой код Битрикс принял бы за номер;
  • тип по умолчанию — S, строка;
  • сортировка — на сотню больше самой большой в инфоблоке;
  • активность — Y.

Бросает SystemException, если не передан номер инфоблока, если название пустое и если Битрикс отказался создавать свойство.

Есть более простой вариант — addPropertyIfNotExists($arFields). Он ищет только по полю CODE и возвращает номер свойства, а не массив; при отказе отдаёт false, а не бросает исключение. Две разные подписи у похожих методов — повод не перепутать, что именно вы присваиваете.

Перенос свойств между инфоблоками

php
Iblock::copyIblockProperties($sourceIblockId, $targetIblockId);
Iblock::copyIblockProperties($sourceIblockId, $targetIblockId, ['XML_ID', 'CODE']);
Iblock::copyIblockProperties($sourceIblockId, $targetIblockId, 'CODE', ['ACTIVE' => 'Y']);

Переносит описания свойств и, для списков, сами значения — по внешнему коду XML_ID, поэтому повторный запуск не плодит дубли. Существующие свойства не трогаются.

  • Третий аргумент — поле или список полей, по которым свойство ищется в приёмнике. Первое совпадение выигрывает.
  • Четвёртый — фильтр по свойствам источника.
  • Нет инфоблока-приёмника — SystemException.

Учтите при своём наборе полей сравнения. Проверка «код уже занят другим свойством» в этом методе не срабатывает: в её фильтре стоит COPDE вместо CODE. Пока в списке сравнения есть CODE, это незаметно — свойство находится раньше. Если сравнивать только по XML_ID, свойство с занятым кодом дойдёт до создания, и SystemException бросит уже сам Битрикс.