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

Свойства-списки - значения, сортировка, значение по умолчанию

Разбираемся со свойствами типа «список»: где живут значения, как задать их порядок и почему фильтр по названию ничего не находит.

Решение

Читаем справочник значений свойства:

$res = CIBlockPropertyEnum::GetList(['SORT' => 'ASC'], ['PROPERTY_ID' => $propId]);
while ($value = $res->Fetch()) {
printf("%-6s %-20s код=%-12s сорт=%-4s умолч=%s\n",
$value['ID'], $value['VALUE'], $value['XML_ID'],
$value['SORT'], $value['DEF']);
}

У каждого значения три разных идентификатора: числовой, символьный код и сам текст. В выборках элементов сравнивается числовой, и это первая причина пустого результата при фильтре по знакомому названию.

Добавляем значения списку:

CIBlockPropertyEnum::Add([
'PROPERTY_ID' => $propId,
'VALUE' => 'Хлопок',
'XML_ID' => 'COTTON', // символьный код: по нему идёт связь с 1С
'SORT' => 100,
'DEF' => 'N',
]);

Символьный код значения важнее, чем кажется: по нему обмен сопоставляет значения с характеристиками учётной системы. Значения без кодов при каждой выгрузке создаются заново, и справочник обрастает дублями.

Меняем порядок значений:

CIBlockPropertyEnum::Update($enumId, ['SORT' => 50]);
// порядок в форме редактирования, в фильтре и в выпадающем списке - один и тот же

Сортировка значений задаётся здесь и нигде больше. Алфавитный порядок в интерфейсе означает, что у всех значений одинаковая сортировка, а не что платформа сортирует их по названию.

Убираем значение по умолчанию:

CIBlockPropertyEnum::Update($enumId, ['DEF' => 'N']);
// флаг живёт у значения: у свойства такой настройки нет

Значение по умолчанию подставляется в форму нового элемента. Убирают его именно у значения, а не в настройках свойства, и это регулярно ищут не там.

Фильтруем элементы по значению списка:

$res = CIBlockElement::GetList([], [
'IBLOCK_ID' => 5,
'PROPERTY_MATERIAL' => $enumId, // числовой идентификатор значения
], false, false, ['ID', 'NAME', 'PROPERTY_MATERIAL']);
// в фильтр идёт идентификатор значения, а не его текст: текст ничего не найдёт

В фильтре сравнивается идентификатор, а не текст значения. Текст ищут только через отдельную выборку по справочнику: сначала находят идентификатор, потом фильтруют элементы.

Значения справочника принадлежат конкретному свойству конкретного инфоблока. Два инфоблока с одинаковым по смыслу списком держат два независимых набора значений, и общего справочника у них нет. Там, где список действительно общий, его выносят в highload-блок и подключают свойством-привязкой.

Удаление значения из справочника не чистит его у элементов автоматически. Ссылки на удалённое значение остаются и выглядят пустыми, поэтому перед удалением значение сначала снимают у элементов, а потом убирают из справочника.

Типичные проблемы

Фильтр по названию значения ничего не находит.

В условии сравнивается идентификатор значения, а не его текст. Название сначала переводят в идентификатор выборкой по справочнику.

Значения в списке идут не в том порядке.

У всех значений одинаковая сортировка. Порядок задаётся полем сортировки у каждого значения отдельно.

В новом элементе заранее выбрано значение.

У одного из значений стоит флаг «по умолчанию». Снимают этот признак у самого значения, а не в настройках свойства.

После обмена в справочнике появились дубли.

У значений нет символьных кодов. Обмен не находит соответствия и создаёт новые значения при каждой новой выгрузке.

У элементов пустое свойство после чистки справочника.

Значение удалили, не сняв его у элементов. Ссылка осталась и указывает в никуда.

Частые вопросы

Чем список отличается от привязки к highload-блоку?

Список хранит значения внутри свойства и принадлежит одному инфоблоку. Highload-блок - отдельная таблица, общая для всех, и в ней у значения бывают свои поля.

Можно ли сделать значения общими для двух инфоблоков?

Штатным списком нет: справочник принадлежит свойству. Общий набор значений держат в highload-блоке или в отдельном инфоблоке с привязкой.

Как перенести значения между свойствами?

Своим скриптом: читают справочник исходного свойства и создают значения у целевого с теми же кодами. Значения у элементов переставляют отдельно.

Почему множественное свойство-список плохо подходит для выбора товара?

Торговые предложения строятся по одиночным значениям: одно сочетание - одно предложение. Множественный список ломает эту логику.

Смежное

Первоисточник