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