В 1С-Битрикс нет встроенного типа свойства «группированное свойство», которое бы объединяло несколько других свойств в одно. Однако существует несколько способов реализовать такую функциональность. Ниже описаны основные подходы.
1. Свойство типа «Справочник» (UserType: directory) с Highload-блоком
Самый популярный способ сгруппировать несколько полей в одном свойстве. Создаётся Highload-блок с несколькими пользовательскими полями (UF_...), а в инфоблоке создаётся свойство с типом directory, которое привязывается к этому Highload-блоку.
Шаг 1. Создайте Highload-блок через админку
Контент > Highload-блоки > Добавить Highload-блок, например, с названием «Характеристики товара» и таблицей b_product_features.
Шаг 2. Добавьте в него пользовательские поля
В настройках Highload-блока создайте поля, которые хотите «сгруппировать», например:
UF_NAME(строка) — название характеристики;UF_VALUE(строка) — значение;UF_UNIT(строка) — единица измерения;UF_SORT(число) — сортировка.
Шаг 3. Создайте свойство инфоблока типа «Справочник»
$property = new \CIBlockProperty;
$result = $property->Add([
'IBLOCK_ID' => $iblockId,
'NAME' => 'Характеристики',
'CODE' => 'FEATURES',
'PROPERTY_TYPE' => 'S',
'USER_TYPE' => 'directory',
'MULTIPLE' => 'N',
'USER_TYPE_SETTINGS' => [
'TABLE_NAME' => 'b_product_features',
],
]);
if (!$result)
{
throw new \Exception($property->getLastError()->getMessage());
}
Шаг 4. Заполните Highload-блок данными и укажите UF_XML_ID
Значение свойства хранит UF_XML_ID записи из Highload-блока:
$element = \Bitrix\Iblock\Elements\ElementCatalogTable::createObject()
->setName('Товар')
->set('FEATURES', 'feature_xml_id'); // UF_XML_ID записи
$element->save();
2. Множественное свойство с описанием (WITH_DESCRIPTION)
Если нужно хранить несколько пар «значение + описание», включите параметр WITH_DESCRIPTION = 'Y'. Это доступно для типов S (строка), N (число) и F (файл).
$property = new \CIBlockProperty;
$result = $property->Add([
'IBLOCK_ID' => $iblockId,
'NAME' => 'Дополнительные данные',
'CODE' => 'EXTRA_DATA',
'PROPERTY_TYPE' => 'S',
'MULTIPLE' => 'Y',
'WITH_DESCRIPTION' => 'Y', // добавляет описание к каждому значению
]);
if (!$result)
{
throw new \Exception($property->getLastError()->getMessage());
}
При сохранении элемента передавайте массив с ключами VALUE и DESCRIPTION:
$element->set('EXTRA_DATA', [
['VALUE' => '120', 'DESCRIPTION' => 'Вес, г'],
['VALUE' => '15', 'DESCRIPTION' => 'Размер, см'],
]);
3. Создание собственного пользовательского типа свойства (UserType)
Самый гибкий подход — написать свой класс пользовательского типа свойства. Он позволяет отобразить в форме редактирования элемента несколько полей ввода, а в БД сохранить всё как сериализованную строку.
Пример структуры файла /local/php_interface/classes/prop_grouped.php:
class CIBlockPropertyGrouped
{
// Возвращает описание типа
public function GetUserTypeDescription()
{
return [
'PROPERTY_TYPE' => 'S',
'USER_TYPE' => 'GROUPED',
'DESCRIPTION' => 'Группированное свойство',
'GetPropertyFieldHtml' => [__CLASS__, 'GetPropertyFieldHtml'],
'GetAdminListViewHTML' => [__CLASS__, 'GetAdminListViewHTML'],
'ConvertToDB' => [__CLASS__, 'ConvertToDB'],
'ConvertFromDB' => [__CLASS__, 'ConvertFromDB'],
];
}
// HTML для формы редактирования
public static function GetPropertyFieldHtml($arProperty, $value, $controlName)
{
$html = '';
$html .= 'Поле 1: <input type="text" name="' . $controlName . '[FIELD1]" value="' . htmlspecialcharsbx($value['FIELD1']) . '"><br>';
$html .= 'Поле 2: <input type="text" name="' . $controlName . '[FIELD2]" value="' . htmlspecialcharsbx($value['FIELD2']) . '"><br>';
$html .= 'Поле 3: <input type="text" name="' . $controlName . '[FIELD3]" value="' . htmlspecialcharsbx($value['FIELD3']) . '">';
return $html;
}
// Преобразование для БД
public static function ConvertToDB($arProperty, $value)
{
return ['VALUE' => serialize($value)];
}
// Преобразование из БД
public static function ConvertFromDB($arProperty, $value)
{
return ['VALUE' => unserialize($value)];
}
// Отображение в списке
public static function GetAdminListViewHTML($arProperty, $value, $controlName)
{
$data = unserialize($value['VALUE']);
return htmlspecialcharsbx($data['FIELD1'] . ', ' . $data['FIELD2']);
}
}
Зарегистрируйте тип в файле init.php:
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
// Регистрируем пользовательский тип
AddEventHandler('iblock', 'OnIBlockPropertyBuildList', ['CIBlockPropertyGrouped', 'GetUserTypeDescription']);
После регистрации при создании свойства в админке в списке USER_TYPE появится пункт «Группированное свойство».
4. Множественное свойство (MULTIPLE = 'Y')
Если нужно просто хранить несколько значений одного типа в одном свойстве, используйте параметр MULTIPLE = 'Y':
$property = new \CIBlockProperty;
$result = $property->Add([
'IBLOCK_ID' => $iblockId,
'NAME' => 'Теги',
'CODE' => 'TAGS',
'PROPERTY_TYPE' => 'S',
'MULTIPLE' => 'Y',
]);
Рекомендация: Для большинства бизнес-задач, где требуется «группированное свойство» (например, «Характеристики: название + значение + единица измерения»), оптимальным решением является свойство типа «Справочник» с Highload-блоком (вариант 1). Этот подход поддерживает фильтрацию, хорошо масштабируется и не требует написания кастомного кода. Если же нужна полностью уникальная логика ввода и отображения — создавайте собственный UserType (вариант 3).