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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Многие разработчики сталкиваются с загадочной ситуацией: динамический список на управляемой форме работает исправно, отображая данные под любыми правами, однако стоит пользователю (не администратору) ввести хотя бы один символ в строку поиска, как список мгновенно становится абсолютно пустым. Под полными правами эта проблема не воспроизводится. Давайте подробно разберем, какие внутренние механизмы платформы 1С приводят к такому поведению и как это исправить.

Механизм автоматической модификации запроса «ВЫБРАТЬ РАЗРЕШЕННЫЕ»

Когда мы работаем с динамическим списком, платформа 1С автоматически добавляет в запрос ключевое слово РАЗРЕШЕННЫЕ. Это происходит неявно. Основная сложность заключается в том, как это слово взаимодействует с механизмом RLS (Record Level Security) при наличии соединений (JOIN) в произвольном запросе.

Проанализируем ситуацию: если в вашем запросе динамического списка используется ЛЕВОЕ СОЕДИНЕНИЕ с другой таблицей, на которую наложены ограничения прав доступа на уровне записей, система ведет себя следующим образом. Если текущий пользователь не имеет прав на чтение конкретной записи в присоединенной таблице, то при использовании ВЫБРАТЬ РАЗРЕШЕННЫЕ вся результирующая строка (включая данные основной таблицы) может быть исключена из выборки. Это происходит потому, что платформа не может гарантировать целостность данных «разрешенного» результата, если часть условий соединения попадает под запрет RLS.

Влияние строки поиска на выполнение запроса

Рассмотрим подробнее, что происходит в момент ввода текста в строку поиска. Платформа 1С динамически модифицирует текст запроса динамического списка. Она добавляет условие ГДЕ, в котором перечисляет все поля, доступные для поиска, связывая их через оператор ПОДОБНО или используя механизмы полнотекстового поиска.

Пример модифицированного условия может выглядеть так:


ГДЕ (ДокументОбъект.Номер ПОДОБНО %ТекстПоиска%)
ИЛИ (СвязаннаяТаблица.Наименование ПОДОБНО %ТекстПоиска%)

Если в СвязаннаяТаблица настроен RLS, который ограничивает доступ к записям, то при попытке обращения к полю СвязаннаяТаблица.Наименование в рамках поиска, весь запрос под ограниченными правами может вернуть пустой результат, так как система безопасности блокирует доступ к строкам, не проходящим фильтр. Даже если визуально колонка в списке пустая или скрыта, она всё равно может участвовать в формировании условий поиска, если включено «Автозаполнение доступных полей».

Проблема иерархии и прав доступа

Еще одна причина «чистого листа» — работа с иерархическими данными. В 1С существует особенность: если включен иерархический просмотр (дерево или иерархический список), система пытается построить дерево от родительских элементов к дочерним.

Проанализируем ситуацию с правами: если у пользователя есть права на конкретный элемент, но нет прав на его родителя (группу), то при включенной иерархии элемент может не отобразиться. При использовании поиска платформа часто переключает режим отображения в «плоский список», но если логика RLS жестко завязана на иерархическую структуру (например, проверка прав по полю Родитель), то результат поиска окажется пустым. Рекомендуется временно отключить иерархию в настройках списка, чтобы проверить, не в ней ли кроется причина.

Полнотекстовый поиск и его индексы

Начиная с версии платформы 8.3.15, строка поиска в динамических списках по умолчанию может использовать механизм полнотекстового поиска (ППС). Выясним причину, почему это важно:

  1. Актуальность индекса: Если индекс ППС не обновлен, поиск может не находить новые данные.
  2. Права на ППС: У пользователя может отсутствовать роль «Полнотекстовый поиск». В этом случае система может попытаться переключиться на стандартный поиск через SQL, который из-за неоптимальных условий RLS и больших объемов данных может «отваливаться» по таймауту или возвращать пустой результат.
  3. Разница в правах: Под полными правами поиск часто идет напрямую в базу данных, игнорируя индекс ППС, в то время как для обычных пользователей платформа строго следует правилам безопасности.

Методика диагностики и решения проблемы

Если вы столкнулись с тем, что поиск под неполными правами выдает пустой результат, выполните следующие шаги по шагам:

  1. Проверка через консоль запросов: Запустите «Консоль запросов» именно под тем пользователем, у которого возникает проблема. Скопируйте текст запроса из динамического списка и добавьте в него условия поиска вручную. Это позволит увидеть, возвращает ли база данные вообще.
  2. Анализ RLS связанных таблиц: Выясните, какие таблицы участвуют в соединениях (JOIN). Попробуйте поочередно исключать связанные таблицы из запроса динамического списка. Как только список при поиске начнет показывать данные — вы нашли «проблемную» таблицу с RLS.
  3. Проверка прав «Просмотр»: Убедитесь, что у пользователя есть не только право Чтение, но и право Просмотр на все реквизиты, участвующие в поиске. Если право на просмотр реквизита отсутствует, платформа может некорректно строить динамическое условие поиска.
  4. Использование SQL Profiler: Если вы работаете с клиент-серверным вариантом, посмотрите через профайлер, какой именно SQL-запрос уходит на сервер. Вы увидите огромную конструкцию, которую 1С генерирует для RLS. Часто там можно заметить условия WHERE 1=0 или WHERE 0=1, которые вставляются платформой при нарушении прав доступа.
  5. Очистка кэша: Иногда проблема кроется в кэше метаданных. Попробуйте очистить серверный кэш и обновить индекс полнотекстового поиска через УправлениеПолнотекстовымПоиском.

Заключение

В большинстве случаев проблема «загадки динамического списка» решается исправлением запроса. Постарайтесь избегать сложных соединений с таблицами, на которые наложены жесткие ограничения RLS, или используйте вместо произвольного запроса основную таблицу, если это возможно. Помните, что поиск в 1С — это не просто фильтрация видимых строк, а полная пересборка SQL-запроса с учетом всей политики безопасности системы.

← На главную