Универсальный список - настройка, права и вывод элементов
Заводим универсальный список, выдаём доступ сотрудникам и выводим его элементы на страницах сайта.
Решение
Смотрим заведённые списки и их инфоблоки:
use Bitrix\Main\Loader;
Loader::includeModule('lists');// тип lists - обычные списки, bitrix_processes - процессы с задачами$res = CIBlock::GetList([], ['CHECK_PERMISSIONS' => 'N', 'TYPE' => 'lists']);while ($iblock = $res->Fetch()) { printf("%-6s %-30s тип=%s\n", $iblock['ID'], $iblock['NAME'], $iblock['IBLOCK_TYPE_ID']);}Список - это инфоблок особого типа с другим интерфейсом редактирования. Его идентификатор пригодится для любого кода: выборки, импорт, вывод на сайте - всё это делается обычным API инфоблоков без единого метода модуля списков.
Добавляем поле списка:
$prop = new CIBlockProperty();$prop->Add([ 'IBLOCK_ID' => $listIblockId, 'NAME' => 'Ответственный', 'CODE' => 'RESPONSIBLE', 'PROPERTY_TYPE' => 'S', 'USER_TYPE' => 'UserID', // тип «привязка к пользователю»]);Поля списка - это обычные свойства инфоблока. Интерфейс списков показывает их своим способом и добавляет свои типы отображения, но хранятся и читаются они как самые обычные свойства элементов.
Выдаём доступ сотрудникам:
CIBlock::SetPermission($listIblockId, [ 5 => CListPermissions::CAN_READ, // группа только читает элементы 6 => CListPermissions::CAN_WRITE, // группа добавляет и правит]);// буквы прав у списка и у инфоблока одни и те же: R, W, X, DДоступ к элементам конкретного списка решается правами того инфоблока, который лежит под ним. У модуля есть и свой слой прав, но он про другое: задаёт, какие группы администрируют списки данного типа инфоблоков. Список, видимый только администратору, почти всегда упирается именно в права инфоблока.
Выводим элементы списка на сайте:
$res = CIBlockElement::GetList(['SORT' => 'ASC'], ['IBLOCK_ID' => $listIblockId, 'ACTIVE' => 'Y'], false, false, ['ID', 'NAME', 'PROPERTY_RESPONSIBLE']);while ($row = $res->GetNext()) { printf("%-30s %s\n", $row['NAME'], $row['PROPERTY_RESPONSIBLE_VALUE']);}// значение свойства читается из ключа с суффиксом VALUE, а не из кода поляСвоего публичного компонента у списков не существует: их интерфейс рассчитан на работу внутри портала. На страницы сайта элементы выводят обычной выборкой либо штатными компонентами инфоблоков, указав им идентификатор инфоблока списка.
Бизнес-процессы у элементов списка - основной сценарий его применения. Реестр заявок с согласованием собирается без единой строки кода: список задаёт поля, процесс задаёт маршрут, а права решают, кто что видит.
Списки удобны там, где справочник ведут сотрудники, а не разработчик: реестры документов, заявки, внутренние каталоги. Заводится такой список за минуты и не требует ни кода, ни правки шаблонов.
Ограничение у списков одно, зато существенное: их интерфейс заметно тяжелеет на больших объёмах данных. На десятках тысяч записей списки продолжают работать, но пользоваться ими становится неудобно, и справочник такого размера правильнее держать в highload-блоке со своим выводом.
Типичные проблемы
Список виден только администратору.
Группе не выданы права на инфоблок, который лежит под списком. Проверка прав модуля списков в итоге обращается именно к правам этого инфоблока.
Поле не появилось в форме элемента.
Оно заведено в инфоблоке, но не выведено в настройках списка. Интерфейс списка показывает только те поля, которые в нём включены.
Элементы не выводятся на сайте.
В выборке не указан идентификатор инфоблока списка. Списки не имеют своего публичного компонента.
Разделы списка видны не всем.
Права выданы на список, но не на его разделы. В расширенном режиме прав разделы наследуют доступ отдельно.
Интерфейс списка открывается медленно.
В списке десятки тысяч элементов. Интерфейс рассчитан на справочники, а не на большие массивы данных.
Частые вопросы
Можно ли перенести список в обычный инфоблок?
Данные уже лежат в инфоблоке: меняется только тип и интерфейс. После смены типа записи остаются на месте, а редактируются штатными формами инфоблоков.
Как получить элементы списка из кода?
Обычной выборкой по инфоблоку списка. Отдельного API у модуля для чтения элементов нет, и он не нужен.
Поддерживают ли списки бизнес-процессы?
Да, для элементов списка запускаются процессы модуля бизнес-процессов. Это и есть основной сценарий реестров заявок и согласований.
Чем список отличается от highload-блока?
Список хранит данные в инфоблоке и даёт готовый интерфейс, highload-блок - отдельную таблицу без интерфейса, зато быстрый на больших объёмах.
Смежное
-
Универсальный список не открывается или пуст: разбор причин - разбор пустого раздела списков
-
Универсальные списки на практике - оглавление подтемы
-
Универсальные списки - устройство модуля целиком
-
Инфоблоки - где на самом деле лежат данные
-
Highload-блоки - куда выносить большие справочники
-
Задача в бизнес-процессе: назначение, сроки, ответ участника - согласование записей реестра
-
Список как справочник: поля, права, вывод и наполнение - типовая причина завести список
-
Перенос универсального списка между стендами: структура, права, данные - как список уезжает на боевой сайт
-
Универсальный список изнутри: инфоблок, поля, права - что на самом деле создаётся при настройке
-
Поля универсального списка - как подобрать тип поля и его параметры