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

Поля универсального списка - типы, обязательность и сортировка

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

Решение

Открываем настройку полей списка:

Настроить список - вкладки «Настройки», «Подписи», «Доступ»
Настроить поля - типы, обязательность, сортировка
Настроить бизнес-процессы - маршруты над записями, если процессы включены
Показать разделы - переключение видимости иерархии
Экспорт в Excel - выгрузка данных списка на проверку

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

Подбираем тип под характер данных:

Строка - однострочное значение: код, телефон, номер приказа
Число - количество, сумма, вес
Список - выбор из заранее заданных вариантов
Дата/Время - дата и время события
HTML/текст - форматированный или простой текст
Файл - загрузка файла: скан, вложение
Видео - ролик
Счетчик - служебный счётчик
Привязка к разделам - раздел инфоблока
Привязка к элементам - записи другого списка или инфоблока
Привязка к элементам в виде списка - то же, но выводится списком
Привязка к сотруднику - ответственный, автор, согласующий

Типов ровно двенадцать, и набор параметров у каждого свой. Единого набора опций не существует, а смена типа перезагружает форму вместе с настройками поля.

Заполняем форму «Добавить поле»:

Название - «Организационная форма»
Обязательное - флаг обязательности заполнения
Множественное - несколько значений в одном поле
Значение по умолчанию - доступно только обязательному полю
Сортировка - положение поля в форме записи
Показывать - показ поля в форме записи
Только для чтения - режим без возможности изменения
Показать поле при формировании ссылки - вывод в богатых ссылках

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

Расставляем порядок полей:

100 - «Организационная форма»
200 - «ИНН»
300 - «Ответственный»
// поля идут по возрастанию: 100 окажется первым, 300 последним

Шаг в сотню оставляет место для вставки поля между соседними. Без запаса новое поле в середине формы потребует пересортировки всех соседей. Формулировку интерфейса «чем выше число, тем ниже поле» читаем как обычную сортировку по возрастанию.

Проверяем заполненность нового поля:

$res = CIBlockElement::GetList(['ID' => 'ASC'], ['IBLOCK_ID' => $listIblockId],
false, false, ['ID', 'NAME', 'PROPERTY_INN']);
while ($row = $res->GetNext()) {
if (empty($row['PROPERTY_INN_VALUE'])) {
printf("%-6d %s: поле пустое\n", $row['ID'], $row['NAME']);
}
}

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

Дозаполняем прежние записи кодом:

CIBlockElement::SetPropertyValuesEx($elementId, $listIblockId, [
'INN' => '7701234567', // коды полей регистрозависимы
'STATUS' => 113, // списочное поле принимает номер варианта
]);
CIBlock::clearIblockTagCache($listIblockId); // сам метод кеш не чистит

Метод пишет только переданные поля и не трогает остальные. Списочному полю передают номер варианта: по тексту варианта связь не установится, и значение молча останется пустым.

Набор полей общий для всего списка. Раздел его не сужает, поэтому разные наборы полей разводят по разным спискам, а не по разделам одного.

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

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

В привязке к сотруднику не находятся внешние пользователи.

Тип показывает пользователей портала, а экстранет в этот перечень не попадает. Под внешних пользователей пишут свой тип пользовательского поля.

Разным разделам списка нужны разные поля.

Набор полей общий для всего списка, и раздел его не сужает. Лишние поля убирают из формы флагом показа, а принципиально разные наборы разводят по разным спискам.

Значение числового поля удалили, а после сохранения оно вернулось.

Пустое поле формы не всегда доходит до хранилища как очистка значения. Значение снимают кодом, а у множественного поля очисткой считается false, а не пустой массив.

Маска ввода не вешается на поле формы списка.

У полей формы нет своего идентификатора ввода, и плагин по нему не цепляется. Маску вешают селектором поля или средствами ядра, а не правкой шаблона.

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

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

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

Можно ли поменять тип поля, когда в списке уже есть записи?

Смена типа перезагружает форму поля вместе с набором параметров, а значения разных типов хранятся по-своему. На заполненном списке безопаснее завести соседнее поле и перенести значения кодом.

Как вывести у каждого раздела списка только нужные поля?

Штатно никак: набор полей общий для всего списка. Лишние поля убирают из формы флагом показа, а принципиально разные наборы данных разводят по разным спискам.

Почему у поля не задаётся значение по умолчанию?

Оно доступно только полю с включённым флагом «Обязательное». Необязательному полю платформа задать значение по умолчанию не даёт вовсе.

Можно ли привязать в поле списка внешнего пользователя?

Нет, привязка к сотруднику показывает пользователей портала. Для экстранета придётся регистрировать свой тип пользовательского поля.

Как быстро проверить, что поля заполнены у всех записей?

Разово - выгрузкой в Excel из меню «Действия» списка. На регулярной проверке удобнее выборка по инфоблоку списка с кодами нужных полей.

Смежное

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