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