Готовишься к экзамену?
Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.
Пользователь работает под ролью, где для справочника «Номенклатура» настроены ограничения доступа **на уровне записей** (RLS). Что произойдет, если выполнить запрос без учета ограничений: «ВЫБРАТЬ * ИЗ Справочник.Номенклатура»?
Запрос выполнится и вернет всю номенклатуру, включая записи, которые пользователю видеть нельзя.
Неправильно: Ограничения на уровне записей предназначены именно для того, чтобы запретить чтение части строк конкретному пользователю. Если запрос попытается обратиться к запрещенным записям, платформа не должна «молча» показать их - это нарушение механизма безопасности.
Запрос выполнится, но в результат попадут только те элементы справочника, которые разрешены пользователю.
Неправильно: Такой «мягкий» режим (когда запрещенные строки просто отсекаются) включается при использовании конструкции «ВЫБРАТЬ РАЗРЕШЕННЫЕ …». Без ключевого слова РАЗРЕШЕННЫЕ запрос, обращающийся к потенциально запрещенным строкам, как правило приводит к ошибке доступа.
Появится ошибка прав доступа при выполнении запроса.
Правильно: При наличии RLS запрос «ВЫБРАТЬ * ИЗ Справочник.Номенклатура» пытается читать весь набор записей, включая те, которые ограничены текущей ролью. Если не использовать «РАЗРЕШЕННЫЕ» (или иной корректный способ учесть ограничения), платформа фиксирует попытку доступа к запрещенным данным и завершает выполнение ошибкой.
Пояснение
Ограничения доступа на уровне записей (RLS) в 1С задаются в ролях и формируют правило, какие строки таблиц (справочников, документов, регистров) пользователь может читать. Важно различать два сценария:
1) **Запрос без РАЗРЕШЕННЫЕ**. Если в процессе выполнения запроса происходит обращение к запрещенным данным, платформа не «фильтрует» их автоматически, а выдает ошибку прав доступа (часто это формулировки вроде «Недостаточно прав…»/«Нарушение прав доступа…»). В запросе «ВЫБРАТЬ * ИЗ Справочник.Номенклатура» ограничение почти гарантированно сработает, потому что чтение идет по всем элементам.
2) **Запрос с РАЗРЕШЕННЫЕ**. Если требуется получить данные в рамках прав пользователя без падения с ошибкой, в верхнем уровне запроса используют: «ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ Справочник.Номенклатура». Тогда запрещенные записи не попадают в результат, и запрос обычно выполняется успешно.
Практический пример: менеджер по продажам должен видеть только «свою» номенклатуру (по группе доступа/организации/сегменту). Если разработчик делает отчет запросом без РАЗРЕШЕННЫЕ, отчет может аварийно завершиться у пользователя. Правильная практика - либо применять «ВЫБРАТЬ РАЗРЕШЕННЫЕ» в отчетных запросах, либо добавлять такие условия отбора, которые гарантированно не затрагивают запрещенные строки (и понимать, что при изменении правил RLS это может перестать работать).
Дополнение: если по задумке нужно читать данные **в обход** прав (служебные фоновые расчеты, обмены, регламентные задания), обычно используют привилегированный режим или выполняют код под техническим пользователем - но это должно быть осознанным решением, иначе легко получить утечки данных или некорректные отчеты.