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