Дата последнего изменения: 03.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' ] ] );