Дата последнего изменения: 11.09.2025
За работу с пользовательскими полями отвечают классы CUserTypeEntity в старом ядре и UserField в D7.
Класс UserFieldTable применяют для простого доступа к существующим данным. Для изменения записей надо использовать CUserTypeEntity.
/**
* Добавление пользовательского свойства
*/
$userTypeEntity = new CUserTypeEntity();
$userFields = [
/*
* Идентификатор сущности, к которой будет привязано свойство.
* Для секция формат следующий - IBLOCK_{IBLOCK_ID}_SECTION
*/
'ENTITY_ID' => 'IBLOCK_3_SECTION',
/* Код поля. Всегда должно начинаться с UF_ */
'FIELD_NAME' => 'UF_DEV2DAY_FIELD',
/* Указываем, что тип нового пользовательского свойства строка */
'USER_TYPE_ID' => 'string',
/*
* XML_ID пользовательского свойства.
* Используется при выгрузке в качестве названия поля
*/
'XML_ID' => 'XML_ID_DEV2DAY_FIELD',
/* Сортировка */
'SORT' => 500,
/* Является поле множественным или нет */
'MULTIPLE' => 'N',
/* Обязательное или нет свойство */
'MANDATORY' => 'N',
/*
* Показывать в фильтре списка. Возможные значения:
* не показывать = N, точное совпадение = I,
* поиск по маске = E, поиск по подстроке = S
*/
'SHOW_FILTER' => 'N',
/*
* Не показывать в списке. Если передать какое-либо значение,
* то будет считаться, что флаг выставлен.
*/
'SHOW_IN_LIST' => '',
/*
* Пустая строка разрешает редактирование.
* Если передать какое-либо значение, то будет считаться,
* что флаг выставлен.
*/
'EDIT_IN_LIST' => '',
/* Значения поля участвуют в поиске */
'IS_SEARCHABLE' => 'N',
/*
* Дополнительные настройки поля (зависят от типа).
* В нашем случае для типа string
*/
'SETTINGS' => [
/* Значение по умолчанию */
'DEFAULT_VALUE' => '',
/* Размер поля ввода для отображения */
'SIZE' => '20',
/* Количество строчек поля ввода */
'ROWS' => '1',
/* Минимальная длина строки (0 - не проверять) */
'MIN_LENGTH' => '0',
/* Максимальная длина строки (0 - не проверять) */
'MAX_LENGTH' => '0',
/* Регулярное выражение для проверки */
'REGEXP' => '',
],
/* Подпись в форме редактирования */
'EDIT_FORM_LABEL' => [
'ru' => 'Пользовательское свойство',
'en' => 'User field',
],
/* Заголовок в списке */
'LIST_COLUMN_LABEL' => [
'ru' => 'Пользовательское свойство',
'en' => 'User field',
],
/* Подпись фильтра в списке */
'LIST_FILTER_LABEL' => [
'ru' => 'Пользовательское свойство',
'en' => 'User field',
],
/* Сообщение об ошибке (не обязательное) */
'ERROR_MESSAGE' => [
'ru' => 'Ошибка при заполнении пользовательского свойства',
'en' => 'An error in completing the user field',
],
/* Помощь */
'HELP_MESSAGE' => [
'ru' => '',
'en' => '',
],
];
$userFieldId = $userTypeEntity->Add( $userFields ); // int
При удачном добавлении свойства в переменную $userFieldId будет возвращен идентификатор нового пользовательского свойства.
Для создания пользовательских полей других типов замените значение USER_TYPE_ID:
$enumField = new CUserFieldEnum(); $addEnum = []; //мы передаем массив, который состоит из таких элементов (наличие n в ключе обязательно) $addEnum['n'.$i] = [ 'XML_ID' => $key,//xml_id 'VALUE' => $value,//значение 'DEF' => 'N',//по умолчанию 'SORT' => $i*10//сортировка ]; $enumField->SetEnumValues($newID, $addEnum);
При обновлении пользовательского свойства накладываются ограничения на изменение его типа (USER_TYPE_ID), объекта привязки (ENTITY_ID), кода поля (FIELD_NAME). Это связано с возможными ошибками связей значений и сущностей. Если необходимо изменить одно из этих полей, то нужно сначала создать новое пользовательское свойство, привязать все значения к нему, а затем удалить старое свойство.
Пример обновления пользовательского свойства:
$userTypeEntity->Update( $userFieldId, [ 'MANDATORY' => 'Y', ] ); // boolean;
В примере установлено требование обязательности заполнения поля.
Необходимо передать идентификатор пользовательского поля:
$userTypeEntity->Delete( $userFieldId ); // CDBResult
Добавление и обновление реализовано также через класс CUserTypeManager и метод Update.
global $USER_FIELD_MANAGER;
$section = CIBlockSection::GetList( [], [
'IBLOCK_CODE' => 'shop_news',
'CODE' => 'test_section',
])->Fetch();
if( !$section ) {
throw new Exception( 'Секция не найдена' );
}
$USER_FIELD_MANAGER->Update( 'IBLOCK_3_SECTION', $section['ID'], [
'UF_DEV2DAY_FIELD' => 'updated value'
] ); // boolean
В случае успешного обновления метод вернет true.
Если необходимо добавить пользовательское свойство к разделу инфоблока через механизм Битрикс-API, нужно использовать следующий код с вариациями:
$userField = new CUserTypeEntity;
$userField->Add(
[
'ENTITY_ID' => 'IBLOCK_2_SECTION',
'FIELD_NAME' => 'UF_TITLE',
'USER_TYPE_ID' => 'string',
'EDIT_FORM_LABEL' => [
'ru'=>'заголовок',
'en'=>'title'
]
]
);