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

Универсальный список - настройка, права и вывод элементов

Заводим универсальный список, выдаём доступ сотрудникам и выводим его элементы на страницах сайта.

Решение

Смотрим заведённые списки и их инфоблоки:

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-блок - отдельную таблицу без интерфейса, зато быстрый на больших объёмах.

Смежное

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