Многие разработчики сталкиваются с загадочной ситуацией: динамический список на управляемой форме работает исправно, отображая данные под любыми правами, однако стоит пользователю (не администратору) ввести хотя бы один символ в строку поиска, как список мгновенно становится абсолютно пустым. Под полными правами эта проблема не воспроизводится. Давайте подробно разберем, какие внутренние механизмы платформы 1С приводят к такому поведению и как это исправить.
Когда мы работаем с динамическим списком, платформа 1С автоматически добавляет в запрос ключевое слово РАЗРЕШЕННЫЕ. Это происходит неявно. Основная сложность заключается в том, как это слово взаимодействует с механизмом RLS (Record Level Security) при наличии соединений (JOIN) в произвольном запросе.
Проанализируем ситуацию: если в вашем запросе динамического списка используется ЛЕВОЕ СОЕДИНЕНИЕ с другой таблицей, на которую наложены ограничения прав доступа на уровне записей, система ведет себя следующим образом. Если текущий пользователь не имеет прав на чтение конкретной записи в присоединенной таблице, то при использовании ВЫБРАТЬ РАЗРЕШЕННЫЕ вся результирующая строка (включая данные основной таблицы) может быть исключена из выборки. Это происходит потому, что платформа не может гарантировать целостность данных «разрешенного» результата, если часть условий соединения попадает под запрет RLS.
Рассмотрим подробнее, что происходит в момент ввода текста в строку поиска. Платформа 1С динамически модифицирует текст запроса динамического списка. Она добавляет условие ГДЕ, в котором перечисляет все поля, доступные для поиска, связывая их через оператор ПОДОБНО или используя механизмы полнотекстового поиска.
Пример модифицированного условия может выглядеть так:
ГДЕ (ДокументОбъект.Номер ПОДОБНО %ТекстПоиска%)
ИЛИ (СвязаннаяТаблица.Наименование ПОДОБНО %ТекстПоиска%)
Если в СвязаннаяТаблица настроен RLS, который ограничивает доступ к записям, то при попытке обращения к полю СвязаннаяТаблица.Наименование в рамках поиска, весь запрос под ограниченными правами может вернуть пустой результат, так как система безопасности блокирует доступ к строкам, не проходящим фильтр. Даже если визуально колонка в списке пустая или скрыта, она всё равно может участвовать в формировании условий поиска, если включено «Автозаполнение доступных полей».
Еще одна причина «чистого листа» — работа с иерархическими данными. В 1С существует особенность: если включен иерархический просмотр (дерево или иерархический список), система пытается построить дерево от родительских элементов к дочерним.
Проанализируем ситуацию с правами: если у пользователя есть права на конкретный элемент, но нет прав на его родителя (группу), то при включенной иерархии элемент может не отобразиться. При использовании поиска платформа часто переключает режим отображения в «плоский список», но если логика RLS жестко завязана на иерархическую структуру (например, проверка прав по полю Родитель), то результат поиска окажется пустым. Рекомендуется временно отключить иерархию в настройках списка, чтобы проверить, не в ней ли кроется причина.
Начиная с версии платформы 8.3.15, строка поиска в динамических списках по умолчанию может использовать механизм полнотекстового поиска (ППС). Выясним причину, почему это важно:
Если вы столкнулись с тем, что поиск под неполными правами выдает пустой результат, выполните следующие шаги по шагам:
Чтение, но и право Просмотр на все реквизиты, участвующие в поиске. Если право на просмотр реквизита отсутствует, платформа может некорректно строить динамическое условие поиска.WHERE 1=0 или WHERE 0=1, которые вставляются платформой при нарушении прав доступа.УправлениеПолнотекстовымПоиском.В большинстве случаев проблема «загадки динамического списка» решается исправлением запроса. Постарайтесь избегать сложных соединений с таблицами, на которые наложены жесткие ограничения RLS, или используйте вместо произвольного запроса основную таблицу, если это возможно. Помните, что поиск в 1С — это не просто фильтрация видимых строк, а полная пересборка SQL-запроса с учетом всей политики безопасности системы.