Свойства-списки - значения, сортировка, значение по умолчанию
Разбираемся со свойствами типа «список»: где живут значения, как задать их порядок и почему фильтр по названию ничего не находит.
Решение
Читаем справочник значений свойства:
$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-блоке или в отдельном инфоблоке с привязкой.
Как перенести значения между свойствами?
Своим скриптом: читают справочник исходного свойства и создают значения у целевого с теми же кодами. Значения у элементов переставляют отдельно.
Почему множественное свойство-список плохо подходит для выбора товара?
Торговые предложения строятся по одиночным значениям: одно сочетание - одно предложение. Множественный список ломает эту логику.
Смежное
- Свойства инфоблоков - оглавление подтемы
- Значение свойства не сохраняется: разбор причин - почему вариант списка не записывается
- Свойства инфоблока: чтение, запись и фильтрация по значению - основы работы со свойствами
- Теги и облако тегов: включение, ввод, вывод, поиск по тегу - свободные теги вместо строгого списка
- Множественные свойства: вывод файлов, фильтр, удаление значений - наборы значений
- Инфоблоки - устройство хранилища целиком
- Подборки товаров: новинки, хиты и акции на витрине - свойства-метки на практике
- Дата, число и HTML в свойствах: хранение, вывод, фильтр - соседние типы значений и их хранение
- Поля документа в процессе: списки, файлы, запись обратно - ключи значений в бизнес-процессах