Почему в запросах динамических списков 1С отсутствует ключевое слово РАЗРЕШЕННЫЕ

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

При изучении типовых конфигураций, таких как 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия, многие разработчики замечают интересную особенность: в текстах запросов динамических списков практически никогда не встречается ключевое слово РАЗРЕШЕННЫЕ. В то же время, при написании обычных запросов в программном коде или в консоли запросов, отсутствие этого слова при включенном RLS (Record Level Security) приводит к ошибке доступа, если у пользователя недостаточно прав на чтение всех записей таблицы.

В этой статье мы подробно разберем внутреннюю логику платформы «1С:Предприятие 8», выясним, каким образом данные фильтруются «за кулисами», и проанализируем влияние этого механизма на производительность системы.

Природа динамического списка и автоматическое ограничение прав

Для начала проанализируем фундаментальное различие между объектом Запрос и объектом ДинамическийСписок. Главная задача динамического списка — обеспечить комфортную работу пользователя с большими массивами данных, не вызывая при этом критических ошибок интерфейса.

Рассмотрим стандартное поведение платформы: если мы выполним обычный запрос без слова РАЗРЕШЕННЫЕ под пользователем с ограниченными правами, платформа попытается прочитать все записи. Столкнувшись с первой же записью, на которую у пользователя нет прав, система выбросит исключение «Нарушение прав доступа». В случае с динамическим списком такое поведение было бы недопустимым, так как это привело бы к невозможности открыть форму списка.

Выясним причину: разработчики платформы изначально заложили в ДинамическийСписок логику, согласно которой режим РАЗРЕШЕННЫЕ включен по умолчанию и является неотключаемым. Это означает, что платформа самостоятельно модифицирует текст запроса перед его отправкой на СУБД, добавляя необходимые условия ограничения доступа.

Механизм работы RLS в динамических списках

Разберем по шагам, что происходит, когда динамический список подготавливает данные для отображения на экране:

  1. Платформа анализирует текст запроса, указанный в свойствах списка.
  2. Система проверяет наличие настроенных ограничений RLS для таблиц, участвующих в запросе.
  3. К основному тексту запроса автоматически добавляются условия WHERE (ГДЕ) или соединения JOIN, которые отсекают записи, запрещенные для текущего пользователя.
  4. Если в настройках списка указана ОсновнаяТаблица, платформа оптимизирует этот процесс, применяя ограничения максимально эффективно именно к этой таблице.

Посмотрим на пример того, как выглядит исходный запрос разработчика в конфигураторе:


ВЫБРАТЬ
    Ссылка,
    Дата,
    Номер,
    Партнер,
    СуммаДокумента
ИЗ
    Документ.ЗаказКлиента

А теперь проанализируем, во что этот запрос превращается на уровне СУБД (упрощенно), когда платформа накладывает ограничения RLS (например, по группе доступа партнеров):


SELECT
    T1.ID,
    T1.Date,
    T1.Number,
    T1.PartnerID,
    T1.Amount
FROM
    Document_SalesOrder T1
WHERE
    T1.PartnerID IN (SELECT AllowedID FROM AllowedPartnersTable WHERE UserID = @CurrentUserID)

Как мы видим, слово РАЗРЕШЕННЫЕ здесь не нужно в явном виде, так как платформа физически переписывает запрос, встраивая в него механизмы фильтрации.

Роль свойства «Основная таблица»

Важно понимать, что эффективность автоматического добавления условий RLS напрямую зависит от настройки ОсновнаяТаблица. Рассмотрим ситуацию, когда это свойство заполнено.

Когда указана основная таблица, платформа «понимает» контекст данных. Это позволяет ей не просто добавить РАЗРЕШЕННЫЕ, но и использовать специализированные механизмы выборки данных (порционность, динамическое считывание при прокрутке). Если же запрос является сложным (например, объединение нескольких таблиц без явной основной), платформе становится сложнее определить, к каким именно полям применять ограничения, что может привести к снижению производительности.

Практический совет: всегда старайтесь указывать основную таблицу в динамическом списке, если это технически возможно. Это гарантирует наиболее корректную и быструю работу механизмов защиты данных.

Производительный RLS и современные конфигурации

В современных решениях, таких как 1С:ERP 2.5 или 1С:Бухгалтерия 3.0, используется так называемый «производительный RLS». Рассмотрим подробнее, как он взаимодействует с динамическими списками.

В этом режиме данные об ограничениях прав доступа кэшируются в специальных вспомогательных таблицах (регистрах сведений). При формировании данных для списка платформа выполняет левое соединение основной таблицы с этими таблицами прав. В такой архитектуре использование слова РАЗРЕШЕННЫЕ в тексте самого запроса становится избыточным «мусором». Даже если вы добавите его вручную, оптимизатор платформы проигнорирует его, так как логика ограничения уже реализована на уровне встраивания условий соединения с таблицами прав.

Почему ручное добавление слова РАЗРЕШЕННЫЕ считается «дурным тоном»

Проанализируем причины, по которым опытные разработчики и стандарты «1С» рекомендуют избегать явного написания этого слова в динамических списках:

Однако, стоит отметить, что в некоторых тиражных решениях (например, от компании БИТ) это слово иногда встречается. Чаще всего это связано с тем, что запрос копировался из Консоли запросов, где слово РАЗРЕШЕННЫЕ было необходимо для тестирования выборки под ограниченными правами, и разработчик просто забыл его удалить при переносе в конфигуратор.

Влияние на скорость работы (Performance)

Существует миф, что наличие или отсутствие слова РАЗРЕШЕННЫЕ влияет на скорость работы списка. Выясним истинную причину замедлений.

Само по себе слово в тексте запроса не замедляет работу. Замедление происходит из-за сложности самих правил RLS. Когда платформа добавляет условия ограничения, итоговый SQL-запрос может вырасти в десятки раз, обрастая многочисленными JOIN и сложными условиями в секции WHERE. Именно поэтому проверку скорости работы динамических списков необходимо проводить под пользователем с неполными правами — именно в этом случае вы увидите реальную картину производительности с учетом наложенных ограничений.

Резюме

Подводя итог нашему анализу, можно выделить следующие ключевые моменты:

  1. Платформа 1С автоматически применяет режим РАЗРЕШЕННЫЕ ко всем динамическим спискам.
  2. Явное указание этого слова в тексте запроса динамического списка не требуется и является избыточным.
  3. Основной механизм ограничения данных в списках — автоматическая модификация запроса платформой на основе настроек RLS.
  4. Для обеспечения максимальной производительности при использовании RLS необходимо правильно указывать основную таблицу и использовать современные механизмы (производительный RLS).

Таким образом, отсутствие слова РАЗРЕШЕННЫЕ в типовых конфигурациях — это не ошибка и не упущение, а прямое следование архитектурным принципам платформы и стандартам разработки фирмы «1С».

← На главную