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